[
  {
    "path": ".gitignore",
    "content": ".vs\npackages/\nx64/\nx86/\nDebug/\nRelease/\n"
  },
  {
    "path": "DirectXHook.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.31205.134\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"DirectXHook\", \"DirectXHook.vcxproj\", \"{5EB93C8A-65BB-403D-A8B5-A39FCF98F17F}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|x64 = Debug|x64\n\t\tDebug|x86 = Debug|x86\n\t\tRelease|x64 = Release|x64\n\t\tRelease|x86 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{5EB93C8A-65BB-403D-A8B5-A39FCF98F17F}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{5EB93C8A-65BB-403D-A8B5-A39FCF98F17F}.Debug|x64.Build.0 = Debug|x64\n\t\t{5EB93C8A-65BB-403D-A8B5-A39FCF98F17F}.Debug|x86.ActiveCfg = Debug|Win32\n\t\t{5EB93C8A-65BB-403D-A8B5-A39FCF98F17F}.Debug|x86.Build.0 = Debug|Win32\n\t\t{5EB93C8A-65BB-403D-A8B5-A39FCF98F17F}.Release|x64.ActiveCfg = Release|x64\n\t\t{5EB93C8A-65BB-403D-A8B5-A39FCF98F17F}.Release|x64.Build.0 = Release|x64\n\t\t{5EB93C8A-65BB-403D-A8B5-A39FCF98F17F}.Release|x86.ActiveCfg = Release|Win32\n\t\t{5EB93C8A-65BB-403D-A8B5-A39FCF98F17F}.Release|x86.Build.0 = Release|Win32\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {B1B72F8D-E60B-4269-AC0B-EAC732492566}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "DirectXHook.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>16.0</VCProjectVersion>\n    <Keyword>Win32Proj</Keyword>\n    <ProjectGuid>{5eb93c8a-65bb-403d-a8b5-a39fcf98f17f}</ProjectGuid>\n    <RootNamespace>DirectXHook</RootNamespace>\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v143</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v143</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v143</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v143</PlatformToolset>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\" />\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <LinkIncremental>false</LinkIncremental>\n    <TargetName>dinput8</TargetName>\n    <IncludePath>$(SolutionDir)overlays;$(SolutionDir)include;$(IncludePath)</IncludePath>\n    <SourcePath>$(SolutionDir)overlays;$(SolutionDir)src</SourcePath>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <LinkIncremental>false</LinkIncremental>\n    <TargetName>dinput8</TargetName>\n    <IncludePath>$(SolutionDir)overlays;$(SolutionDir)include;$(IncludePath)</IncludePath>\n    <SourcePath>$(SolutionDir)overlays;$(SolutionDir)src</SourcePath>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <LinkIncremental>false</LinkIncremental>\n    <IncludePath>$(SolutionDir)overlays;$(SolutionDir)include;$(IncludePath)</IncludePath>\n    <SourcePath>$(SolutionDir)overlays;$(SolutionDir)src</SourcePath>\n    <TargetName>dinput8</TargetName>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <LinkIncremental>false</LinkIncremental>\n    <IncludePath>$(SolutionDir)overlays;$(SolutionDir)include;$(IncludePath)</IncludePath>\n    <SourcePath>$(SolutionDir)overlays;$(SolutionDir)src</SourcePath>\n    <TargetExt>.dll</TargetExt>\n    <TargetName>dinput8</TargetName>\n    <PostBuildEventUseInBuild>true</PostBuildEventUseInBuild>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\n      <LanguageStandard>stdcpp17</LanguageStandard>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <ModuleDefinitionFile>\n      </ModuleDefinitionFile>\n      <AdditionalDependencies>d3d11.lib;d3d12.lib;d3dcompiler.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n    <PostBuildEvent>\n      <Command>\n      </Command>\n    </PostBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING;NDEBUG;_CONSOLE</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\n      <LanguageStandard>stdcpp17</LanguageStandard>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <GenerateDebugInformation>false</GenerateDebugInformation>\n      <ModuleDefinitionFile>\n      </ModuleDefinitionFile>\n      <AdditionalDependencies>d3d11.lib;d3d12.lib;d3dcompiler.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n    <PostBuildEvent>\n      <Command>\n      </Command>\n    </PostBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions);_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <LanguageStandard>stdcpp17</LanguageStandard>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <ModuleDefinitionFile>\n      </ModuleDefinitionFile>\n      <AdditionalDependencies>d3d11.lib;d3d12.lib;d3dcompiler.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n    <PostBuildEvent>\n      <Command>COPY \"C:\\Programming\\Github repositories\\DirectXHook\\x64\\Release\\dinput8.dll\" \"G:\\SteamLibrary\\steamapps\\common\\MonsterHunterRise\\reframework\\plugins\\RiseDpsMeter.dll\"</Command>\n    </PostBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING;NDEBUG;_CONSOLE</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\n      <LanguageStandard>stdcpp17</LanguageStandard>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <GenerateDebugInformation>false</GenerateDebugInformation>\n      <ModuleDefinitionFile>\n      </ModuleDefinitionFile>\n      <AdditionalDependencies>d3d11.lib;d3d12.lib;d3dcompiler.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n    <PostBuildEvent>\n      <Command>COPY \"C:\\Programming\\Github repositories\\DirectXHook\\x64\\Release\\dinput8.dll\" \"F:\\SteamLibrary\\steamapps\\common\\ELDEN RING\\Game\\dinput8.dll\"\nXCOPY /y \"C:\\Programming\\Github repositories\\DirectXHook\\assets\\hook_textures\" \"F:\\SteamLibrary\\steamapps\\common\\ELDEN RING\\Game\\hook_textures\\\"\nXCOPY /y \"C:\\Programming\\Github repositories\\DirectXHook\\assets\\hook_fonts\" \"F:\\SteamLibrary\\steamapps\\common\\ELDEN RING\\Game\\hook_fonts\\\"</Command>\n    </PostBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"overlays\\Example\\Example.cpp\">\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</ExcludedFromBuild>\n    </ClCompile>\n    <ClCompile Include=\"overlays\\PauseTheGame\\PauseTheGame.cpp\">\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</ExcludedFromBuild>\n    </ClCompile>\n    <ClCompile Include=\"overlays\\RiseDpsMeter\\RiseDpsMeter.cpp\" />\n    <ClCompile Include=\"src\\DirectXHook.cpp\" />\n    <ClCompile Include=\"src\\DllMain.cpp\" />\n    <ClCompile Include=\"src\\Renderer.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <FxCompile Include=\"src\\Shaders.hlsl\">\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">true</ExcludedFromBuild>\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">true</ExcludedFromBuild>\n    </FxCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"include\\DirectXHook.h\" />\n    <ClInclude Include=\"include\\ID3DRenderer.h\" />\n    <ClInclude Include=\"include\\IRenderCallback.h\" />\n    <ClInclude Include=\"include\\Logger.h\" />\n    <ClInclude Include=\"include\\MemoryUtils.h\" />\n    <ClInclude Include=\"include\\OverlayFramework.h\" />\n    <ClInclude Include=\"include\\Renderer.h\" />\n    <ClInclude Include=\"include\\UniversalProxyDLL.h\" />\n    <ClInclude Include=\"overlays\\Example\\Example.h\">\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</ExcludedFromBuild>\n    </ClInclude>\n    <ClInclude Include=\"overlays\\PauseTheGame\\PauseTheGame.h\">\n      <ExcludedFromBuild Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</ExcludedFromBuild>\n    </ClInclude>\n    <ClInclude Include=\"overlays\\RiseDpsMeter\\RiseDpsMeter.h\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n    <Import Project=\"packages\\directxtk_desktop_2017.2020.11.12.1\\build\\native\\directxtk_desktop_2017.targets\" Condition=\"Exists('packages\\directxtk_desktop_2017.2020.11.12.1\\build\\native\\directxtk_desktop_2017.targets')\" />\n  </ImportGroup>\n  <Target Name=\"EnsureNuGetPackageBuildImports\" BeforeTargets=\"PrepareForBuild\">\n    <PropertyGroup>\n      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>\n    </PropertyGroup>\n    <Error Condition=\"!Exists('packages\\Microsoft.XAudio2.Redist.1.2.8\\build\\native\\Microsoft.XAudio2.Redist.targets')\" Text=\"$([System.String]::Format('$(ErrorText)', 'packages\\Microsoft.XAudio2.Redist.1.2.8\\build\\native\\Microsoft.XAudio2.Redist.targets'))\" />\n    <Error Condition=\"!Exists('packages\\directxtk_desktop_2017.2020.11.12.1\\build\\native\\directxtk_desktop_2017.targets')\" Text=\"$([System.String]::Format('$(ErrorText)', 'packages\\directxtk_desktop_2017.2020.11.12.1\\build\\native\\directxtk_desktop_2017.targets'))\" />\n  </Target>\n</Project>"
  },
  {
    "path": "DirectXHook.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Overlays\">\n      <UniqueIdentifier>{4e722490-89b1-476c-8f11-f855725e5074}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Overlays\\Example\">\n      <UniqueIdentifier>{8a12ed8f-5e32-450f-8ec9-985d3e5cde32}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Overlays\\RiseDpsMeter\">\n      <UniqueIdentifier>{f65c6413-9861-46d0-ac93-cc3206db7958}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Overlays\\PauseTheGame\">\n      <UniqueIdentifier>{49480136-b55a-468a-b6ab-1720b97d7141}</UniqueIdentifier>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"src\\DirectXHook.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\DllMain.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\Renderer.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"overlays\\Example\\Example.cpp\">\n      <Filter>Overlays\\Example</Filter>\n    </ClCompile>\n    <ClCompile Include=\"overlays\\PauseTheGame\\PauseTheGame.cpp\">\n      <Filter>Overlays\\PauseTheGame</Filter>\n    </ClCompile>\n    <ClCompile Include=\"overlays\\RiseDpsMeter\\RiseDpsMeter.cpp\">\n      <Filter>Overlays\\RiseDpsMeter</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <FxCompile Include=\"src\\Shaders.hlsl\">\n      <Filter>Source Files</Filter>\n    </FxCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"include\\DirectXHook.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"include\\IRenderCallback.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"include\\Logger.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"include\\MemoryUtils.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"include\\OverlayFramework.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"include\\Renderer.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"overlays\\Example\\Example.h\">\n      <Filter>Overlays\\Example</Filter>\n    </ClInclude>\n    <ClInclude Include=\"overlays\\RiseDpsMeter\\RiseDpsMeter.h\">\n      <Filter>Overlays\\RiseDpsMeter</Filter>\n    </ClInclude>\n    <ClInclude Include=\"overlays\\PauseTheGame\\PauseTheGame.h\">\n      <Filter>Overlays\\PauseTheGame</Filter>\n    </ClInclude>\n    <ClInclude Include=\"include\\ID3DRenderer.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"include\\UniversalProxyDLL.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "DirectXHook.vcxproj.user",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"Current\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <LocalDebuggerCommand>G:\\SteamLibrary\\steamapps\\common\\ELDEN RING\\Game\\eldenring.exe</LocalDebuggerCommand>\n    <LocalDebuggerAttach>true</LocalDebuggerAttach>\n    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <LocalDebuggerCommand>G:\\SteamLibrary\\steamapps\\common\\ELDEN RING\\Game\\eldenring.exe</LocalDebuggerCommand>\n    <LocalDebuggerAttach>true</LocalDebuggerAttach>\n    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <LocalDebuggerCommand>G:\\SteamLibrary\\steamapps\\common\\ELDEN RING\\Game\\eldenring.exe</LocalDebuggerCommand>\n    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>\n    <LocalDebuggerAttach>true</LocalDebuggerAttach>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <LocalDebuggerCommand>G:\\SteamLibrary\\steamapps\\common\\ELDEN RING\\Game\\eldenring.exe</LocalDebuggerCommand>\n    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>\n    <LocalDebuggerAttach>true</LocalDebuggerAttach>\n  </PropertyGroup>\n</Project>"
  },
  {
    "path": "README.md",
    "content": "## DirectXHook + Overlay Framework\nA DirectX hook that works with DirectX11 and DirectX12 in 32-bit and 64-bit modes. \n\nBasically this library lets you render your own things inside the game window, as an integrated part of the game rather than as an external overlay. A straightforward but primitive overlay framework is included so you can quickly and easily start creating overlays. Tutorial below.\n\n### This library is used in...\n#### A mod for Elden Ring, [\"First Person Souls - Full Game Conversion found on NexusMods\"](https://www.nexusmods.com/eldenring/mods/3266)\n\n[![First Person Souls](https://github.com/techiew/DirectXHook/blob/master/assets/repo_pictures/er_first_person_souls.png)](https://www.youtube.com/watch?v=nuau_lZ0Imc)\n\n#### A mod for Elden Ring, [\"Pause the game\" found on NexusMods](https://www.nexusmods.com/eldenring/mods/43)\n\n[![Pause the Game](https://github.com/techiew/DirectXHook/blob/master/assets/repo_pictures/er_pause_the_game.png)](https://www.youtube.com/watch?v=xvK1ti_hHh4)\n\n#### A mod for Monster Hunter Rise, [\"Rise DPS Meter\" found on NexusMods](https://www.nexusmods.com/monsterhunterrise/mods/289)\n\n-video to be added-\n\n#### Example triangle\n\n-video to be added-\n\n## How to create an overlay\nFirst, check the [wiki page](https://github.com/techiew/DirectXHook/wiki/How-to-set-up-the-Visual-Studio-solution) on how to quickly set up the Visual Studio solution.\n\nWhen the project is built, \"dinput8.dll\" will be generated in the project folder. This must be copied next to a game executable which uses DirectX 11 or 12. The game will then load the .dll automatically on startup and will render what you told it to.\n\nAlso note that the \"hook_textures\" folder containing \"blank.jpg\" must be present next to dxgi.dll in order for anything to render.\n\n### Create files\nCreate a .cpp and .h file in the Overlays folder (optionally put these inside a parent folder):\n\n![create_files](https://github.com/techiew/DirectXHook/blob/master/assets/repo_pictures/create_files.png)\n\nCreate a class that inherits from the IRenderCallback interface and includes \"OverlayFramework.h\":\n\n![example_header](https://github.com/techiew/DirectXHook/blob/master/assets/repo_pictures/example_header.png)\n\nDefine the Setup() and Render() functions in the .cpp file:\n\n![example_source](https://github.com/techiew/DirectXHook/blob/master/assets/repo_pictures/example_source.png)\n\n**Note: Setup() is called once and Render() is called every frame. InitFramework() must be called on the very first line in Setup().**\n\nMake the hook render your stuff by adding these lines in DllMain.cpp:\n\n![dllmain](https://github.com/techiew/DirectXHook/blob/master/assets/repo_pictures/dllmain.png)\n\nBut we have yet to define anything to render...\n\n### Boxes\nAll rendering with the overlay framework is done using Boxes:\n\n![box_struct](https://github.com/techiew/DirectXHook/blob/master/assets/repo_pictures/box_struct.png)\n\nBoxes are a simple struct with data that the framework manages.\n\n- **pressed** = if the mouse is currently being pressed on this box\n- **clicked** = if the mouse was previously pressed and then released on the box this frame\n- **hover** = if the mouse is hovering over the box\n\nThe rest are self-explanatory. Do not modify **visible** or **z**.\n\nCreate some boxes and render them:\n\n![rgb_boxes_code](https://github.com/techiew/DirectXHook/blob/master/assets/repo_pictures/rgb_boxes_code.png)\n\nResult:\n\n![rgb_boxes](https://github.com/techiew/DirectXHook/blob/master/assets/repo_pictures/rgb_boxes.png)\n\nBoxes can be rendered with either textures or colors:\n\n![textures_code](https://github.com/techiew/DirectXHook/blob/master/assets/repo_pictures/textures_code.png)\n\n**Note: textures should be loaded in Setup().**\n\nResult:\n\n![textures](https://github.com/techiew/DirectXHook/blob/master/assets/repo_pictures/textures.png)\n\nText can be rendered inside Boxes:\n\n![text_code](https://github.com/techiew/DirectXHook/blob/master/assets/repo_pictures/text_code.png)\n\n**Note: a font must be set before rendering text.**\n\nResult:\n\n![text](https://github.com/techiew/DirectXHook/blob/master/assets/repo_pictures/text.png)\n\n### Contributions\nFeel free to create issues or contribute code to the repo.\n\n### License\nFeel free to use this code for anything and however you like, but if you create something with it then it would be cool if you could show me what you made :)\n\n"
  },
  {
    "path": "include/DirectXHook.h",
    "content": "#pragma once\n\n#include <d3d11.h>\n#include <d3d12.h>\n#include <Windows.h>\n\n#include \"Renderer.h\"\n#include \"ID3DRenderer.h\"\n#include \"IRenderCallback.h\"\n#include \"Logger.h\"\n#include \"MemoryUtils.h\"\n\n/*\n* Here we have typedefs of the functions we want to hook.\n* They are defined so we can call the respective functions through pointers to their memory addresses.\n*\n* Setting the proper calling convention is important (__stdcall).\n* It makes it so the function arguments are read/written to/from memory in the correct way.\n* 64-bit functions actually use the __fastcall calling convention, but the compiler changes\n* __stdcall to __fastcall automatically for 64-bit compilation.\n*/\ntypedef HRESULT(__stdcall* Present)(IDXGISwapChain* This, UINT SyncInterval, UINT Flags);\ntypedef HRESULT(__stdcall* ResizeBuffers)(IDXGISwapChain* This, UINT BufferCount, UINT Width, UINT Height, DXGI_FORMAT NewFormat, UINT SwapChainFlags);\ntypedef void(__stdcall* ExecuteCommandLists)(ID3D12CommandQueue* This, UINT NumCommandLists, const ID3D12CommandList** ppCommandLists);\n\n// Hooks DirectX 11 and DirectX 12\nclass DirectXHook\n{\npublic:\n\tID3DRenderer* renderer;\n\tuintptr_t executeCommandListsAddress = 0;\n\tuintptr_t presentReturnAddress = 0;\n\tuintptr_t resizeBuffersReturnAddress = 0;\n\tuintptr_t executeCommandListsReturnAddress = 0;\n\n\tDirectXHook(ID3DRenderer* renderer);\n\tvoid Hook();\n\tvoid SetDrawExampleTriangle(bool doDraw);\n\tvoid AddRenderCallback(IRenderCallback* object);\n\tID3D12CommandQueue* CreateDummyCommandQueue();\n\tvoid HookCommandQueue(ID3D12CommandQueue* dummyCommandQueue, uintptr_t executeCommandListsDetourFunction, uintptr_t* executeCommandListsReturnAddress);\n\tvoid UnhookCommandQueue();\n\nprivate:\n\tLogger logger{ \"DirectXHook\" };\n\n\tIDXGISwapChain* CreateDummySwapChain();\n\tvoid HookSwapChain(IDXGISwapChain* dummySwapChain, uintptr_t presentDetourFunction, uintptr_t resizeBuffersDetourFunction, uintptr_t* presentReturnAddress, uintptr_t* resizeBuffersReturnAddress);\n};"
  },
  {
    "path": "include/ID3DRenderer.h",
    "content": "#pragma once\n\n#include <d3d11.h>\n\n#include \"IRenderCallback.h\"\n\nclass ID3DRenderer\n{\npublic:\n\tvirtual void OnPresent(IDXGISwapChain* pThis, UINT syncInterval, UINT flags) = 0;\n\tvirtual void OnResizeBuffers(IDXGISwapChain* pThis, UINT bufferCount, UINT width, UINT height, DXGI_FORMAT newFormat, UINT swapChainFlags) {};\n\tvirtual void AddRenderCallback(IRenderCallback* object) {};\n\tvirtual void SetCommandQueue(ID3D12CommandQueue* commandQueue) {};\n\tvirtual void SetGetCommandQueueCallback(void (*callback)()) {};\n};"
  },
  {
    "path": "include/IRenderCallback.h",
    "content": "#pragma once\n\n#include <d3d11.h>\n#include <wrl/client.h>\n#include <SpriteBatch.h>\n#include <SpriteFont.h>\n\nclass IRenderCallback\n{\npublic:\n\tvirtual void Setup() { };\n\tvirtual void Render() = 0;\n\tvoid Init(\n\t\tMicrosoft::WRL::ComPtr<ID3D11Device> device,\n\t\tMicrosoft::WRL::ComPtr<ID3D11DeviceContext> context,\n\t\tstd::shared_ptr<DirectX::SpriteBatch> spriteBatch,\n\t\tHWND window)\n\t{\n\t\tthis->device = device;\n\t\tthis->context = context;\n\t\tthis->spriteBatch = spriteBatch;\n\t\tthis->window = window;\n\t}\n\nprotected:\n\tMicrosoft::WRL::ComPtr<ID3D11Device> device = nullptr;\n\tMicrosoft::WRL::ComPtr<ID3D11DeviceContext> context = nullptr;\n\tstd::shared_ptr<DirectX::SpriteBatch> spriteBatch = nullptr;\n\tHWND window = NULL;\n};"
  },
  {
    "path": "include/Logger.h",
    "content": "#pragma once\n\n#include <string>\n#include <cstdarg>\n\nclass Logger\n{\npublic:\n\tLogger(const char* prefix)\n\t{\n\t\tprintPrefix = prefix;\n\n\t\tFILE* logFile = GetLogFile();\n\t\tif (logFile == nullptr)\n\t\t{\n\t\t\tfopen_s(&logFile, \"hook_log.txt\", \"w\");\n\t\t\tGetLogFile(logFile);\n\t\t}\n\t}\n\n\tvoid Log(std::string msg, ...)\n\t{\n\t\tva_list args;\n\t\tva_start(args, msg);\n\t\tvprintf(std::string(printPrefix + \" > \" + msg + \"\\n\").c_str(), args);\n\t\tif (GetLogFile() != nullptr)\n\t\t{\n\t\t\tvfprintf(GetLogFile(), std::string(printPrefix + \" > \" + msg + \"\\n\").c_str(), args);\n\t\t\tfflush(GetLogFile());\n\t\t}\n\t\tva_end(args);\n\t}\n\nprivate:\n\tstd::string printPrefix = \"\";\n\n\tstatic FILE* GetLogFile(FILE* newLogFile = nullptr)\n\t{\n\t\tstatic FILE* logFile = nullptr;\n\t\tif (newLogFile != nullptr)\n\t\t{\n\t\t\tlogFile = newLogFile;\n\t\t}\n\t\treturn logFile;\n\t}\n};"
  },
  {
    "path": "include/MemoryUtils.h",
    "content": "#pragma once\n\n#include <Windows.h>\n#include <map>\n#include <vector>\n#include <Windows.h>\n#include <Psapi.h>\n#include <sstream>\n#include <unordered_map>\n#include <iomanip>\n\n#define NMD_ASSEMBLY_IMPLEMENTATION\n#define NMD_ASSEMBLY_PRIVATE\n#include \"nmd_assembly.h\"\n\n#include \"Logger.h\"\n\n// Contains various memory manipulation functions related to hooking or modding\nnamespace MemoryUtils\n{\n\tstatic Logger logger{ \"MemoryUtils\" };\n\tstatic constexpr int maskBytes = 0xffff;\n\t\n\tstruct HookInformation\n\t{\n\t\tstd::vector<unsigned char> originalBytes = { 0 };\n\t\tuintptr_t trampolineInstructionsAddress = 0;\n\t};\n\tstatic std::unordered_map<uintptr_t, HookInformation> InfoBufferForHookedAddresses;\n\n\t// Disables or enables the memory protection in a given region. \n\t// Remembers and restores the original memory protection type of the given addresses.\n\tstatic void ToggleMemoryProtection(bool enableProtection, uintptr_t address, size_t size)\n\t{\n\t\tstatic std::map<uintptr_t, DWORD> protectionHistory;\n\t\tif (enableProtection && protectionHistory.find(address) != protectionHistory.end())\n\t\t{\n\t\t\tVirtualProtect((void*)address, size, protectionHistory[address], &protectionHistory[address]);\n\t\t\tprotectionHistory.erase(address);\n\t\t}\n\t\telse if (!enableProtection && protectionHistory.find(address) == protectionHistory.end())\n\t\t{\n\t\t\tDWORD oldProtection = 0;\n\t\t\tVirtualProtect((void*)address, size, PAGE_EXECUTE_READWRITE, &oldProtection);\n\t\t\tprotectionHistory[address] = oldProtection;\n\t\t}\n\t}\n\n\t// Copies memory after changing the permissions at both the source and destination so we don't get an access violation.\n\tstatic void MemCopy(uintptr_t destination, uintptr_t source, size_t numBytes)\n\t{\n\t\tToggleMemoryProtection(false, destination, numBytes);\n\t\tToggleMemoryProtection(false, source, numBytes);\n\t\tmemcpy((void*)destination, (void*)source, numBytes);\n\t\tToggleMemoryProtection(true, source, numBytes);\n\t\tToggleMemoryProtection(true, destination, numBytes);\n\t}\n\n\t// Simple wrapper around memset\n\tstatic void MemSet(uintptr_t address, unsigned char byte, size_t numBytes)\n\t{\n\t\tToggleMemoryProtection(false, address, numBytes);\n\t\tmemset((void*)address, byte, numBytes);\n\t\tToggleMemoryProtection(true, address, numBytes);\n\t}\n\n\t// Gets the base address of the game's memory.\n\tstatic uintptr_t GetProcessBaseAddress(DWORD processId)\n\t{\n\t\tDWORD_PTR baseAddress = 0;\n\t\tHANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processId);\n\n\t\tif (processHandle)\n\t\t{\n\t\t\tDWORD bytesRequired = 0;\n\t\t\tif (EnumProcessModules(processHandle, NULL, 0, &bytesRequired))\n\t\t\t{\n\t\t\t\tif (bytesRequired)\n\t\t\t\t{\n\t\t\t\t\tLPBYTE moduleArrayBytes = (LPBYTE)LocalAlloc(LPTR, bytesRequired);\n\t\t\t\t\tif (moduleArrayBytes)\n\t\t\t\t\t{\n\t\t\t\t\t\tHMODULE* moduleArray = (HMODULE*)moduleArrayBytes;\n\t\t\t\t\t\tif (EnumProcessModules(processHandle, moduleArray, bytesRequired, &bytesRequired))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbaseAddress = (DWORD_PTR)moduleArray[0];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tLocalFree(moduleArrayBytes);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tCloseHandle(processHandle);\n\t\t}\n\n\t\treturn baseAddress;\n\t}\n\n\tstatic std::string GetCurrentProcessName()\n\t{\n\t\tchar lpFilename[MAX_PATH];\n\t\tGetModuleFileNameA(NULL, lpFilename, sizeof(lpFilename));\n\t\tstd::string moduleName = strrchr(lpFilename, '\\\\');\n\t\tmoduleName = moduleName.substr(1, moduleName.length());\n\t\treturn moduleName;\n\t}\n\n\tstatic std::string GetCurrentModuleName()\n\t{\n\t\tHMODULE module = NULL;\n\n\t\tstatic char dummyStaticVariableToGetModuleName = 'x';\n\t\tGetModuleHandleExA(\n\t\t\tGET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, \n\t\t\t&dummyStaticVariableToGetModuleName, \n\t\t\t&module);\n\n\t\tchar lpFilename[MAX_PATH];\n\t\tGetModuleFileNameA(module, lpFilename, sizeof(lpFilename));\n\t\tchar* lastSlash = strrchr(lpFilename, '\\\\');\n\t\tstd::string moduleName = \"\";\n\t\tif (lastSlash != nullptr)\n\t\t{\n\t\t\tmoduleName = lastSlash;\n\t\t\tmoduleName = moduleName.substr(1, moduleName.length());\n\t\t\tmoduleName.erase(moduleName.find(\".dll\"), moduleName.length());\n\t\t}\n\t\treturn moduleName;\n\t}\n\n\tstatic void ShowErrorPopup(std::string error)\n\t{\n\t\tlogger.Log(\"Raised error: %s\", error.c_str());\n\t\tMessageBox(NULL, error.c_str(), GetCurrentModuleName().c_str(), MB_OK | MB_ICONERROR | MB_SYSTEMMODAL);\n\t}\n\n\tstatic void PrintPattern(std::vector<uint16_t> pattern)\n\t{\n\t\tstd::string patternString = \"\";\n\t\tfor (auto bytes : pattern)\n\t\t{\n\t\t\tstd::stringstream stream;\n\t\t\tstd::string byte = \"\";\n\t\t\tif (bytes == maskBytes)\n\t\t\t{\n\t\t\t\tbyte = \"?\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstream << \"0x\" << std::hex << bytes;\n\t\t\t\tbyte = stream.str();\n\t\t\t}\n\t\t\tpatternString.append(byte + \" \");\n\t\t}\n\t\tlogger.Log(\"Pattern: %s\", patternString.c_str());\n\t}\n\n\t// Scans the memory of the main process module for the given signature.\n\tstatic uintptr_t SigScan(std::vector<uint16_t> pattern)\n\t{\n\t\tDWORD processId = GetCurrentProcessId();\n\t\tuintptr_t regionStart = GetProcessBaseAddress(processId);\n\t\tlogger.Log(\"Process name: %s\", GetCurrentProcessName().c_str());\n\t\tlogger.Log(\"Process ID: %i\", processId);\n\t\tlogger.Log(\"Process base address: 0x%llX\", regionStart);\n\t\tPrintPattern(pattern);\n\n\t\tsize_t numRegionsChecked = 0;\n\t\tsize_t maxNumberOfRegionsToCheck = 10000;\n\t\tuintptr_t currentAddress = 0;\n\t\twhile (numRegionsChecked < maxNumberOfRegionsToCheck)\n\t\t{\n\t\t\tMEMORY_BASIC_INFORMATION memoryInfo = { 0 };\n\t\t\tif (VirtualQuery((void*)regionStart, &memoryInfo, sizeof(MEMORY_BASIC_INFORMATION)) == 0)\n\t\t\t{\n\t\t\t\tDWORD error = GetLastError();\n\t\t\t\tif (error == ERROR_INVALID_PARAMETER)\n\t\t\t\t{\n\t\t\t\t\tlogger.Log(\"Reached end of scannable memory.\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tlogger.Log(\"VirtualQuery failed, error code: %i.\", error);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tregionStart = (uintptr_t)memoryInfo.BaseAddress;\n\t\t\tsize_t regionSize = memoryInfo.RegionSize;\n\t\t\tuintptr_t regionEnd = regionStart + regionSize;\n\t\t\tDWORD protection = memoryInfo.Protect;\n\t\t\tDWORD state = memoryInfo.State;\n\n\t\t\tbool isMemoryReadable = (\n\t\t\t\tprotection == PAGE_EXECUTE_READWRITE\n\t\t\t\t|| protection == PAGE_READWRITE\n\t\t\t\t|| protection == PAGE_READONLY\n\t\t\t\t|| protection == PAGE_WRITECOPY\n\t\t\t\t|| protection == PAGE_EXECUTE_WRITECOPY)\n\t\t\t\t&& state == MEM_COMMIT;\n\n\t\t\tif (isMemoryReadable)\n\t\t\t{\n\t\t\t\tlogger.Log(\"Checking region: %p\", regionStart);\n\t\t\t\tcurrentAddress = regionStart;\n\t\t\t\twhile (currentAddress < regionEnd - pattern.size())\n\t\t\t\t{\n\t\t\t\t\tfor (size_t i = 0; i < pattern.size(); i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (pattern[i] == maskBytes)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcurrentAddress++;\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (*(unsigned char*)currentAddress != (unsigned char)pattern[i])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcurrentAddress++;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (i == pattern.size() - 1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tuintptr_t signature = currentAddress - pattern.size() + 1;\n\t\t\t\t\t\t\tlogger.Log(\"Found signature at %p\", signature);\n\t\t\t\t\t\t\treturn signature;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcurrentAddress++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tlogger.Log(\"Skipped region: %p\", regionStart);\n\t\t\t}\n\n\t\t\tnumRegionsChecked++;\n\t\t\tregionStart += regionSize;\n\t\t}\n\n\t\tlogger.Log(\"Stopped at: %p, num regions checked: %i\", currentAddress, numRegionsChecked);\n\t\tShowErrorPopup(\"Could not find signature!\");\n\t\treturn 0;\n\t}\n\n\tstatic uintptr_t AllocateMemory(size_t numBytes)\n\t{\n\t\tuintptr_t memoryAddress = NULL;\n\t\tmemoryAddress = (uintptr_t)VirtualAlloc(NULL, numBytes, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);\n\n\t\tif (memoryAddress == NULL)\n\t\t{\n\t\t\tlogger.Log(\"Failed to allocate %i bytes of memory\", numBytes);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlogger.Log(\"Allocated %i bytes of memory at %p\", numBytes, memoryAddress);\n\t\t\tMemSet(memoryAddress, 0x90, numBytes);\n\t\t}\n\n\t\treturn memoryAddress;\n\t}\n\n\tstatic uintptr_t AllocateMemoryWithin32BitRange(size_t numBytes, uintptr_t origin)\n\t{\n\t\tuintptr_t memoryAddress = NULL;\n\t\tsize_t unidirectionalRange = 0x7fffffff;\n\t\tuintptr_t lowerBound = origin - unidirectionalRange;\n\t\tuintptr_t higherBound = origin + unidirectionalRange;\n\t\tsize_t numAttempts = 0;\n\t\tfor (size_t i = lowerBound; i < higherBound;)\n\t\t{\n\t\t\tnumAttempts++;\n\t\t\tmemoryAddress = (uintptr_t)VirtualAlloc((void*)i, numBytes, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);\n\n\t\t\tif (memoryAddress != NULL)\n\t\t\t{\n\t\t\t\tbool memoryAddressIsAcceptable = memoryAddress >= lowerBound && memoryAddress <= higherBound;\n\t\t\t\tif (memoryAddressIsAcceptable)\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tMEMORY_BASIC_INFORMATION info;\n\t\t\t\t\tVirtualQuery((void*)memoryAddress, &info, sizeof(MEMORY_BASIC_INFORMATION));\n\t\t\t\t\ti += info.RegionSize;\n\t\t\t\t\tVirtualFree((void*)memoryAddress, 0, MEM_RELEASE);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tsize_t arbitraryIncrement = 10000;\n\t\t\t\ti += arbitraryIncrement;\n\t\t\t}\n\t\t}\n\n\t\tif (memoryAddress == NULL)\n\t\t{\n\t\t\tlogger.Log(\n\t\t\t\t\"Failed to allocate %i bytes of memory. Origin: %p, lower: %p, higher: %p, attempts: %i\", \n\t\t\t\tnumBytes,\n\t\t\t\torigin,\n\t\t\t\tlowerBound,\n\t\t\t\thigherBound,\n\t\t\t\tnumAttempts);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlogger.Log(\"Allocated %i bytes of memory at %p\", numBytes, memoryAddress);\n\t\t\tMemSet(memoryAddress, 0x90, numBytes);\n\t\t}\n\n\t\treturn memoryAddress;\n\t}\n\n\tstatic bool IsRelativeNearJumpPresentAtAddress(uintptr_t address)\n\t{\n\t\tstd::vector<unsigned char> buffer(1, 0x90);\n\t\tstd::vector<unsigned char> assemblyRelativeNearJumpByte = { 0xe9 };\n\t\tMemCopy((uintptr_t)&buffer[0], address, 1);\n\t\tif (buffer == assemblyRelativeNearJumpByte)\n\t\t{\n\t\t\treturn true;\n\t\t};\n\t\treturn false;\n\t}\n\n\tstatic bool IsAbsoluteIndirectNearJumpPresentAtAddress(uintptr_t address)\n\t{\n\t\tstd::vector<unsigned char> buffer(3, 0x90);\n\t\tstd::vector<unsigned char> absoluteIndirectNearJumpBytes = { 0x48, 0xff, 0x25 };\n\t\tMemCopy((uintptr_t)&buffer[0], address, 3);\n\t\tif (buffer == absoluteIndirectNearJumpBytes)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tstatic bool IsAbsoluteDirectFarJumpPresentAtAddress(uintptr_t address)\n\t{\n\t\tstd::vector<unsigned char> absoluteDirectFarJump = { 0xff, 0x25, 0x00, 0x00, 0x00, 0x00 };\n\t\tstd::vector<unsigned char> buffer(absoluteDirectFarJump.size(), 0x90);\n\t\tMemCopy((uintptr_t)&buffer[0], address, buffer.size());\n\t\tif (buffer == absoluteDirectFarJump)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tstatic bool IsAddressHooked(uintptr_t address)\n\t{\n\t\tif (\n\t\t\tIsRelativeNearJumpPresentAtAddress(address)\n\t\t\t|| IsAbsoluteIndirectNearJumpPresentAtAddress(address)\n\t\t\t|| IsAbsoluteDirectFarJumpPresentAtAddress(address))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tstatic size_t CalculateRequiredAsmClearance(uintptr_t address, size_t minimumClearance)\n\t{\n\t\tsize_t maximumAmountOfBytesToCheck = 30;\n\t\tstd::vector<uint8_t> bytesBuffer(maximumAmountOfBytesToCheck, 0x90);\n\t\tMemCopy((uintptr_t)&bytesBuffer[0], address, maximumAmountOfBytesToCheck);\n\n\t\tif (IsAbsoluteDirectFarJumpPresentAtAddress(address))\n\t\t{\n\t\t\treturn 14;\n\t\t}\n\n\t\tsize_t requiredClearance = 0;\n\t\tfor (size_t byteCount = 0; byteCount < maximumAmountOfBytesToCheck;)\n\t\t{\n\t\t\tsize_t instructionSize = nmd_x86_ldisasm(\n\t\t\t\t&bytesBuffer[byteCount],\n\t\t\t\tmaximumAmountOfBytesToCheck - byteCount,\n\t\t\t\tNMD_X86_MODE_64);\n\n\t\t\tif (instructionSize <= 0)\n\t\t\t{\n\t\t\t\tlogger.Log(\"Instruction invalid, could not check length!\");\n\t\t\t\treturn minimumClearance;\n\t\t\t}\n\n\t\t\tif (byteCount >= minimumClearance)\n\t\t\t{\n\t\t\t\trequiredClearance = byteCount;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tbyteCount += instructionSize;\n\t\t}\n\n\t\treturn requiredClearance;\n\t}\n\n\tstatic uintptr_t CalculateAbsoluteDestinationFromRelativeNearJumpAtAddress(uintptr_t relativeNearJumpMemoryLocation)\n\t{\n\t\tint32_t offset = 0;\n\t\tMemCopy((uintptr_t)&offset, relativeNearJumpMemoryLocation + 1, 4);\n\t\tuintptr_t absoluteAddress = relativeNearJumpMemoryLocation + 5 + offset;\n\t\treturn absoluteAddress;\n\t}\n\n\tstatic uintptr_t CalculateAbsoluteDestinationFromAbsoluteIndirectNearJumpAtAddress(uintptr_t absoluteIndirectNearJumpMemoryLocation)\n\t{\n\t\tint32_t offset = 0;\n\t\tMemCopy((uintptr_t)&offset, absoluteIndirectNearJumpMemoryLocation + 3, 4);\n\t\tuintptr_t memoryContainingAbsoluteAddress = absoluteIndirectNearJumpMemoryLocation + 7 + offset;\n\t\tuintptr_t absoluteAddress = *(uintptr_t*)memoryContainingAbsoluteAddress;\n\t\treturn absoluteAddress;\n\t}\n\n\tstatic uintptr_t CalculateAbsoluteDestinationFromAbsoluteDirectFarJumpAtAddress(uintptr_t absoluteDirectFarJumpMemoryLocation)\n\t{\n\t\tuintptr_t absoluteAddress = 0;\n\t\tMemCopy((uintptr_t)&absoluteAddress, absoluteDirectFarJumpMemoryLocation + 6, 8);\n\t\treturn absoluteAddress;\n\t}\n\n\tstatic int32_t CalculateRelativeDisplacementForRelativeJump(uintptr_t relativeJumpAddress, uintptr_t destinationAddress)\n\t{\n\t\treturn -int32_t(relativeJumpAddress + 5 - destinationAddress);\n\t}\n\n\t// Places a 14-byte absolutely addressed jump from A to B. \n\t// Add extra clearance when the jump doesn't fit cleanly.\n\tstatic void PlaceAbsoluteJump(uintptr_t address, uintptr_t destinationAddress, size_t clearance = 14)\n\t{\n\t\tMemSet(address, 0x90, clearance);\n\t\tunsigned char absoluteJumpBytes[6] = { 0xff, 0x25, 0x00, 0x00, 0x00, 0x00};\n\t\tMemCopy(address, (uintptr_t)&absoluteJumpBytes[0], 6);\n\t\tMemCopy(address + 6, (uintptr_t)&destinationAddress, 8);\n\t\tlogger.Log(\"Created absolute jump from %p to %p with a clearance of %i\", address, destinationAddress, clearance);\n\t}\n\n\t// Places a 5-byte relatively addressed jump from A to B. \n\t// Add extra clearance when the jump doesn't fit cleanly.\n\tstatic void PlaceRelativeJump(uintptr_t address, uintptr_t destinationAddress, size_t clearance = 5)\n\t{\n\t\tMemSet(address, 0x90, clearance);\n\t\tunsigned char relativeJumpBytes[5] = { 0xe9, 0x00, 0x00, 0x00, 0x00 };\n\t\tMemCopy(address, (uintptr_t)&relativeJumpBytes[0], 5);\n\t\tint32_t relativeAddress = CalculateRelativeDisplacementForRelativeJump(address, destinationAddress);\n\t\tMemCopy((address + 1), (uintptr_t)&relativeAddress, 4);\n\t\tlogger.Log(\"Created relative jump from %p to %p with a clearance of %i\", address, destinationAddress, clearance);\n\t}\n\n\tstatic std::string ConvertVectorOfBytesToStringOfHex(std::vector<uint8_t> bytes)\n\t{\n\t\tstd::string hexString = \"\";\n\t\tfor (auto byte : bytes)\n\t\t{\n\t\t\tstd::stringstream stream;\n\t\t\tstd::string byteAsHex = \"\";\n\t\t\tstream << std::hex << std::setfill('0') << std::setw(2) << (int)byte;\n\t\t\tbyteAsHex = stream.str();\n\t\t\thexString.append(\"0x\" + byteAsHex + \" \");\n\t\t}\n\t\treturn hexString;\n\t}\n\n\tstatic void PrintBytesAtAddress(uintptr_t address, size_t numBytes)\n\t{\n\t\tstd::vector<uint8_t> bytesBuffer(numBytes, 0x90);\n\t\tMemCopy((uintptr_t)&bytesBuffer[0], address, bytesBuffer.size());\n\t\tstd::string hexString = ConvertVectorOfBytesToStringOfHex(bytesBuffer);\n\t\tlogger.Log(\"Existing bytes: %s\", hexString.c_str());\n\t}\n\n\t// Place a trampoline hook from A to B while taking third-party hooks into consideration.\n\t// Add extra clearance when the jump doesn't fit cleanly.\n\tstatic void PlaceHook(uintptr_t addressToHook, uintptr_t destinationAddress, uintptr_t* returnAddress)\n\t{\n\t\tlogger.Log(\"Hooking...\");\n\n\t\t// Most overlays don't care if we overwrite the 0xE9 jump and place it somewhere else, but MSI Afterburner does.\n\t\t// So instead of overwriting jumps we follow them and place our jump at the final destination.\n\t\tint maxFollowAttempts = 50;\n\t\tint countFollowAttempts = 0;\n\t\twhile (IsAddressHooked(addressToHook))\n\t\t{\n\t\t\tif (IsRelativeNearJumpPresentAtAddress(addressToHook))\n\t\t\t{\n\t\t\t\taddressToHook = CalculateAbsoluteDestinationFromRelativeNearJumpAtAddress(addressToHook);\n\t\t\t}\n\t\t\telse if (IsAbsoluteIndirectNearJumpPresentAtAddress(addressToHook))\n\t\t\t{\n\t\t\t\taddressToHook = CalculateAbsoluteDestinationFromAbsoluteIndirectNearJumpAtAddress(addressToHook);\n\t\t\t}\n\t\t\telse if (IsAbsoluteDirectFarJumpPresentAtAddress(addressToHook))\n\t\t\t{\n\t\t\t\t//addressToHook = CalculateAbsoluteDestinationFromAbsoluteDirectFarJumpAtAddress(addressToHook);\n\t\t\t}\n\n\t\t\tcountFollowAttempts++;\n\t\t\tif (countFollowAttempts >= maxFollowAttempts)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tPrintBytesAtAddress(addressToHook, 20);\n\n\t\tconst size_t assemblyShortJumpSize = 5;\n\t\tconst size_t assemblyFarJumpSize = 14;\n\t\tsize_t trampolineSize = 0;\n\t\tuintptr_t trampolineAddress = 0;\n\t\tuintptr_t trampolineReturnAddress = 0;\n\t\tsize_t thirdPartyHookProtectionBuffer = assemblyFarJumpSize;\n\n\t\tsize_t clearance = CalculateRequiredAsmClearance(addressToHook, assemblyShortJumpSize);\n\n\t\ttrampolineSize = assemblyFarJumpSize * 3 + clearance + thirdPartyHookProtectionBuffer;\n\n#ifdef _WIN64\n\t\ttrampolineAddress = AllocateMemoryWithin32BitRange(trampolineSize, addressToHook + assemblyShortJumpSize);\n#else\n\t\ttrampolineAddress = AllocateMemory(trampolineSize);\n#endif\n\n\t\ttrampolineReturnAddress = addressToHook + clearance;\n\t\tMemCopy(trampolineAddress + assemblyFarJumpSize + thirdPartyHookProtectionBuffer, addressToHook, clearance);\n\n\t\tHookInformation hookInfo;\n\t\thookInfo.originalBytes = std::vector<unsigned char>(clearance);\n\t\thookInfo.trampolineInstructionsAddress = trampolineAddress + assemblyFarJumpSize + thirdPartyHookProtectionBuffer;\n\t\tInfoBufferForHookedAddresses[addressToHook] = hookInfo;\n\t\tMemCopy(\n\t\t\t(uintptr_t)&InfoBufferForHookedAddresses[addressToHook].originalBytes[0],\n\t\t\ttrampolineAddress + assemblyFarJumpSize + thirdPartyHookProtectionBuffer,\n\t\t\tInfoBufferForHookedAddresses[addressToHook].originalBytes.size());\n#ifdef _WIN64\n\t\tPlaceAbsoluteJump(trampolineAddress + thirdPartyHookProtectionBuffer, destinationAddress);\n\t\tPlaceAbsoluteJump(trampolineAddress + trampolineSize - assemblyFarJumpSize, trampolineReturnAddress);\n#else\n\t\tPlaceRelativeJump(trampolineAddress + thirdPartyHookProtectionBuffer, destinationAddress);\n\t\tPlaceRelativeJump(trampolineAddress + trampolineSize - assemblyFarJumpSize, trampolineReturnAddress);\n#endif\n\t\t*returnAddress = trampolineAddress + assemblyFarJumpSize + thirdPartyHookProtectionBuffer;\n\t\tPlaceRelativeJump(addressToHook, trampolineAddress, clearance);\n\t}\n\n\tstatic void Unhook(uintptr_t hookedAddress) \n\t{\n\t\tauto search = InfoBufferForHookedAddresses.find(hookedAddress);\n\t\tif (search != InfoBufferForHookedAddresses.end())\n\t\t{\n\t\t\tMemSet(\n\t\t\t\tInfoBufferForHookedAddresses[hookedAddress].trampolineInstructionsAddress, \n\t\t\t\t0x90, \n\t\t\t\tInfoBufferForHookedAddresses[hookedAddress].originalBytes.size());\n\t\t\tMemCopy(\n\t\t\t\thookedAddress, \n\t\t\t\t(uintptr_t)&InfoBufferForHookedAddresses[hookedAddress].originalBytes[0], \n\t\t\t\tInfoBufferForHookedAddresses[hookedAddress].originalBytes.size());\n\t\t\tlogger.Log(\"Removed hook from %p\", hookedAddress);\n\t\t}\n\t}\n\n\tstatic uintptr_t ReadPointerChain(std::vector<uintptr_t> pointerOffsets)\n\t{\n\t\tDWORD processId = GetCurrentProcessId();\n\t\tuintptr_t baseAddress = GetProcessBaseAddress(processId);\n\t\tuintptr_t pointer = baseAddress;\n\t\tfor (size_t i = 0; i < pointerOffsets.size(); i++)\n\t\t{\n\t\t\tpointer += pointerOffsets[i];\n\t\t\tif (pointerOffsets[i] != pointerOffsets.back())\n\t\t\t{\n\t\t\t\tMemCopy((uintptr_t)&pointer, pointer, sizeof(uintptr_t));\n\t\t\t}\n\t\t\tif (pointer == 0)\n\t\t\t{\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t\treturn pointer;\n\t}\n}"
  },
  {
    "path": "include/OverlayFramework.h",
    "content": "#pragma once\n\n#include <d3d11.h>\n#include <vector>\n#include <fstream>\n#include <WICTextureLoader.h>\n#include <comdef.h>\n#include <SpriteBatch.h>\n#include <SpriteFont.h>\n#include <wrl/client.h>\n#include <chrono>\n#include <string>\n\n#include \"Logger.h\"\n\n#undef DrawText\n\nnamespace OF\n{\n\tstatic struct Box\n\t{\n\t\tint x = 0;\n\t\tint y = 0;\n\t\tfloat z = 0.0f;\n\t\tint width = 0;\n\t\tint height = 0;\n\t\tbool pressed = false;\n\t\tbool clicked = false;\n\t\tbool hover = false;\n\t\tbool draggable = true;\n\t\tbool hasBeenRendered = false;\n\t\tBox* parentBox = nullptr;\n\t};\n\n\tstatic Logger logger{ \"OverlayFramework\" };\n\tstatic HWND ofWindow = 0;\n\tstatic int ofWindowWidth = 0;\n\tstatic int ofWindowHeight = 0;\n\tstatic std::vector<Box*> ofBoxes = std::vector<Box*>();\n\tstatic constexpr unsigned char UNBOUND = 0x07;\n\t\n\tstatic Microsoft::WRL::ComPtr<ID3D11Device> ofDevice = nullptr;\n\tstatic std::shared_ptr<DirectX::SpriteBatch> ofSpriteBatch = nullptr;\n\tstatic std::vector<Microsoft::WRL::ComPtr<ID3D11ShaderResourceView>> ofTextures = std::vector<Microsoft::WRL::ComPtr<ID3D11ShaderResourceView>>();\n\tstatic std::vector<std::shared_ptr<DirectX::SpriteFont>> ofFonts = std::vector<std::shared_ptr<DirectX::SpriteFont>>();\n\tstatic std::shared_ptr<DirectX::SpriteFont> ofActiveFont = nullptr;\n\n\t// Gives the framework the required DirectX objects to draw\n\tstatic void InitFramework(\n\t\tMicrosoft::WRL::ComPtr<ID3D11Device> device,\n\t\tstd::shared_ptr<DirectX::SpriteBatch> spriteBatch,\n\t\tHWND window)\n\t{\n\t\tlogger.Log(\"Initialized\");\n\t\tofDevice = device;\n\t\tofSpriteBatch = spriteBatch;\n\t\tofWindow = window;\n\n\t\tRECT hwndRect;\n\t\tGetClientRect(ofWindow, &hwndRect);\n\t\tofWindowWidth = hwndRect.right - hwndRect.left;\n\t\tofWindowHeight = hwndRect.bottom - hwndRect.top;\n\t}\n\n\tstatic int MapIntToRange(\n\t\tint number,\n\t\tint inputStart,\n\t\tint inputEnd,\n\t\tint outputStart,\n\t\tint outputEnd)\n\t{\n\t\treturn outputStart + (outputEnd - outputStart) * (number - inputStart) / (inputEnd - inputStart);\n\t}\n\n\tstatic float MapFloatToRange(\n\t\tfloat number,\n\t\tfloat inputStart,\n\t\tfloat inputEnd,\n\t\tfloat outputStart,\n\t\tfloat outputEnd)\n\t{\n\t\treturn outputStart + (outputEnd - outputStart) * (number - inputStart) / (inputEnd - inputStart);\n\t}\n\n\tstatic int LoadTexture(std::string filepath)\n\t{\n\t\tif (ofDevice.Get() == nullptr)\n\t\t{\n\t\t\tlogger.Log(\"Could not load texture, ofDevice is nullptr! Run InitFramework before attempting to load textures!\");\n\t\t\treturn -1;\n\t\t}\n\n\t\tif (ofTextures.size() == 0 && filepath != \"blank\") {\n\t\t\tif (LoadTexture(\"blank\") != 0)\n\t\t\t{\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t\telse if (filepath == \"blank\")\n\t\t{\n\t\t\tfilepath = \"hook_textures\\\\blank.jpg\";\n\t\t}\n\n\t\tlogger.Log(\"Loading texture: %s\", filepath.c_str());\n\n\t\tstd::wstring wideString(filepath.length(), ' ');\n\t\tstd::copy(filepath.begin(), filepath.end(), wideString.begin());\n\t\tstd::fstream file = std::fstream(filepath);\n\t\tif (file.fail())\n\t\t{\n\t\t\tlogger.Log(\"Texture loading failed, file not found: %s\", filepath.c_str());\n\t\t\tfile.close();\n\t\t\treturn -1;\n\t\t}\n\t\tfile.close();\n\n\t\tHRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED);\n\t\tif (FAILED(hr))\n\t\t{\n\t\t\tlogger.Log(\"Error %#010x when initializing the COM library\", hr);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlogger.Log(\"Successfully initialized the COM library\");\n\t\t}\n\n\t\tMicrosoft::WRL::ComPtr<ID3D11ShaderResourceView> texture = nullptr;\n\t\tHRESULT texResult = DirectX::CreateWICTextureFromFile(ofDevice.Get(), wideString.c_str(), nullptr, texture.GetAddressOf());\n\n\t\t_com_error texErr(texResult);\n\t\tlogger.Log(\"Texture HRESULT: %s\", texErr.ErrorMessage());\n\t\tif (FAILED(texResult))\n\t\t{\n\t\t\tlogger.Log(\"Texture loading failed: %s\", filepath.c_str());\n\t\t\treturn -1;\n\t\t}\n\n\t\tofTextures.push_back(texture);\n\t\treturn ofTextures.size() - 1;\n\t}\n\n\tstatic int LoadFont(std::string filepath)\n\t{\n\t\tif (ofDevice.Get() == nullptr)\n\t\t{\n\t\t\tlogger.Log(\"Could not load font, ofDevice is nullptr! Run InitFramework before attempting to load fonts!\");\n\t\t\treturn -1;\n\t\t}\n\n\t\tlogger.Log(\"Loading font: %s\", filepath.c_str());\n\n\t\tstd::fstream file = std::fstream(filepath);\n\t\tstd::wstring wideString(filepath.length(), ' ');\n\t\tstd::copy(filepath.begin(), filepath.end(), wideString.begin());\n\t\tif (file.fail())\n\t\t{\n\t\t\tlogger.Log(\"Font loading failed: %s\", filepath.c_str());\n\t\t\tfile.close();\n\t\t\treturn -1;\n\t\t}\n\n\t\tfile.close();\n\n\t\tlogger.Log(\"Font was loaded successfully\");\n\t\tofFonts.push_back(std::make_shared<DirectX::SpriteFont>(ofDevice.Get(), wideString.c_str()));\n\n\t\treturn ofFonts.size() - 1;\n\t}\n\n\tstatic void SetFont(int font)\n\t{\n\t\tif (font > ofFonts.size() - 1 || font < 0)\n\t\t{\n\t\t\tlogger.Log(\"Attempted to set invalid font!\");\n\t\t\treturn;\n\t\t}\n\n\t\tofActiveFont = ofFonts[font];\n\t}\n\n\tstatic void PlaceOnTop(Box* box)\n\t{\n\t\tstatic std::vector<int> ofBoxOrder = std::vector<int>();\n\t\tsize_t boxIndex = 0;\n\t\tfor (size_t i = 0; i < ofBoxes.size(); i++)\n\t\t{\n\t\t\tif (ofBoxes[i] == box)\n\t\t\t{\n\t\t\t\tboxIndex = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tofBoxOrder.push_back(boxIndex);\n\t\tfor (size_t i = 0; i < ofBoxOrder.size() - 1; i++)\n\t\t{\n\t\t\tif (ofBoxes[ofBoxOrder[i]] == ofBoxes[ofBoxOrder.back()])\n\t\t\t{\n\t\t\t\tofBoxOrder.erase(ofBoxOrder.begin() + i);\n\t\t\t}\n\t\t}\n\n\t\tfor (float i = 0; i < ofBoxOrder.size(); i++)\n\t\t{\n\t\t\tofBoxes[ofBoxOrder[i]]->z = 1.0f / (1 + (i / 1000));\n\t\t}\n\t}\n\n\tstatic POINT GetAbsolutePosition(Box* box)\n\t{\n\t\tif (box == nullptr)\n\t\t{\n\t\t\treturn { 0, 0 };\n\t\t}\n\n\t\tPOINT absolutePosition = { box->x, box->y };\n\t\tBox* parentBox = box->parentBox;\n\t\twhile (parentBox != nullptr)\n\t\t{\n\t\t\tif (parentBox->parentBox == box)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tabsolutePosition.x += parentBox->x;\n\t\t\tabsolutePosition.y += parentBox->y;\n\n\t\t\tparentBox = parentBox->parentBox;\n\t\t}\n\n\t\treturn absolutePosition;\n\t}\n\n\tstatic Box* CreateBox(Box* parentBox, int x, int y, int width, int height)\n\t{\n\t\tBox* box = new Box;\n\t\tbox->x = x;\n\t\tbox->y = y;\n\t\tbox->width = width;\n\t\tbox->height = height;\n\t\tbox->parentBox = parentBox;\n\n\t\tif (parentBox != nullptr)\n\t\t{\n\t\t\tbox->draggable = false;\n\t\t}\n\n\t\tofBoxes.push_back(box);\n\t\tPlaceOnTop(box);\n\t\treturn ofBoxes.back();\n\t}\n\n\tstatic Box* CreateBox(int x, int y, int width, int height)\n\t{\n\t\treturn CreateBox(nullptr, x, y, width, height);\n\t}\n\t\n\tstatic void _DrawBox(Box* box, DirectX::XMVECTOR color, int textureID)\n\t{\n\t\tstatic bool ofFailedToLoadBlank = false;\n\n\t\tif (box == nullptr) \n\t\t{\n\t\t\tlogger.Log(\"Attempted to render a nullptr Box!\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (ofSpriteBatch == nullptr)\n\t\t{\n\t\t\tlogger.Log(\"Attempted to render with ofSpriteBatch as nullptr! Run InitFramework before attempting to draw!\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (ofTextures.size() < 1) \n\t\t{\n\t\t\tif (ofFailedToLoadBlank == false) \n\t\t\t{\n\t\t\t\tif (LoadTexture(\"blank\") != 0)\n\t\t\t\t{\n\t\t\t\t\tofFailedToLoadBlank = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (textureID < 0 || textureID > ofTextures.size() - 1) \n\t\t{\n\t\t\tlogger.Log(\"'%i' is an invalid texture ID!\", textureID);\n\t\t\treturn;\n\t\t}\n\t\n\t\tPOINT position = GetAbsolutePosition(box);\n\n\t\tRECT rect;\n\t\trect.top = position.y;\n\t\trect.left = position.x;\n\t\trect.bottom = position.y + box->height;\n\t\trect.right = position.x + box->width;\n\n\t\tbox->hasBeenRendered = true;\n\t\tofSpriteBatch->Draw(ofTextures[textureID].Get(), rect, nullptr, color, 0.0f, DirectX::XMFLOAT2(0.0f, 0.0f), DirectX::SpriteEffects_None, box->z);\n\t}\n\n\tstatic void DrawBox(Box* box, int textureID)\n\t{\n\t\t_DrawBox(box, { 1.0f, 1.0f, 1.0f, 1.0f }, textureID);\n\t}\n\n\tstatic void DrawBox(Box* box, int r, int g, int b, int a = 255)\n\t{\n\t\tfloat _r = MapFloatToRange((float)r, 0.0f, 255.0f, 0.0f, 1.0f);\n\t\tfloat _g = MapFloatToRange((float)g, 0.0f, 255.0f, 0.0f, 1.0f);\n\t\tfloat _b = MapFloatToRange((float)b, 0.0f, 255.0f, 0.0f, 1.0f);\n\t\tfloat _a = MapFloatToRange((float)a, 0.0f, 255.0f, 0.0f, 1.0f);\n\t\t_DrawBox(box, { _r, _g, _b, _a }, 0);\n\t}\n\n\tstatic void DrawText(\n\t\tBox* box, \n\t\tstd::string text,\n\t\tint offsetX = 0,\n\t\tint offsetY = 0,\n\t\tfloat scale = 1.0f,\n\t\tint r = 255,\n\t\tint g = 255,\n\t\tint b = 255,\n\t\tint a = 255,\n\t\tfloat rotation = 0.0f)\n\t{\n\t\tif (ofActiveFont == nullptr)\n\t\t{\n\t\t\tlogger.Log(\"Attempted to render text with an invalid font, make sure to run SetFont first!\");\n\t\t\treturn;\n\t\t}\n\n\t\tPOINT position = GetAbsolutePosition(box);\n\n\t\tDirectX::XMFLOAT2 textPos = DirectX::XMFLOAT2\n\t\t(\n\t\t\tposition.x + offsetX,\n\t\t\tposition.y + offsetY\n\t\t);\n\n\t\tfloat _r = MapFloatToRange((float)r, 0.0f, 255.0f, 0.0f, 1.0f);\n\t\tfloat _g = MapFloatToRange((float)g, 0.0f, 255.0f, 0.0f, 1.0f);\n\t\tfloat _b = MapFloatToRange((float)b, 0.0f, 255.0f, 0.0f, 1.0f);\n\t\tfloat _a = MapFloatToRange((float)a, 0.0f, 255.0f, 0.0f, 1.0f);\n\n\t\tofActiveFont->DrawString(\n\t\t\tofSpriteBatch.get(), \n\t\t\ttext.c_str(), \n\t\t\ttextPos, \n\t\t\t{ _r, _g, _b, _a }, \n\t\t\trotation, \n\t\t\t{ 0.0f, 0.0f },\n\t\t\tscale, \n\t\t\tDirectX::SpriteEffects_None, \n\t\t\tbox->z);\n\t}\n\n\tstatic bool IsCursorInsideBox(POINT cursorPos, Box* box)\n\t{\n\t\tPOINT position = GetAbsolutePosition(box);\n\t\tPOINT boxSize = { box->width, box->height };\n\n\t\tif (cursorPos.x < (position.x + boxSize.x) && cursorPos.x > position.x)\n\t\t{\n\t\t\tif (cursorPos.y < (position.y + boxSize.y) && cursorPos.y > position.y)\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tstatic bool CheckHotkey(unsigned char key, unsigned char modifier = UNBOUND)\n\t{\n\t\tstatic std::vector<unsigned char> notReleasedKeys;\n\n\t\tif (ofWindow != GetForegroundWindow())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tbool keyPressed = GetAsyncKeyState(key) & 0x8000;\n\t\tbool modifierPressed = GetAsyncKeyState(modifier) & 0x8000;\n\n\t\tif (key == UNBOUND)\n\t\t{\n\t\t\treturn modifierPressed;\n\t\t}\n\n\t\tauto iterator = std::find(notReleasedKeys.begin(), notReleasedKeys.end(), key);\n\t\tbool keyNotReleased = iterator != notReleasedKeys.end();\n\n\t\tif (keyPressed && keyNotReleased)\n\t\t{\n\t\t\treturn false;\n\t\t} \n\t\t\n\t\tif(!keyPressed)\n\t\t{\n\t\t\tif (keyNotReleased)\n\t\t\t{\n\t\t\t\tnotReleasedKeys.erase(iterator);\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\tif (modifier != UNBOUND && !modifierPressed)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tnotReleasedKeys.push_back(key);\n\t\treturn true;\n\t}\n\n\tstatic void CheckMouseEvents()\n\t{\n\t\tstatic int ofMouseX = 0, ofMouseY = 0;\n\t\tstatic int ofDeltaMouseX = 0, ofDeltaMouseY = 0;\n\t\tstatic bool ofMousePressed = false;\n\t\tstatic Box* ofClickedBox = nullptr;\n\n\t\tif (ofWindow == GetForegroundWindow())\n\t\t{\n\t\t\tPOINT cursorPos;\n\t\t\tGetCursorPos(&cursorPos);\n\t\t\tScreenToClient(ofWindow, &cursorPos);\n\n\t\t\tofDeltaMouseX = ofMouseX;\n\t\t\tofDeltaMouseY = ofMouseY;\n\t\t\tofMouseX = cursorPos.x;\n\t\t\tofMouseY = cursorPos.y;\n\t\t\tofDeltaMouseX = ofDeltaMouseX - ofMouseX;\n\t\t\tofDeltaMouseY = ofDeltaMouseY - ofMouseY;\n\n\t\t\tif (ofClickedBox != nullptr)\n\t\t\t{\n\t\t\t\tif (ofClickedBox->clicked)\n\t\t\t\t{\n\t\t\t\t\tofClickedBox->clicked = false;\n\t\t\t\t\tofClickedBox = nullptr;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tBox* topMostBox = nullptr;\n\t\t\tfor (size_t i = 0; i < ofBoxes.size(); i++)\n\t\t\t{\n\t\t\t\tBox* box = ofBoxes[i];\n\t\t\t\tbox->hover = false;\n\n\t\t\t\tif (!box->hasBeenRendered)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (IsCursorInsideBox(cursorPos, box))\n\t\t\t\t{\n\t\t\t\t\tif (topMostBox == nullptr || box->z < topMostBox->z)\n\t\t\t\t\t{\n\t\t\t\t\t\ttopMostBox = box;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (topMostBox != nullptr)\n\t\t\t{\n\t\t\t\ttopMostBox->hover = true;\n\t\t\t}\n\n\t\t\tif (GetAsyncKeyState(VK_LBUTTON) & 0x8000)\n\t\t\t{\n\t\t\t\tofMousePressed = true;\n\n\t\t\t\tif (topMostBox != nullptr)\n\t\t\t\t{\n\t\t\t\t\tofClickedBox = topMostBox;\n\t\t\t\t\tofClickedBox->pressed = true;\n\t\t\t\t}\n\n\t\t\t\tif (ofClickedBox != nullptr && ofClickedBox->draggable)\n\t\t\t\t{\n\t\t\t\t\tofClickedBox->x -= ofDeltaMouseX;\n\t\t\t\t\tofClickedBox->y -= ofDeltaMouseY;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tofMousePressed = false;\n\n\t\t\t\tif (ofClickedBox != nullptr && IsCursorInsideBox(cursorPos, ofClickedBox))\n\t\t\t\t{\n\t\t\t\t\tif (ofClickedBox->parentBox != nullptr)\n\t\t\t\t\t{\n\t\t\t\t\t\tPlaceOnTop(ofClickedBox->parentBox);\n\n\t\t\t\t\t\tfor (size_t i = 0; i < ofBoxes.size(); i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (ofClickedBox->parentBox == ofBoxes[i]->parentBox)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tPlaceOnTop(ofBoxes[i]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tPlaceOnTop(ofClickedBox);\n\n\t\t\t\t\tfor (size_t i = 0; i < ofBoxes.size(); i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (ofBoxes[i]->parentBox == ofClickedBox)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tPlaceOnTop(ofBoxes[i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tofClickedBox->pressed = false;\n\t\t\t\t\tofClickedBox->clicked = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (auto box : ofBoxes)\n\t\t{\n\t\t\tbox->hasBeenRendered = false;\n\t\t}\n\t}\n};"
  },
  {
    "path": "include/Renderer.h",
    "content": "#pragma once\n\n#include <Windows.h>\n#include <d3d12.h>\n#include <d3d11.h>\n#include <d3d11on12.h>\n#include <dxgi1_4.h>\n#include <fstream>\n#include <d3dcompiler.h>\n#include <DirectXMath.h>\n#include <wrl/client.h>\n#include <SpriteBatch.h>\n#include <SpriteFont.h>\n#include <vector>\n#include <comdef.h>\n\n#include \"ID3DRenderer.h\"\n#include \"IRenderCallback.h\"\n#include \"Logger.h\"\n\n// D3D11 renderer with support for D3D12 using D3D11On12\nclass Renderer : public ID3DRenderer\n{\npublic:\n\tvoid OnPresent(IDXGISwapChain* pThis, UINT syncInterval, UINT flags);\n\tvoid OnResizeBuffers(IDXGISwapChain* pThis, UINT bufferCount, UINT width, UINT height, DXGI_FORMAT newFormat, UINT swapChainFlags);\n\tvoid SetDrawExampleTriangle(bool doDraw);\n\tvoid AddRenderCallback(IRenderCallback* object);\n\tvoid SetCommandQueue(ID3D12CommandQueue* commandQueue);\n\tvoid SetGetCommandQueueCallback(void (*callback)());\n\nprivate:\n\tLogger logger{\"Renderer\"};\n\tHWND window = 0;\n\n\tIRenderCallback* callbackObject = nullptr;\n\tvoid (*callbackGetCommandQueue)();\n\tbool mustInitializeD3DResources = true;\n\tbool firstTimeInitPerformed = false;\n\tbool isDeviceRetrieved = false;\n\tbool isRunningD3D12 = false;\n\tbool getCommandQueueCalled = false;\n\tbool drawExamples = false;\n\tbool examplesLoaded = false;\n\tbool callbackInitialized = false;\n\tint windowWidth = 0;\n\tint windowHeight = 0;\n\tUINT bufferIndex = 0;\n\tUINT bufferCount = 0;\n\n\tMicrosoft::WRL::ComPtr<ID3D12Device> d3d12Device = nullptr;\n\tMicrosoft::WRL::ComPtr<ID3D11DeviceContext> d3d11Context = nullptr;\n\tMicrosoft::WRL::ComPtr<ID3D11Device> d3d11Device = nullptr;\n\tMicrosoft::WRL::ComPtr<ID3D12CommandQueue> commandQueue = nullptr;\n\tMicrosoft::WRL::ComPtr<ID3D11On12Device> d3d11On12Device = nullptr;\n\tstd::vector<Microsoft::WRL::ComPtr<ID3D12Resource>> d3d12RenderTargets;\n\tstd::vector<Microsoft::WRL::ComPtr<ID3D11Resource>> d3d11WrappedBackBuffers;\n\tstd::vector<Microsoft::WRL::ComPtr<ID3D11RenderTargetView>> d3d11RenderTargetViews;\n\tMicrosoft::WRL::ComPtr<IDXGISwapChain> swapChain = nullptr;\n\tMicrosoft::WRL::ComPtr<IDXGISwapChain3> swapChain3 = nullptr;\n\tstd::shared_ptr<DirectX::SpriteBatch> spriteBatch = nullptr;\n\tstd::shared_ptr<DirectX::SpriteFont> exampleFont = nullptr;\n\tDXGI_SWAP_CHAIN_DESC swapChainDesc;\n\tD3D11_VIEWPORT viewport;\n\n\t// Load the shaders from disk at compile time into a string.\n\tconst char* shaderData = {\n\t\t#include \"Shaders.hlsl\"\n\t};\n\n\tMicrosoft::WRL::ComPtr<ID3D11Buffer> vertexBuffer = nullptr;\n\tMicrosoft::WRL::ComPtr<ID3D11Buffer> indexBuffer = nullptr;\n\tMicrosoft::WRL::ComPtr<ID3D11VertexShader> vertexShader = nullptr;\n\tMicrosoft::WRL::ComPtr<ID3D11PixelShader> pixelShaderTextures = nullptr;\n\tMicrosoft::WRL::ComPtr<ID3D11PixelShader> pixelShader = nullptr;\n\tMicrosoft::WRL::ComPtr<ID3D11InputLayout> inputLayout = nullptr;\n\tMicrosoft::WRL::ComPtr<ID3D11SamplerState> samplerState = nullptr;\n\tMicrosoft::WRL::ComPtr<ID3D11Buffer> constantBuffer = nullptr;\n\tMicrosoft::WRL::ComPtr<ID3D11RasterizerState> rasterizerState = nullptr;\n\tMicrosoft::WRL::ComPtr<ID3D11DepthStencilState> depthStencilState = nullptr;\n\tMicrosoft::WRL::ComPtr<ID3D11Texture2D> depthStencilBuffer = nullptr;\n\tMicrosoft::WRL::ComPtr<ID3D11DepthStencilView> depthStencilView = nullptr;\n\n\tDirectX::XMVECTOR trianglePos = { 0.0f, 0.0f, -5.0f };\n\tDirectX::XMFLOAT3 triangleScale = DirectX::XMFLOAT3(0.7f, 0.7f, 0.7f);\n\tDirectX::XMFLOAT3 triangleNdc = DirectX::XMFLOAT3(0.0f, 0.0f, 0.0f);\n\tunsigned int triangleNumIndices = 0;\n\tfloat triangleSpeed = 0.003f;\n\tfloat triangleVelX = triangleSpeed;\n\tfloat triangleVelY = -triangleSpeed;\n\tfloat triangleRotX = 0;\n\tfloat triangleRotY = 0;\n\tfloat triangleRotZ = 0;\n\tfloat triangleCounter = 0;\n\n\tstruct Vertex\n\t{\n\t\tDirectX::XMFLOAT3 pos;\n\t\tDirectX::XMFLOAT4 color;\n\t\tDirectX::XMFLOAT2 texCoord;\n\t};\n\n\tstruct ConstantBufferData\n\t{\n\t\tDirectX::XMMATRIX wvp = DirectX::XMMatrixIdentity();\n\t}\n\tconstantBufferData;\n\n\tbool InitD3DResources(IDXGISwapChain* swapChain);\n\tbool RetrieveD3DDeviceFromSwapChain();\n\tvoid GetSwapChainDescription();\n\tvoid GetBufferCount();\n\tvoid GetSwapchainWindowInfo();\n\tvoid CreateViewport();\n\tvoid InitD3D();\n\tvoid InitD3D11();\n\tvoid CreateD3D11Context();\n\tvoid CreateSpriteBatch();\n\tvoid CreateD3D11RenderTargetView();\n\tvoid InitD3D12();\n\tvoid CreateD3D11On12Device();\n\tvoid CreateD3D12Buffers();\n\tMicrosoft::WRL::ComPtr<ID3D12DescriptorHeap> CreateD3D12RtvHeap();\n\tvoid CreateD3D12RenderTargetView(UINT bufferIndex, D3D12_CPU_DESCRIPTOR_HANDLE rtvHandle);\n\tvoid CreateD3D11WrappedBackBuffer(UINT bufferIndex);\n\tvoid CreateD3D11RenderTargetViewWithWrappedBackBuffer(UINT bufferIndex);\n\tbool WaitForCommandQueueIfRunningD3D12();\n\tvoid Render();\n\tvoid PreRender();\n\tvoid RenderCallbacks();\n\tvoid PostRender();\n\tvoid CreatePipeline();\n\tMicrosoft::WRL::ComPtr<ID3DBlob> LoadShader(const char* shaderData, std::string targetShaderVersion, std::string shaderEntry);\n\tvoid CreateExampleTriangle();\n\tvoid CreateExampleFont();\n\tvoid DrawExampleTriangle();\n\tvoid DrawExampleText();\n\tvoid ReleaseViewsBuffersAndContext();\n\tbool CheckSuccess(HRESULT hr);\n};"
  },
  {
    "path": "include/UniversalProxyDLL.h",
    "content": "#pragma once\n\n#include <Windows.h>\n#include <iostream>\n#include <vector>\n#include <fstream>\n#include <thread>\n#include <map>\n#include <iomanip>\n#include <sstream>\n\n// The DLL will crash with incremental linking enabled for some reason.\n// This linker comment will override any other project setting.\n#pragma comment(linker, \"/INCREMENTAL:NO\")\n\nextern std::vector<void*> forwardAddresses;\nextern std::vector<void*> forwardOrdinalAddresses;\nextern std::vector<void*> forwardSharedAddresses;\n\n#define SharedExportIndex_DllCanUnloadNow 0\n#define SharedExportIndex_DllGetClassObject 1\n#define SharedExportIndex_SetAppCompatStringPointer 2\n\nnamespace UPD\n{\n\tstruct ExportData\n\t{\n\t\tstd::string name = \"N/A\";\n\t\tWORD ordinal = 0;\n\t\tuintptr_t relativeAddress = 0;\n\t\tuintptr_t asmCodeAddress = 0;\n\t\tvoid* forwardFunctionAddress = nullptr;\n\t};\n\n\tstruct Callback\n\t{\n\t\tuintptr_t callbackAddress = 0;\n\t\tuintptr_t returnAddress = 0;\n\t};\n\n\tstd::map<std::string, WORD> sharedExports =\n\t{\n\t\t{ \"DllCanUnloadNow\", SharedExportIndex_DllCanUnloadNow },\n\t\t{ \"DllGetClassObject\", SharedExportIndex_DllGetClassObject },\n\t\t{ \"SetAppCompatStringPointer\", SharedExportIndex_SetAppCompatStringPointer }\n\t};\n\n\t// Global variables\n\tbool muteLogging = false;\n\talignas(256) bool isProxyReady = false;\n\tstd::ofstream logFile;\n\tstd::vector<ExportData> managedExports;\n\tstd::map<std::string, Callback> callbacks;\n\tstd::vector<unsigned char> dllMemory;\n\tPIMAGE_SECTION_HEADER sectionHeadersBase = 0;\n\tWORD numSections = 0;\n\n\t// Function prototypes\n\tvoid* RegisterCallback(std::string exportName, void* callback);\n\tvoid CreateProxy(HMODULE dllToProxy, std::string specificPathToSearch);\n\tstd::string GetModuleFileNameFromModuleHandle(HMODULE handle);\n\tstd::string FindOriginalDLL(std::string dllFileName, std::string specificPathToSearch);\n\tstd::string SearchForDLLInSpecificPath(std::string dllFileName, std::string specificPath);\n\tstd::string SearchForDLLUsingStandardSearchOrder(std::string dllFileName);\n\tstd::string SearchForDLLInCurrentFolder(std::string dllFileName);\n\tstd::string SearchForDLLInSystemFolder(std::string dllFileName);\n\tbool DoesFileExist(std::string filePath);\n\tstd::vector<unsigned char> LoadFileToVectorOfBytes(std::string filePath);\n\tvoid ReadRequiredDataFromDLLExportTable(std::string dllFilePath);\n\tPIMAGE_DOS_HEADER GetDLLDosHeader(void* peHeaderBase);\n\tPIMAGE_NT_HEADERS GetDLLNtHeaders(PIMAGE_DOS_HEADER dosHeader);\n\tvoid SetSectionHeadersInfo(PIMAGE_FILE_HEADER fileHeader, PIMAGE_OPTIONAL_HEADER optionalHeader);\n\tPIMAGE_EXPORT_DIRECTORY GetExportDirectory(PIMAGE_OPTIONAL_HEADER optionalHeader);\n\tuintptr_t RvaToRawAddress(DWORD rva);\n\tvoid PrepareForwardFunctionsWithJumpsToAsm();\n\tuintptr_t CreateMemoryWithAssemblyForwardingCode();\n\tstd::vector<unsigned char> GetAsmForwardingCode32();\n\tstd::vector<unsigned char> GetAsmForwardingCode64();\n\tvoid StartProxyCreationThread(std::string originalDllPath);\n\tDWORD WINAPI ThreadCreateProxy(LPVOID lpParam);\n\tvoid InjectFunctionAddressesIntoAsmForwardingCode(HMODULE module);\n\tvoid InjectFunctionAddresses32(HMODULE module);\n\tvoid InjectFunctionAddresses64(HMODULE module);\n\tvoid MemCopy(uintptr_t destination, uintptr_t source, size_t numBytes);\n\tvoid MemSet(uintptr_t address, unsigned char byte, size_t numBytes);\n\tvoid ToggleMemoryProtection(bool enableProtection, uintptr_t address, size_t size);\n\tvoid Hook(uintptr_t address, uintptr_t destination, size_t extraClearance = 0);\n\tvoid Hook32(uintptr_t address, uintptr_t destination, size_t clearance);\n\tvoid Hook64(uintptr_t address, uintptr_t destination, size_t clearance);\n\tint32_t CalculateDisplacementForRelativeJump(uintptr_t relativeJumpAddress, uintptr_t destinationAddress);\n\tvoid LogAndThrow(std::string exceptionMessage);\n\ttemplate<typename... Types> void Log(Types... args);\n\ttemplate<typename T> std::string NumberToHexString(T number);\n\n\tvoid* RegisterCallback(std::string exportName, void* callback)\n\t{\n\t\tif (callback != nullptr)\n\t\t{\n\t\t\tcallbacks[exportName].callbackAddress = (uintptr_t)callback;\n\t\t\tLog(\"Registered callback: \", exportName);\n\t\t\treturn &callbacks[exportName].returnAddress;\n\t\t}\n\t\treturn nullptr;\n\t}\n\n\tvoid CreateProxy(HMODULE dllToProxy, std::string specificPathToSearch = \"\")\n\t{\n\t\tstd::string dllToProxyFileName = GetModuleFileNameFromModuleHandle(dllToProxy);\n\t\tstd::string dllFilePath = FindOriginalDLL(dllToProxyFileName, specificPathToSearch);\n\t\tdllMemory = LoadFileToVectorOfBytes(dllFilePath);\n\t\tReadRequiredDataFromDLLExportTable(dllFilePath);\n\t\tPrepareForwardFunctionsWithJumpsToAsm();\n\t\tStartProxyCreationThread(dllFilePath);\n\t}\n\n\tstd::string GetModuleFileNameFromModuleHandle(HMODULE handle)\n\t{\n\t\tstd::string moduleFileName = \"\";\n\t\tchar lpFilename[MAX_PATH];\n\t\tGetModuleFileNameA(handle, lpFilename, sizeof(lpFilename));\n\t\tchar* lastSlashPos = strrchr(lpFilename, '\\\\');\n\t\tif (lastSlashPos != nullptr)\n\t\t{\n\t\t\tmoduleFileName = lastSlashPos;\n\t\t\tmoduleFileName = moduleFileName.substr(1, moduleFileName.length());\n\t\t}\n\t\tLog(\"Module name: \", moduleFileName.c_str());\n\n\t\tif (moduleFileName == \"\")\n\t\t{\n\t\t\tLogAndThrow(\"Could not get module name from module handle\");\n\t\t}\n\t\treturn moduleFileName;\n\t}\n\n\tstd::string FindOriginalDLL(std::string dllFileName, std::string specificPathToSearch = \"\")\n\t{\n\t\tstd::string dllPath = \"\";\n\t\tif (specificPathToSearch != \"\")\n\t\t{\n\t\t\tdllPath = SearchForDLLInSpecificPath(dllFileName, specificPathToSearch);\n\t\t}\n\t\t\n\t\tif (dllPath == \"\")\n\t\t{\n\t\t\tdllPath = SearchForDLLUsingStandardSearchOrder(dllFileName);\n\t\t}\n\n\t\tif (dllPath == \"\")\n\t\t{\n\t\t\tLogAndThrow(\"Could not find DLL to proxy\");\n\t\t}\n\n\t\tLog(\"DLL found: \", dllPath);\n\t\treturn dllPath;\n\t}\n\n\tstd::string SearchForDLLInSpecificPath(std::string dllFileName, std::string specificPath)\n\t{\n\t\tstd::string dllPath = specificPath + \"\\\\\" + dllFileName;\n\t\tif (!DoesFileExist(dllPath))\n\t\t{\n\t\t\treturn \"\";\n\t\t}\n\t\treturn dllPath;\n\t}\n\n\tstd::string SearchForDLLUsingStandardSearchOrder(std::string dllFileName)\n\t{\n\t\tstd::string dllPath = SearchForDLLInCurrentFolder(\"_\" + dllFileName);\n\t\tif (dllPath == \"\")\n\t\t{\n\t\t\tdllPath = SearchForDLLInSystemFolder(dllFileName);\n\t\t}\n\t\treturn dllPath;\n\t}\n\n\tstd::string SearchForDLLInCurrentFolder(std::string dllFileName)\n\t{\n\t\tstd::string dllPath = \".\\\\\" + dllFileName;\n\t\tif (!DoesFileExist(dllPath))\n\t\t{\n\t\t\treturn \"\";\n\t\t}\n\t\treturn dllPath;\n\t}\n\n\tstd::string SearchForDLLInSystemFolder(std::string dllFileName)\n\t{\n\t\tchar lpBuffer[MAX_PATH];\n\t\tUINT pathLength = GetSystemDirectoryA(lpBuffer, sizeof(lpBuffer));\n\t\tstd::string systemFolderPath = lpBuffer;\n\t\tstd::string dllPath = systemFolderPath + \"\\\\\" + dllFileName;\n\t\tif (!DoesFileExist(dllPath))\n\t\t{\n\t\t\treturn \"\";\n\t\t}\n\t\treturn dllPath;\n\t}\n\n\tbool DoesFileExist(std::string filePath)\n\t{\n\t\tstd::ifstream file(filePath);\n\t\tif (file.is_open())\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tstd::vector<unsigned char> LoadFileToVectorOfBytes(std::string filePath)\n\t{\n\t\tstd::ifstream file;\n\t\tfile.open(filePath, std::ios::in | std::ios::binary);\n\t\tif (!file.is_open())\n\t\t{\n\t\t\tLogAndThrow(\"Failed to read DLL: \" + filePath);\n\t\t}\n\t\treturn std::vector<unsigned char>(std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>());\n\t}\n\n\tvoid ReadRequiredDataFromDLLExportTable(std::string dllFilePath)\n\t{\n\t\tvoid* peHeaderBase = &dllMemory[0];\n\t\tPIMAGE_DOS_HEADER dosHeader = GetDLLDosHeader(peHeaderBase);\n\t\tPIMAGE_NT_HEADERS ntHeaders = GetDLLNtHeaders(dosHeader);\n\t\tPIMAGE_OPTIONAL_HEADER optionalHeader = &ntHeaders->OptionalHeader;\n\t\tPIMAGE_FILE_HEADER fileHeader = &ntHeaders->FileHeader;\n\n\t\tSetSectionHeadersInfo(fileHeader, optionalHeader);\n\n\t\tPIMAGE_EXPORT_DIRECTORY exportDirectory = GetExportDirectory(optionalHeader);\n\t\tDWORD numberOfExports = exportDirectory->NumberOfFunctions;\n\t\tDWORD numberOfNamedExports = exportDirectory->NumberOfNames;\n\t\tLog(\"Number of exports: \", numberOfExports);\n\n\t\tuintptr_t tableOfRvaPointersToExportNames = RvaToRawAddress(exportDirectory->AddressOfNames);\n\t\tuintptr_t tableOfNameOrdinals = RvaToRawAddress(exportDirectory->AddressOfNameOrdinals);\n\t\tuintptr_t tableOfRvaPointersToExportAddresses = RvaToRawAddress(exportDirectory->AddressOfFunctions);\n\t\t\n\t\tstd::map<WORD, WORD> indicesOfNamePointersInOrdinalOrder;\n\t\tstd::vector<WORD> buffer(numberOfNamedExports, 0);\n\t\tMemCopy((uintptr_t)&buffer[0], (uintptr_t)tableOfNameOrdinals, numberOfNamedExports * sizeof(WORD));\n\t\tfor (WORD i = 0; i < numberOfExports; i++)\n\t\t{\n\t\t\tauto it = std::find(buffer.begin(), buffer.end(), i);\n\t\t\tif (it != buffer.end())\n\t\t\t{\n\t\t\t\tWORD bufferIndex = (WORD)(it - buffer.begin());\n\t\t\t\tindicesOfNamePointersInOrdinalOrder[i] = bufferIndex;\n\t\t\t}\n\t\t}\n\n\t\tfor (WORD i = 0; i < numberOfExports; i++)\n\t\t{\n\t\t\tExportData exportData;\n\n\t\t\tif (indicesOfNamePointersInOrdinalOrder.find(i) != indicesOfNamePointersInOrdinalOrder.end())\n\t\t\t{\n\t\t\t\tDWORD* exportNameAddress = ((DWORD*)tableOfRvaPointersToExportNames + indicesOfNamePointersInOrdinalOrder[i]);\n\t\t\t\texportData.name = (char*)RvaToRawAddress(*exportNameAddress);\n\t\t\t}\n\t\t\texportData.ordinal = (WORD)exportDirectory->Base + i;\n\t\t\texportData.relativeAddress = *((DWORD*)tableOfRvaPointersToExportAddresses + i);\n\n\t\t\tLog(\"Export name: \", exportData.name);\n\t\t\tLog(\"Export ordinal: \", exportData.ordinal);\n\t\t\tLog(\"Export RVA: \", NumberToHexString(exportData.relativeAddress));\n\n\t\t\tbool exportIsUnnamed = exportData.name == \"N/A\";\n\t\t\tbool exportIsShared = sharedExports.find(exportData.name) != sharedExports.end();\n\t\t\tif (exportIsUnnamed)\n\t\t\t{\n\t\t\t\texportData.forwardFunctionAddress = forwardOrdinalAddresses[exportData.ordinal - 1];\n\t\t\t}\n\t\t\telse if (exportIsShared)\n\t\t\t{\n\t\t\t\texportData.forwardFunctionAddress = forwardSharedAddresses[sharedExports[exportData.name]];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\texportData.forwardFunctionAddress = forwardAddresses[i];\n\t\t\t}\n\n\t\t\tmanagedExports.push_back(exportData);\n\t\t}\n\t}\n\n\tPIMAGE_DOS_HEADER GetDLLDosHeader(void* peHeaderBase)\n\t{\n\t\tPIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER)peHeaderBase;\n\t\tif (dosHeader->e_magic != IMAGE_DOS_SIGNATURE)\n\t\t{\n\t\t\tLogAndThrow(\"Incorrect DOS signature\");\n\t\t}\n\t\treturn dosHeader;\n\t}\n\n\tPIMAGE_NT_HEADERS GetDLLNtHeaders(PIMAGE_DOS_HEADER dosHeader)\n\t{\n\t\tPIMAGE_NT_HEADERS ntHeaders = (PIMAGE_NT_HEADERS)((unsigned char*)dosHeader + dosHeader->e_lfanew);\n\t\tif (ntHeaders->Signature != IMAGE_NT_SIGNATURE)\n\t\t{\n\t\t\tLogAndThrow(\"Incorrect NT signature\");\n\t\t}\n\t\treturn ntHeaders;\n\t}\n\n\tvoid SetSectionHeadersInfo(PIMAGE_FILE_HEADER fileHeader, PIMAGE_OPTIONAL_HEADER optionalHeader)\n\t{\n\t\tDWORD sizeOfOptionalHeader = fileHeader->SizeOfOptionalHeader;\n\t\tsectionHeadersBase = (PIMAGE_SECTION_HEADER)((unsigned char*)optionalHeader + sizeOfOptionalHeader);\n\t\tnumSections = fileHeader->NumberOfSections;\n\t}\n\n\tPIMAGE_EXPORT_DIRECTORY GetExportDirectory(PIMAGE_OPTIONAL_HEADER optionalHeader)\n\t{\n\t\tPIMAGE_DATA_DIRECTORY exportDataDirectory = &(optionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]);\n\t\tPIMAGE_EXPORT_DIRECTORY exportDirectory = (PIMAGE_EXPORT_DIRECTORY)RvaToRawAddress(exportDataDirectory->VirtualAddress);\n\t\treturn exportDirectory;\n\t}\n\n\tuintptr_t RvaToRawAddress(DWORD rva)\n\t{\n\t\tfor (DWORD i = 0; i < numSections; i++)\n\t\t{\n\t\t\tPIMAGE_SECTION_HEADER section = sectionHeadersBase + i;\n\t\t\tDWORD sectionVirtualBegin = section->VirtualAddress;\n\t\t\tDWORD sectionVirtualEnd = section->VirtualAddress + section->Misc.VirtualSize;\n\t\t\tbool isWithinSection = rva >= sectionVirtualBegin && rva <= sectionVirtualEnd;\n\t\t\tif (isWithinSection)\n\t\t\t{\n\t\t\t\tuintptr_t moduleBaseAddress = (uintptr_t)&dllMemory[0];\n\t\t\t\tuintptr_t rawAddress = (uintptr_t)((section->PointerToRawData + (rva - section->VirtualAddress)) + moduleBaseAddress);\n\t\t\t\treturn rawAddress;\n\t\t\t}\n\t\t}\n\n\t\tLogAndThrow(\"Could not convert RVA to raw address\");\n\t\treturn 0;\n\t}\n\n\tvoid PrepareForwardFunctionsWithJumpsToAsm()\n\t{\n\t\tfor (auto& managedExport : managedExports)\n\t\t{\n\t\t\tmanagedExport.asmCodeAddress = CreateMemoryWithAssemblyForwardingCode();\n\t\t\tHook((uintptr_t)managedExport.forwardFunctionAddress, managedExport.asmCodeAddress);\n\n\t\t\tbool exportIsNamed = managedExport.name != \"N/A\";\n\t\t\tif (exportIsNamed)\n\t\t\t{\n\t\t\t\tHook((uintptr_t)forwardOrdinalAddresses[managedExport.ordinal - 1], managedExport.asmCodeAddress);\n\t\t\t}\n\n\t\t\tLog(\"Prepared forward function \", NumberToHexString((uintptr_t)managedExport.forwardFunctionAddress));\n\t\t}\n\t}\n\n\tuintptr_t CreateMemoryWithAssemblyForwardingCode()\n\t{\n\t\tstd::vector<unsigned char> asmBytes;\n\t\tsize_t asmOffsetOfBoolAddress = 0;\n#ifndef _WIN64\n\t\tasmBytes = GetAsmForwardingCode32();\n\t\tasmOffsetOfBoolAddress = 1;\n#else\n\t\tasmBytes = GetAsmForwardingCode64();\n\t\tasmOffsetOfBoolAddress = 2;\n#endif\n\n\t\tvoid* pointerToBool = &isProxyReady;\n\t\tMemCopy((uintptr_t)&asmBytes[asmOffsetOfBoolAddress], (uintptr_t)&pointerToBool, sizeof(uintptr_t));\n\n\t\tuintptr_t memoryAddress = (uintptr_t)VirtualAlloc(NULL, asmBytes.size(), MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);\n\t\tif (memoryAddress == NULL)\n\t\t{\n\t\t\tLogAndThrow(\"Failed to allocate memory\");\n\t\t}\n\n\t\tMemCopy((uintptr_t)memoryAddress, (uintptr_t)&asmBytes[0], asmBytes.size());\n\t\tLog(\"Created assembly forwarding code at \", NumberToHexString(memoryAddress));\n\n\t\treturn memoryAddress;\n\t}\n\n\tstd::vector<unsigned char> GetAsmForwardingCode32()\n\t{\n\t\tstd::vector<unsigned char> asmBytes =\n\t\t{\n\t\t\t0xb8, 0x00, 0x00, 0x00, 0x00, // mov eax,isProxyReady\n\t\t\t0x38, 0x00, // cmp [eax],al\n\t\t\t0x74, 0x05, // je <spinwait>\n\t\t\t// <jmptofunc>:\n\t\t\t0xe9, 0x00, 0x00, 0x00, 0x00, // jmp funcAddr\n\t\t\t// <spinwait>:\n\t\t\t0xf3, 0x90, // pause\n\t\t\t0xf0, 0x00, 0x00, // lock add [eax],al\n\t\t\t0x74, 0xf9, // je <spinwait>\n\t\t\t0xe9, 0xef, 0xff, 0xff, 0xff // jmp <jmptofunc>\n\t\t};\n\t\treturn asmBytes;\n\t}\n\n\tstd::vector<unsigned char> GetAsmForwardingCode64()\n\t{\n\t\tstd::vector<unsigned char> asmBytes = {\n\t\t\t// Courtesy of my buddy Dasaav\n\t\t\t0x48, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // mov rax,isProxyReady\n\t\t\t0x38, 0x00, // cmp [rax],al\n\t\t\t0x74, 0x06, // je <spinwait>\n\t\t\t0xff, 0x25, 0x0d, 0x00, 0x00, 0x00,  // jmp qword ptr [funcAddr]\n\t\t\t// <spinwait>:\n\t\t\t0xf3, 0x90, // pause\n\t\t\t0xf0, 0x00, 0x00, // lock add [rax],al\n\t\t\t0x74, 0xf9, // je <spinwait>\n\t\t\t0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // jmp funcAddr\n\t\t};\n\t\treturn asmBytes;\n\t}\n\n\tvoid StartProxyCreationThread(std::string originalDllPath)\n\t{\n\t\t// Thread will run only after DllMain is finished!\n\t\t// This is enforced by the DLL loader. This means any calls to LoadLibrary, etc. is safe.\n\t\tstd::string* dllPath = new std::string(originalDllPath);\n\t\tCreateThread(0, 0, &ThreadCreateProxy, dllPath, 0, NULL);\n\t}\n\t\n\tDWORD WINAPI ThreadCreateProxy(LPVOID lpParam)\n\t{\n\t\tLog(\"Starting proxy creation thread...\");\n\n\t\tstd::string dllPath = *(std::string*)lpParam;\n\t\tdelete (std::string*)lpParam;\n\t\tHMODULE originalDll = LoadLibraryA(dllPath.c_str());\n\t\tif (!originalDll)\n\t\t{\n\t\t\tLogAndThrow(\"LoadLibrary call for original DLL failed!\");\n\t\t}\n\t\tLog(\"Module base address: \", NumberToHexString(originalDll));\n\n\t\tInjectFunctionAddressesIntoAsmForwardingCode(originalDll);\n\n\t\t// We have created/modified instructions, flush the CPU instruction cache just in case\n\t\tFlushInstructionCache(GetCurrentProcess(), NULL, NULL);\n\n\t\tisProxyReady = true;\n\t\tLog(\"Proxy creation finished\");\n\n\t\treturn 0;\n\t}\n\n\tvoid InjectFunctionAddressesIntoAsmForwardingCode(HMODULE module)\n\t{\n#ifndef _WIN64\n\t\tInjectFunctionAddresses32(module);\n#else \n\t\tInjectFunctionAddresses64(module);\n#endif\n\t}\n\n\tvoid InjectFunctionAddresses32(HMODULE module)\n\t{\n\t\tconst size_t asmOffsetOfJmpAddr = 10;\n\t\tfor (auto& managedExport : managedExports)\n\t\t{\n\t\t\tuintptr_t exportAbsoluteAddress = (uintptr_t)module + managedExport.relativeAddress;\n\t\t\tuintptr_t jumpTargetAddress = exportAbsoluteAddress;\n\t\t\tLog(\"Export absolute address: \", NumberToHexString(exportAbsoluteAddress));\n\n\t\t\tbool isCallbackRegistered = callbacks.find(managedExport.name) != callbacks.end();\n\t\t\tif (isCallbackRegistered)\n\t\t\t{\n\t\t\t\tauto& callback = callbacks[managedExport.name];\n\t\t\t\tcallback.returnAddress = exportAbsoluteAddress;\n\t\t\t\tjumpTargetAddress = callback.callbackAddress;\n\t\t\t\tLog(\"Added callback in \", managedExport.name, \" to \", NumberToHexString(callback.callbackAddress));\n\t\t\t}\n\n\t\t\tint32_t relativeDisplacement = CalculateDisplacementForRelativeJump(managedExport.asmCodeAddress + asmOffsetOfJmpAddr - 1, jumpTargetAddress);\n\t\t\tMemCopy(managedExport.asmCodeAddress + asmOffsetOfJmpAddr, (uintptr_t)&relativeDisplacement, sizeof(uintptr_t));\n\t\t}\n\t}\n\n\tvoid InjectFunctionAddresses64(HMODULE module)\n\t{\n\t\tconst size_t asmOffsetOfJmpAddr = 33;\n\t\tfor (auto& managedExport : managedExports)\n\t\t{\n\t\t\tuintptr_t exportAbsoluteAddress = (uintptr_t)module + managedExport.relativeAddress;\n\t\t\tuintptr_t jumpTargetAddress = exportAbsoluteAddress;\n\t\t\tLog(\"Export absolute address: \", NumberToHexString(exportAbsoluteAddress));\n\n\t\t\tbool isCallbackRegistered = callbacks.find(managedExport.name) != callbacks.end();\n\t\t\tif (isCallbackRegistered)\n\t\t\t{\n\t\t\t\tauto& callback = callbacks[managedExport.name];\n\t\t\t\tcallback.returnAddress = exportAbsoluteAddress;\n\t\t\t\tjumpTargetAddress = callback.callbackAddress;\n\t\t\t\tLog(\"Added callback in \", managedExport.name, \" to \", NumberToHexString(callback.callbackAddress));\n\t\t\t}\n\n\t\t\tMemCopy(managedExport.asmCodeAddress + asmOffsetOfJmpAddr, (uintptr_t)&jumpTargetAddress, sizeof(uintptr_t));\n\t\t}\n\t}\n\n\tvoid Hook(uintptr_t address, uintptr_t destination, size_t extraClearance)\n\t{\n\t\tsize_t clearance = 0;\n#ifndef _WIN64\n\t\tclearance = 5 + extraClearance;\n\t\tHook32(address, destination, extraClearance);\n#else\n\t\tclearance = 14 + extraClearance;\n\t\tHook64(address, destination, extraClearance);\n#endif\n\t\tLog(\"Created jump from \", NumberToHexString(address), \" to \", NumberToHexString(destination), \" with a clearance of \", clearance);\n\t}\n\n\tvoid Hook32(uintptr_t address, uintptr_t destination, size_t clearance)\n\t{\n\t\tMemSet(address, 0x90, clearance);\n\t\tunsigned char jumpByte = 0xe9;\n\t\tMemCopy(address, (uintptr_t)&jumpByte, 1);\n\t\tint32_t relativeDisplacement = CalculateDisplacementForRelativeJump(address, destination);\n\t\tMemCopy(address + 1, (uintptr_t)&relativeDisplacement, sizeof(uintptr_t));\n\t}\n\n\tvoid Hook64(uintptr_t address, uintptr_t destination, size_t clearance)\n\t{\n\t\tMemSet(address, 0x90, clearance);\n\t\tstd::vector<unsigned char> jumpBytes = { 0xff, 0x25, 0x00, 0x00, 0x00, 0x00 };\n\t\tMemCopy(address, (uintptr_t)&jumpBytes[0], jumpBytes.size());\n\t\tMemCopy((address + 6), (uintptr_t)&destination, sizeof(uintptr_t));\n\t}\n\n\tint32_t CalculateDisplacementForRelativeJump(uintptr_t relativeJumpAddress, uintptr_t destinationAddress)\n\t{\n\t\tconst size_t sizeOfE9Jmp = 5;\n\t\treturn -int32_t(relativeJumpAddress + sizeOfE9Jmp - destinationAddress);\n\t}\n\n\tvoid MemCopy(uintptr_t destination, uintptr_t source, size_t numBytes)\n\t{\n\t\tToggleMemoryProtection(false, destination, numBytes);\n\t\tToggleMemoryProtection(false, source, numBytes);\n\t\tmemcpy((void*)destination, (void*)source, numBytes);\n\t\tToggleMemoryProtection(true, source, numBytes);\n\t\tToggleMemoryProtection(true, destination, numBytes);\n\t}\n\n\tvoid MemSet(uintptr_t address, unsigned char byte, size_t numBytes)\n\t{\n\t\tToggleMemoryProtection(false, address, numBytes);\n\t\tmemset((void*)address, byte, numBytes);\n\t\tToggleMemoryProtection(true, address, numBytes);\n\t}\n\n\tvoid ToggleMemoryProtection(bool enableProtection, uintptr_t address, size_t size)\n\t{\n\t\tstatic std::map<uintptr_t, DWORD> protectionHistory;\n\t\tif (enableProtection && protectionHistory.find(address) != protectionHistory.end())\n\t\t{\n\t\t\tVirtualProtect((void*)address, size, protectionHistory[address], &protectionHistory[address]);\n\t\t\tprotectionHistory.erase(address);\n\t\t}\n\t\telse if (!enableProtection && protectionHistory.find(address) == protectionHistory.end())\n\t\t{\n\t\t\tDWORD oldProtection = 0;\n\t\t\tVirtualProtect((void*)address, size, PAGE_EXECUTE_READWRITE, &oldProtection);\n\t\t\tprotectionHistory[address] = oldProtection;\n\t\t}\n\t}\n\n\tvoid LogAndThrow(std::string exceptionMessage)\n\t{\n\t\tLog(\"UniversalProxyDLL > Exception thrown: \", exceptionMessage);\n\t\tthrow std::runtime_error(exceptionMessage);\n\t}\n\n\ttemplate<typename... Types>\n\tvoid Log(Types... args)\n\t{\n\t\tif (muteLogging)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif (!logFile.is_open())\n\t\t{\n\t\t\tlogFile.open(\"upd_log.txt\");\n\t\t}\n\n\t\tstd::stringstream stream;\n\t\tstream << \"UniversalProxyDLL > \";\n\n\t\t// Magic to fold variadic arguments prior to C++17\n\t\t// https://stackoverflow.com/a/55717030\n\t\t// If it doesn't work for you, switch to C++17 and replace the code block with:\n\t\t// (stream << ... << args) << std::endl;\n\t\t// std::cout << stream.str();\n\t\tusing do_ = int[];\n\t\tdo_{ 0, (stream << args, 0)... };\n\t\tstd::cout << stream.str() << std::endl;\n\n\t\tif (logFile.is_open())\n\t\t{\n\t\t\tlogFile << stream.str() << std::endl;\n\t\t\tlogFile.flush();\n\t\t}\n\t}\n\n\ttemplate<typename T>\n\tstd::string NumberToHexString(T number)\n\t{\n\t\tstd::stringstream stream;\n\t\tstream\n\t\t\t<< std::setfill('0')\n\t\t\t<< std::setw(sizeof(T) * 2)\n\t\t\t<< std::hex\n\t\t\t<< number;\n\t\treturn stream.str();\n\t}\n\n\tvoid MuteLogging(bool mute = true)\n\t{\n\t\tmuteLogging = mute;\n\t}\n\n\tvoid OpenDebugTerminal()\n\t{\n\t\tif (AllocConsole())\n\t\t{\n\t\t\tfreopen_s((FILE**)stdout, \"CONOUT$\", \"w\", stdout);\n\t\t\tSetWindowText(GetConsoleWindow(), \"UPD\");\n\t\t}\n\t}\n}\n\n// Macro hell begins!\n\n#define GenerateForwardFunction(N) extern \"C\" const char* Forward##N() { return(\"F\"#N); }\n#define GenerateForwardOrdinalFunction(N) extern \"C\" const char* ForwardOrdinal##N() { return (\"FO\"#N); }\n#define GenerateForwardSharedFunction(N) extern \"C\" const char* ForwardShared##N() { return (\"FS\"#N); }\n\nGenerateForwardFunction(0) GenerateForwardFunction(1) GenerateForwardFunction(2) GenerateForwardFunction(3) GenerateForwardFunction(4) GenerateForwardFunction(5) GenerateForwardFunction(6) GenerateForwardFunction(7) GenerateForwardFunction(8) GenerateForwardFunction(9) GenerateForwardFunction(10) GenerateForwardFunction(11) GenerateForwardFunction(12) GenerateForwardFunction(13) GenerateForwardFunction(14) GenerateForwardFunction(15) GenerateForwardFunction(16) GenerateForwardFunction(17) GenerateForwardFunction(18) GenerateForwardFunction(19) GenerateForwardFunction(20) GenerateForwardFunction(21) GenerateForwardFunction(22) GenerateForwardFunction(23) GenerateForwardFunction(24) GenerateForwardFunction(25) GenerateForwardFunction(26) GenerateForwardFunction(27) GenerateForwardFunction(28) GenerateForwardFunction(29) GenerateForwardFunction(30) GenerateForwardFunction(31) GenerateForwardFunction(32) GenerateForwardFunction(33) GenerateForwardFunction(34) GenerateForwardFunction(35) GenerateForwardFunction(36) GenerateForwardFunction(37) GenerateForwardFunction(38) GenerateForwardFunction(39) GenerateForwardFunction(40) GenerateForwardFunction(41) GenerateForwardFunction(42) GenerateForwardFunction(43) GenerateForwardFunction(44) GenerateForwardFunction(45) GenerateForwardFunction(46) GenerateForwardFunction(47) GenerateForwardFunction(48) GenerateForwardFunction(49)\nGenerateForwardFunction(50) GenerateForwardFunction(51) GenerateForwardFunction(52) GenerateForwardFunction(53) GenerateForwardFunction(54) GenerateForwardFunction(55) GenerateForwardFunction(56) GenerateForwardFunction(57) GenerateForwardFunction(58) GenerateForwardFunction(59) GenerateForwardFunction(60) GenerateForwardFunction(61) GenerateForwardFunction(62) GenerateForwardFunction(63) GenerateForwardFunction(64) GenerateForwardFunction(65) GenerateForwardFunction(66) GenerateForwardFunction(67) GenerateForwardFunction(68) GenerateForwardFunction(69) GenerateForwardFunction(70) GenerateForwardFunction(71) GenerateForwardFunction(72) GenerateForwardFunction(73) GenerateForwardFunction(74) GenerateForwardFunction(75) GenerateForwardFunction(76) GenerateForwardFunction(77) GenerateForwardFunction(78) GenerateForwardFunction(79) GenerateForwardFunction(80) GenerateForwardFunction(81) GenerateForwardFunction(82) GenerateForwardFunction(83) GenerateForwardFunction(84) GenerateForwardFunction(85) GenerateForwardFunction(86) GenerateForwardFunction(87) GenerateForwardFunction(88) GenerateForwardFunction(89) GenerateForwardFunction(90) GenerateForwardFunction(91) GenerateForwardFunction(92) GenerateForwardFunction(93) GenerateForwardFunction(94) GenerateForwardFunction(95) GenerateForwardFunction(96) GenerateForwardFunction(97) GenerateForwardFunction(98) GenerateForwardFunction(99)\nGenerateForwardFunction(100) GenerateForwardFunction(101) GenerateForwardFunction(102) GenerateForwardFunction(103) GenerateForwardFunction(104) GenerateForwardFunction(105) GenerateForwardFunction(106) GenerateForwardFunction(107) GenerateForwardFunction(108) GenerateForwardFunction(109) GenerateForwardFunction(110) GenerateForwardFunction(111) GenerateForwardFunction(112) GenerateForwardFunction(113) GenerateForwardFunction(114) GenerateForwardFunction(115) GenerateForwardFunction(116) GenerateForwardFunction(117) GenerateForwardFunction(118) GenerateForwardFunction(119) GenerateForwardFunction(120) GenerateForwardFunction(121) GenerateForwardFunction(122) GenerateForwardFunction(123) GenerateForwardFunction(124) GenerateForwardFunction(125) GenerateForwardFunction(126) GenerateForwardFunction(127) GenerateForwardFunction(128) GenerateForwardFunction(129) GenerateForwardFunction(130) GenerateForwardFunction(131) GenerateForwardFunction(132) GenerateForwardFunction(133) GenerateForwardFunction(134) GenerateForwardFunction(135) GenerateForwardFunction(136) GenerateForwardFunction(137) GenerateForwardFunction(138) GenerateForwardFunction(139) GenerateForwardFunction(140) GenerateForwardFunction(141) GenerateForwardFunction(142) GenerateForwardFunction(143) GenerateForwardFunction(144) GenerateForwardFunction(145) GenerateForwardFunction(146) GenerateForwardFunction(147) GenerateForwardFunction(148) GenerateForwardFunction(149)\nGenerateForwardFunction(150) GenerateForwardFunction(151) GenerateForwardFunction(152) GenerateForwardFunction(153) GenerateForwardFunction(154) GenerateForwardFunction(155) GenerateForwardFunction(156) GenerateForwardFunction(157) GenerateForwardFunction(158) GenerateForwardFunction(159) GenerateForwardFunction(160) GenerateForwardFunction(161) GenerateForwardFunction(162) GenerateForwardFunction(163) GenerateForwardFunction(164) GenerateForwardFunction(165) GenerateForwardFunction(166) GenerateForwardFunction(167) GenerateForwardFunction(168) GenerateForwardFunction(169) GenerateForwardFunction(170) GenerateForwardFunction(171) GenerateForwardFunction(172) GenerateForwardFunction(173) GenerateForwardFunction(174) GenerateForwardFunction(175) GenerateForwardFunction(176) GenerateForwardFunction(177) GenerateForwardFunction(178) GenerateForwardFunction(179) GenerateForwardFunction(180) GenerateForwardFunction(181) GenerateForwardFunction(182) GenerateForwardFunction(183) GenerateForwardFunction(184) GenerateForwardFunction(185) GenerateForwardFunction(186) GenerateForwardFunction(187) GenerateForwardFunction(188) GenerateForwardFunction(189) GenerateForwardFunction(190) GenerateForwardFunction(191) GenerateForwardFunction(192) GenerateForwardFunction(193) GenerateForwardFunction(194) GenerateForwardFunction(195) GenerateForwardFunction(196) GenerateForwardFunction(197) GenerateForwardFunction(198) GenerateForwardFunction(199)\nGenerateForwardFunction(200) GenerateForwardFunction(201) GenerateForwardFunction(202) GenerateForwardFunction(203) GenerateForwardFunction(204) GenerateForwardFunction(205) GenerateForwardFunction(206) GenerateForwardFunction(207) GenerateForwardFunction(208) GenerateForwardFunction(209) GenerateForwardFunction(210) GenerateForwardFunction(211) GenerateForwardFunction(212) GenerateForwardFunction(213) GenerateForwardFunction(214) GenerateForwardFunction(215) GenerateForwardFunction(216) GenerateForwardFunction(217) GenerateForwardFunction(218) GenerateForwardFunction(219) GenerateForwardFunction(220) GenerateForwardFunction(221) GenerateForwardFunction(222) GenerateForwardFunction(223) GenerateForwardFunction(224) GenerateForwardFunction(225) GenerateForwardFunction(226) GenerateForwardFunction(227) GenerateForwardFunction(228) GenerateForwardFunction(229) GenerateForwardFunction(230) GenerateForwardFunction(231) GenerateForwardFunction(232) GenerateForwardFunction(233) GenerateForwardFunction(234) GenerateForwardFunction(235) GenerateForwardFunction(236) GenerateForwardFunction(237) GenerateForwardFunction(238) GenerateForwardFunction(239) GenerateForwardFunction(240) GenerateForwardFunction(241) GenerateForwardFunction(242) GenerateForwardFunction(243) GenerateForwardFunction(244) GenerateForwardFunction(245) GenerateForwardFunction(246) GenerateForwardFunction(247) GenerateForwardFunction(248) GenerateForwardFunction(249)\nGenerateForwardFunction(250) GenerateForwardFunction(251) GenerateForwardFunction(252) GenerateForwardFunction(253) GenerateForwardFunction(254) GenerateForwardFunction(255) GenerateForwardFunction(256) GenerateForwardFunction(257) GenerateForwardFunction(258) GenerateForwardFunction(259) GenerateForwardFunction(260) GenerateForwardFunction(261) GenerateForwardFunction(262) GenerateForwardFunction(263) GenerateForwardFunction(264) GenerateForwardFunction(265) GenerateForwardFunction(266) GenerateForwardFunction(267) GenerateForwardFunction(268) GenerateForwardFunction(269) GenerateForwardFunction(270) GenerateForwardFunction(271) GenerateForwardFunction(272) GenerateForwardFunction(273) GenerateForwardFunction(274) GenerateForwardFunction(275) GenerateForwardFunction(276) GenerateForwardFunction(277) GenerateForwardFunction(278) GenerateForwardFunction(279) GenerateForwardFunction(280) GenerateForwardFunction(281) GenerateForwardFunction(282) GenerateForwardFunction(283) GenerateForwardFunction(284) GenerateForwardFunction(285) GenerateForwardFunction(286) GenerateForwardFunction(287) GenerateForwardFunction(288) GenerateForwardFunction(289) GenerateForwardFunction(290) GenerateForwardFunction(291) GenerateForwardFunction(292) GenerateForwardFunction(293) GenerateForwardFunction(294) GenerateForwardFunction(295) GenerateForwardFunction(296) GenerateForwardFunction(297) GenerateForwardFunction(298) GenerateForwardFunction(299)\nGenerateForwardFunction(300) GenerateForwardFunction(301) GenerateForwardFunction(302) GenerateForwardFunction(303) GenerateForwardFunction(304) GenerateForwardFunction(305) GenerateForwardFunction(306) GenerateForwardFunction(307) GenerateForwardFunction(308) GenerateForwardFunction(309) GenerateForwardFunction(310) GenerateForwardFunction(311) GenerateForwardFunction(312) GenerateForwardFunction(313) GenerateForwardFunction(314) GenerateForwardFunction(315) GenerateForwardFunction(316) GenerateForwardFunction(317) GenerateForwardFunction(318) GenerateForwardFunction(319) GenerateForwardFunction(320) GenerateForwardFunction(321) GenerateForwardFunction(322) GenerateForwardFunction(323) GenerateForwardFunction(324) GenerateForwardFunction(325) GenerateForwardFunction(326) GenerateForwardFunction(327) GenerateForwardFunction(328) GenerateForwardFunction(329) GenerateForwardFunction(330) GenerateForwardFunction(331) GenerateForwardFunction(332) GenerateForwardFunction(333) GenerateForwardFunction(334) GenerateForwardFunction(335) GenerateForwardFunction(336) GenerateForwardFunction(337) GenerateForwardFunction(338) GenerateForwardFunction(339) GenerateForwardFunction(340) GenerateForwardFunction(341) GenerateForwardFunction(342) GenerateForwardFunction(343) GenerateForwardFunction(344) GenerateForwardFunction(345) GenerateForwardFunction(346) GenerateForwardFunction(347) GenerateForwardFunction(348) GenerateForwardFunction(349)\nGenerateForwardFunction(350) GenerateForwardFunction(351) GenerateForwardFunction(352) GenerateForwardFunction(353) GenerateForwardFunction(354) GenerateForwardFunction(355) GenerateForwardFunction(356) GenerateForwardFunction(357) GenerateForwardFunction(358) GenerateForwardFunction(359) GenerateForwardFunction(360) GenerateForwardFunction(361) GenerateForwardFunction(362) GenerateForwardFunction(363) GenerateForwardFunction(364) GenerateForwardFunction(365) GenerateForwardFunction(366) GenerateForwardFunction(367) GenerateForwardFunction(368) GenerateForwardFunction(369) GenerateForwardFunction(370) GenerateForwardFunction(371) GenerateForwardFunction(372) GenerateForwardFunction(373) GenerateForwardFunction(374) GenerateForwardFunction(375) GenerateForwardFunction(376) GenerateForwardFunction(377) GenerateForwardFunction(378) GenerateForwardFunction(379) GenerateForwardFunction(380) GenerateForwardFunction(381) GenerateForwardFunction(382) GenerateForwardFunction(383) GenerateForwardFunction(384) GenerateForwardFunction(385) GenerateForwardFunction(386) GenerateForwardFunction(387) GenerateForwardFunction(388) GenerateForwardFunction(389) GenerateForwardFunction(390) GenerateForwardFunction(391) GenerateForwardFunction(392) GenerateForwardFunction(393) GenerateForwardFunction(394) GenerateForwardFunction(395) GenerateForwardFunction(396) GenerateForwardFunction(397) GenerateForwardFunction(398) GenerateForwardFunction(399)\nGenerateForwardFunction(400) GenerateForwardFunction(401) GenerateForwardFunction(402) GenerateForwardFunction(403) GenerateForwardFunction(404) GenerateForwardFunction(405) GenerateForwardFunction(406) GenerateForwardFunction(407) GenerateForwardFunction(408) GenerateForwardFunction(409) GenerateForwardFunction(410) GenerateForwardFunction(411) GenerateForwardFunction(412) GenerateForwardFunction(413) GenerateForwardFunction(414) GenerateForwardFunction(415) GenerateForwardFunction(416) GenerateForwardFunction(417) GenerateForwardFunction(418) GenerateForwardFunction(419) GenerateForwardFunction(420) GenerateForwardFunction(421) GenerateForwardFunction(422) GenerateForwardFunction(423) GenerateForwardFunction(424) GenerateForwardFunction(425) GenerateForwardFunction(426) GenerateForwardFunction(427) GenerateForwardFunction(428) GenerateForwardFunction(429) GenerateForwardFunction(430) GenerateForwardFunction(431) GenerateForwardFunction(432) GenerateForwardFunction(433) GenerateForwardFunction(434) GenerateForwardFunction(435) GenerateForwardFunction(436) GenerateForwardFunction(437) GenerateForwardFunction(438) GenerateForwardFunction(439) GenerateForwardFunction(440) GenerateForwardFunction(441) GenerateForwardFunction(442) GenerateForwardFunction(443) GenerateForwardFunction(444) GenerateForwardFunction(445) GenerateForwardFunction(446) GenerateForwardFunction(447) GenerateForwardFunction(448) GenerateForwardFunction(449)\nGenerateForwardFunction(450) GenerateForwardFunction(451) GenerateForwardFunction(452) GenerateForwardFunction(453) GenerateForwardFunction(454) GenerateForwardFunction(455) GenerateForwardFunction(456) GenerateForwardFunction(457) GenerateForwardFunction(458) GenerateForwardFunction(459) GenerateForwardFunction(460) GenerateForwardFunction(461) GenerateForwardFunction(462) GenerateForwardFunction(463) GenerateForwardFunction(464) GenerateForwardFunction(465) GenerateForwardFunction(466) GenerateForwardFunction(467) GenerateForwardFunction(468) GenerateForwardFunction(469) GenerateForwardFunction(470) GenerateForwardFunction(471) GenerateForwardFunction(472) GenerateForwardFunction(473) GenerateForwardFunction(474) GenerateForwardFunction(475) GenerateForwardFunction(476) GenerateForwardFunction(477) GenerateForwardFunction(478) GenerateForwardFunction(479) GenerateForwardFunction(480) GenerateForwardFunction(481) GenerateForwardFunction(482) GenerateForwardFunction(483) GenerateForwardFunction(484) GenerateForwardFunction(485) GenerateForwardFunction(486) GenerateForwardFunction(487) GenerateForwardFunction(488) GenerateForwardFunction(489) GenerateForwardFunction(490) GenerateForwardFunction(491) GenerateForwardFunction(492) GenerateForwardFunction(493) GenerateForwardFunction(494) GenerateForwardFunction(495) GenerateForwardFunction(496) GenerateForwardFunction(497) GenerateForwardFunction(498) GenerateForwardFunction(499)\nGenerateForwardFunction(500) GenerateForwardFunction(501) GenerateForwardFunction(502) GenerateForwardFunction(503) GenerateForwardFunction(504) GenerateForwardFunction(505) GenerateForwardFunction(506) GenerateForwardFunction(507) GenerateForwardFunction(508) GenerateForwardFunction(509) GenerateForwardFunction(510) GenerateForwardFunction(511) GenerateForwardFunction(512) GenerateForwardFunction(513) GenerateForwardFunction(514) GenerateForwardFunction(515) GenerateForwardFunction(516) GenerateForwardFunction(517) GenerateForwardFunction(518) GenerateForwardFunction(519) GenerateForwardFunction(520) GenerateForwardFunction(521) GenerateForwardFunction(522) GenerateForwardFunction(523) GenerateForwardFunction(524) GenerateForwardFunction(525) GenerateForwardFunction(526) GenerateForwardFunction(527) GenerateForwardFunction(528) GenerateForwardFunction(529) GenerateForwardFunction(530) GenerateForwardFunction(531) GenerateForwardFunction(532) GenerateForwardFunction(533) GenerateForwardFunction(534) GenerateForwardFunction(535) GenerateForwardFunction(536) GenerateForwardFunction(537) GenerateForwardFunction(538) GenerateForwardFunction(539) GenerateForwardFunction(540) GenerateForwardFunction(541) GenerateForwardFunction(542) GenerateForwardFunction(543) GenerateForwardFunction(544) GenerateForwardFunction(545) GenerateForwardFunction(546) GenerateForwardFunction(547) GenerateForwardFunction(548) GenerateForwardFunction(549)\nGenerateForwardFunction(550) GenerateForwardFunction(551) GenerateForwardFunction(552) GenerateForwardFunction(553) GenerateForwardFunction(554) GenerateForwardFunction(555) GenerateForwardFunction(556) GenerateForwardFunction(557) GenerateForwardFunction(558) GenerateForwardFunction(559) GenerateForwardFunction(560) GenerateForwardFunction(561) GenerateForwardFunction(562) GenerateForwardFunction(563) GenerateForwardFunction(564) GenerateForwardFunction(565) GenerateForwardFunction(566) GenerateForwardFunction(567) GenerateForwardFunction(568) GenerateForwardFunction(569) GenerateForwardFunction(570) GenerateForwardFunction(571) GenerateForwardFunction(572) GenerateForwardFunction(573) GenerateForwardFunction(574) GenerateForwardFunction(575) GenerateForwardFunction(576) GenerateForwardFunction(577) GenerateForwardFunction(578) GenerateForwardFunction(579) GenerateForwardFunction(580) GenerateForwardFunction(581) GenerateForwardFunction(582) GenerateForwardFunction(583) GenerateForwardFunction(584) GenerateForwardFunction(585) GenerateForwardFunction(586) GenerateForwardFunction(587) GenerateForwardFunction(588) GenerateForwardFunction(589) GenerateForwardFunction(590) GenerateForwardFunction(591) GenerateForwardFunction(592) GenerateForwardFunction(593) GenerateForwardFunction(594) GenerateForwardFunction(595) GenerateForwardFunction(596) GenerateForwardFunction(597) GenerateForwardFunction(598) GenerateForwardFunction(599)\nGenerateForwardFunction(600) GenerateForwardFunction(601) GenerateForwardFunction(602) GenerateForwardFunction(603) GenerateForwardFunction(604) GenerateForwardFunction(605) GenerateForwardFunction(606) GenerateForwardFunction(607) GenerateForwardFunction(608) GenerateForwardFunction(609) GenerateForwardFunction(610) GenerateForwardFunction(611) GenerateForwardFunction(612) GenerateForwardFunction(613) GenerateForwardFunction(614) GenerateForwardFunction(615) GenerateForwardFunction(616) GenerateForwardFunction(617) GenerateForwardFunction(618) GenerateForwardFunction(619) GenerateForwardFunction(620) GenerateForwardFunction(621) GenerateForwardFunction(622) GenerateForwardFunction(623) GenerateForwardFunction(624) GenerateForwardFunction(625) GenerateForwardFunction(626) GenerateForwardFunction(627) GenerateForwardFunction(628) GenerateForwardFunction(629) GenerateForwardFunction(630) GenerateForwardFunction(631) GenerateForwardFunction(632) GenerateForwardFunction(633) GenerateForwardFunction(634) GenerateForwardFunction(635) GenerateForwardFunction(636) GenerateForwardFunction(637) GenerateForwardFunction(638) GenerateForwardFunction(639) GenerateForwardFunction(640) GenerateForwardFunction(641) GenerateForwardFunction(642) GenerateForwardFunction(643) GenerateForwardFunction(644) GenerateForwardFunction(645) GenerateForwardFunction(646) GenerateForwardFunction(647) GenerateForwardFunction(648) GenerateForwardFunction(649)\nGenerateForwardFunction(650) GenerateForwardFunction(651) GenerateForwardFunction(652) GenerateForwardFunction(653) GenerateForwardFunction(654) GenerateForwardFunction(655) GenerateForwardFunction(656) GenerateForwardFunction(657) GenerateForwardFunction(658) GenerateForwardFunction(659) GenerateForwardFunction(660) GenerateForwardFunction(661) GenerateForwardFunction(662) GenerateForwardFunction(663) GenerateForwardFunction(664) GenerateForwardFunction(665) GenerateForwardFunction(666) GenerateForwardFunction(667) GenerateForwardFunction(668) GenerateForwardFunction(669) GenerateForwardFunction(670) GenerateForwardFunction(671) GenerateForwardFunction(672) GenerateForwardFunction(673) GenerateForwardFunction(674) GenerateForwardFunction(675) GenerateForwardFunction(676) GenerateForwardFunction(677) GenerateForwardFunction(678) GenerateForwardFunction(679) GenerateForwardFunction(680) GenerateForwardFunction(681) GenerateForwardFunction(682) GenerateForwardFunction(683) GenerateForwardFunction(684) GenerateForwardFunction(685) GenerateForwardFunction(686) GenerateForwardFunction(687) GenerateForwardFunction(688) GenerateForwardFunction(689) GenerateForwardFunction(690) GenerateForwardFunction(691) GenerateForwardFunction(692) GenerateForwardFunction(693) GenerateForwardFunction(694) GenerateForwardFunction(695) GenerateForwardFunction(696) GenerateForwardFunction(697) GenerateForwardFunction(698) GenerateForwardFunction(699)\nGenerateForwardFunction(700) GenerateForwardFunction(701) GenerateForwardFunction(702) GenerateForwardFunction(703) GenerateForwardFunction(704) GenerateForwardFunction(705) GenerateForwardFunction(706) GenerateForwardFunction(707) GenerateForwardFunction(708) GenerateForwardFunction(709) GenerateForwardFunction(710) GenerateForwardFunction(711) GenerateForwardFunction(712) GenerateForwardFunction(713) GenerateForwardFunction(714) GenerateForwardFunction(715) GenerateForwardFunction(716) GenerateForwardFunction(717) GenerateForwardFunction(718) GenerateForwardFunction(719) GenerateForwardFunction(720) GenerateForwardFunction(721) GenerateForwardFunction(722) GenerateForwardFunction(723) GenerateForwardFunction(724) GenerateForwardFunction(725) GenerateForwardFunction(726) GenerateForwardFunction(727) GenerateForwardFunction(728) GenerateForwardFunction(729) GenerateForwardFunction(730) GenerateForwardFunction(731) GenerateForwardFunction(732) GenerateForwardFunction(733) GenerateForwardFunction(734) GenerateForwardFunction(735) GenerateForwardFunction(736) GenerateForwardFunction(737) GenerateForwardFunction(738) GenerateForwardFunction(739) GenerateForwardFunction(740) GenerateForwardFunction(741) GenerateForwardFunction(742) GenerateForwardFunction(743) GenerateForwardFunction(744) GenerateForwardFunction(745) GenerateForwardFunction(746) GenerateForwardFunction(747) GenerateForwardFunction(748) GenerateForwardFunction(749)\nGenerateForwardFunction(750) GenerateForwardFunction(751) GenerateForwardFunction(752) GenerateForwardFunction(753) GenerateForwardFunction(754) GenerateForwardFunction(755) GenerateForwardFunction(756) GenerateForwardFunction(757) GenerateForwardFunction(758) GenerateForwardFunction(759) GenerateForwardFunction(760) GenerateForwardFunction(761) GenerateForwardFunction(762) GenerateForwardFunction(763) GenerateForwardFunction(764) GenerateForwardFunction(765) GenerateForwardFunction(766) GenerateForwardFunction(767) GenerateForwardFunction(768) GenerateForwardFunction(769) GenerateForwardFunction(770) GenerateForwardFunction(771) GenerateForwardFunction(772) GenerateForwardFunction(773) GenerateForwardFunction(774) GenerateForwardFunction(775) GenerateForwardFunction(776) GenerateForwardFunction(777) GenerateForwardFunction(778) GenerateForwardFunction(779) GenerateForwardFunction(780) GenerateForwardFunction(781) GenerateForwardFunction(782) GenerateForwardFunction(783) GenerateForwardFunction(784) GenerateForwardFunction(785) GenerateForwardFunction(786) GenerateForwardFunction(787) GenerateForwardFunction(788) GenerateForwardFunction(789) GenerateForwardFunction(790) GenerateForwardFunction(791) GenerateForwardFunction(792) GenerateForwardFunction(793) GenerateForwardFunction(794) GenerateForwardFunction(795) GenerateForwardFunction(796) GenerateForwardFunction(797) GenerateForwardFunction(798) GenerateForwardFunction(799)\nGenerateForwardFunction(800) GenerateForwardFunction(801) GenerateForwardFunction(802) GenerateForwardFunction(803) GenerateForwardFunction(804) GenerateForwardFunction(805) GenerateForwardFunction(806) GenerateForwardFunction(807) GenerateForwardFunction(808) GenerateForwardFunction(809) GenerateForwardFunction(810) GenerateForwardFunction(811) GenerateForwardFunction(812) GenerateForwardFunction(813) GenerateForwardFunction(814) GenerateForwardFunction(815) GenerateForwardFunction(816) GenerateForwardFunction(817) GenerateForwardFunction(818) GenerateForwardFunction(819) GenerateForwardFunction(820) GenerateForwardFunction(821) GenerateForwardFunction(822) GenerateForwardFunction(823) GenerateForwardFunction(824) GenerateForwardFunction(825) GenerateForwardFunction(826) GenerateForwardFunction(827) GenerateForwardFunction(828) GenerateForwardFunction(829) GenerateForwardFunction(830) GenerateForwardFunction(831) GenerateForwardFunction(832) GenerateForwardFunction(833) GenerateForwardFunction(834) GenerateForwardFunction(835) GenerateForwardFunction(836) GenerateForwardFunction(837) GenerateForwardFunction(838) GenerateForwardFunction(839) GenerateForwardFunction(840) GenerateForwardFunction(841) GenerateForwardFunction(842) GenerateForwardFunction(843) GenerateForwardFunction(844) GenerateForwardFunction(845) GenerateForwardFunction(846) GenerateForwardFunction(847) GenerateForwardFunction(848) GenerateForwardFunction(849)\nGenerateForwardFunction(850) GenerateForwardFunction(851) GenerateForwardFunction(852) GenerateForwardFunction(853) GenerateForwardFunction(854) GenerateForwardFunction(855) GenerateForwardFunction(856) GenerateForwardFunction(857) GenerateForwardFunction(858) GenerateForwardFunction(859) GenerateForwardFunction(860) GenerateForwardFunction(861) GenerateForwardFunction(862) GenerateForwardFunction(863) GenerateForwardFunction(864) GenerateForwardFunction(865) GenerateForwardFunction(866) GenerateForwardFunction(867) GenerateForwardFunction(868) GenerateForwardFunction(869) GenerateForwardFunction(870) GenerateForwardFunction(871) GenerateForwardFunction(872) GenerateForwardFunction(873) GenerateForwardFunction(874) GenerateForwardFunction(875) GenerateForwardFunction(876) GenerateForwardFunction(877) GenerateForwardFunction(878) GenerateForwardFunction(879) GenerateForwardFunction(880) GenerateForwardFunction(881) GenerateForwardFunction(882) GenerateForwardFunction(883) GenerateForwardFunction(884) GenerateForwardFunction(885) GenerateForwardFunction(886) GenerateForwardFunction(887) GenerateForwardFunction(888) GenerateForwardFunction(889) GenerateForwardFunction(890) GenerateForwardFunction(891) GenerateForwardFunction(892) GenerateForwardFunction(893) GenerateForwardFunction(894) GenerateForwardFunction(895) GenerateForwardFunction(896) GenerateForwardFunction(897) GenerateForwardFunction(898) GenerateForwardFunction(899)\nGenerateForwardFunction(900) GenerateForwardFunction(901) GenerateForwardFunction(902) GenerateForwardFunction(903) GenerateForwardFunction(904) GenerateForwardFunction(905) GenerateForwardFunction(906) GenerateForwardFunction(907) GenerateForwardFunction(908) GenerateForwardFunction(909) GenerateForwardFunction(910) GenerateForwardFunction(911) GenerateForwardFunction(912) GenerateForwardFunction(913) GenerateForwardFunction(914) GenerateForwardFunction(915) GenerateForwardFunction(916) GenerateForwardFunction(917) GenerateForwardFunction(918) GenerateForwardFunction(919) GenerateForwardFunction(920) GenerateForwardFunction(921) GenerateForwardFunction(922) GenerateForwardFunction(923) GenerateForwardFunction(924) GenerateForwardFunction(925) GenerateForwardFunction(926) GenerateForwardFunction(927) GenerateForwardFunction(928) GenerateForwardFunction(929) GenerateForwardFunction(930) GenerateForwardFunction(931) GenerateForwardFunction(932) GenerateForwardFunction(933) GenerateForwardFunction(934) GenerateForwardFunction(935) GenerateForwardFunction(936) GenerateForwardFunction(937) GenerateForwardFunction(938) GenerateForwardFunction(939) GenerateForwardFunction(940) GenerateForwardFunction(941) GenerateForwardFunction(942) GenerateForwardFunction(943) GenerateForwardFunction(944) GenerateForwardFunction(945) GenerateForwardFunction(946) GenerateForwardFunction(947) GenerateForwardFunction(948) GenerateForwardFunction(949)\nGenerateForwardFunction(950) GenerateForwardFunction(951) GenerateForwardFunction(952) GenerateForwardFunction(953) GenerateForwardFunction(954) GenerateForwardFunction(955) GenerateForwardFunction(956) GenerateForwardFunction(957) GenerateForwardFunction(958) GenerateForwardFunction(959) GenerateForwardFunction(960) GenerateForwardFunction(961) GenerateForwardFunction(962) GenerateForwardFunction(963) GenerateForwardFunction(964) GenerateForwardFunction(965) GenerateForwardFunction(966) GenerateForwardFunction(967) GenerateForwardFunction(968) GenerateForwardFunction(969) GenerateForwardFunction(970) GenerateForwardFunction(971) GenerateForwardFunction(972) GenerateForwardFunction(973) GenerateForwardFunction(974) GenerateForwardFunction(975) GenerateForwardFunction(976) GenerateForwardFunction(977) GenerateForwardFunction(978) GenerateForwardFunction(979) GenerateForwardFunction(980) GenerateForwardFunction(981) GenerateForwardFunction(982) GenerateForwardFunction(983) GenerateForwardFunction(984) GenerateForwardFunction(985) GenerateForwardFunction(986) GenerateForwardFunction(987) GenerateForwardFunction(988) GenerateForwardFunction(989) GenerateForwardFunction(990) GenerateForwardFunction(991) GenerateForwardFunction(992) GenerateForwardFunction(993) GenerateForwardFunction(994) GenerateForwardFunction(995) GenerateForwardFunction(996) GenerateForwardFunction(997) GenerateForwardFunction(998) GenerateForwardFunction(999)\nGenerateForwardFunction(1000) GenerateForwardFunction(1001) GenerateForwardFunction(1002) GenerateForwardFunction(1003) GenerateForwardFunction(1004) GenerateForwardFunction(1005) GenerateForwardFunction(1006) GenerateForwardFunction(1007) GenerateForwardFunction(1008) GenerateForwardFunction(1009) GenerateForwardFunction(1010) GenerateForwardFunction(1011) GenerateForwardFunction(1012) GenerateForwardFunction(1013) GenerateForwardFunction(1014) GenerateForwardFunction(1015) GenerateForwardFunction(1016) GenerateForwardFunction(1017) GenerateForwardFunction(1018)\nstd::vector<void*> forwardAddresses = {\n\t&Forward0, &Forward1, &Forward2, &Forward3, &Forward4, &Forward5, &Forward6, &Forward7, &Forward8, &Forward9, &Forward10, &Forward11, &Forward12, &Forward13, &Forward14, &Forward15, &Forward16, &Forward17, &Forward18, &Forward19, &Forward20, &Forward21, &Forward22, &Forward23, &Forward24, &Forward25, &Forward26, &Forward27, &Forward28, &Forward29, &Forward30, &Forward31, &Forward32, &Forward33, &Forward34, &Forward35, &Forward36, &Forward37, &Forward38, &Forward39, &Forward40, &Forward41, &Forward42, &Forward43, &Forward44, &Forward45, &Forward46, &Forward47, &Forward48, &Forward49,\n\t&Forward50, &Forward51, &Forward52, &Forward53, &Forward54, &Forward55, &Forward56, &Forward57, &Forward58, &Forward59, &Forward60, &Forward61, &Forward62, &Forward63, &Forward64, &Forward65, &Forward66, &Forward67, &Forward68, &Forward69, &Forward70, &Forward71, &Forward72, &Forward73, &Forward74, &Forward75, &Forward76, &Forward77, &Forward78, &Forward79, &Forward80, &Forward81, &Forward82, &Forward83, &Forward84, &Forward85, &Forward86, &Forward87, &Forward88, &Forward89, &Forward90, &Forward91, &Forward92, &Forward93, &Forward94, &Forward95, &Forward96, &Forward97, &Forward98, &Forward99,\n\t&Forward100, &Forward101, &Forward102, &Forward103, &Forward104, &Forward105, &Forward106, &Forward107, &Forward108, &Forward109, &Forward110, &Forward111, &Forward112, &Forward113, &Forward114, &Forward115, &Forward116, &Forward117, &Forward118, &Forward119, &Forward120, &Forward121, &Forward122, &Forward123, &Forward124, &Forward125, &Forward126, &Forward127, &Forward128, &Forward129, &Forward130, &Forward131, &Forward132, &Forward133, &Forward134, &Forward135, &Forward136, &Forward137, &Forward138, &Forward139, &Forward140, &Forward141, &Forward142, &Forward143, &Forward144, &Forward145, &Forward146, &Forward147, &Forward148, &Forward149,\n\t&Forward150, &Forward151, &Forward152, &Forward153, &Forward154, &Forward155, &Forward156, &Forward157, &Forward158, &Forward159, &Forward160, &Forward161, &Forward162, &Forward163, &Forward164, &Forward165, &Forward166, &Forward167, &Forward168, &Forward169, &Forward170, &Forward171, &Forward172, &Forward173, &Forward174, &Forward175, &Forward176, &Forward177, &Forward178, &Forward179, &Forward180, &Forward181, &Forward182, &Forward183, &Forward184, &Forward185, &Forward186, &Forward187, &Forward188, &Forward189, &Forward190, &Forward191, &Forward192, &Forward193, &Forward194, &Forward195, &Forward196, &Forward197, &Forward198, &Forward199,\n\t&Forward200, &Forward201, &Forward202, &Forward203, &Forward204, &Forward205, &Forward206, &Forward207, &Forward208, &Forward209, &Forward210, &Forward211, &Forward212, &Forward213, &Forward214, &Forward215, &Forward216, &Forward217, &Forward218, &Forward219, &Forward220, &Forward221, &Forward222, &Forward223, &Forward224, &Forward225, &Forward226, &Forward227, &Forward228, &Forward229, &Forward230, &Forward231, &Forward232, &Forward233, &Forward234, &Forward235, &Forward236, &Forward237, &Forward238, &Forward239, &Forward240, &Forward241, &Forward242, &Forward243, &Forward244, &Forward245, &Forward246, &Forward247, &Forward248, &Forward249,\n\t&Forward250, &Forward251, &Forward252, &Forward253, &Forward254, &Forward255, &Forward256, &Forward257, &Forward258, &Forward259, &Forward260, &Forward261, &Forward262, &Forward263, &Forward264, &Forward265, &Forward266, &Forward267, &Forward268, &Forward269, &Forward270, &Forward271, &Forward272, &Forward273, &Forward274, &Forward275, &Forward276, &Forward277, &Forward278, &Forward279, &Forward280, &Forward281, &Forward282, &Forward283, &Forward284, &Forward285, &Forward286, &Forward287, &Forward288, &Forward289, &Forward290, &Forward291, &Forward292, &Forward293, &Forward294, &Forward295, &Forward296, &Forward297, &Forward298, &Forward299,\n\t&Forward300, &Forward301, &Forward302, &Forward303, &Forward304, &Forward305, &Forward306, &Forward307, &Forward308, &Forward309, &Forward310, &Forward311, &Forward312, &Forward313, &Forward314, &Forward315, &Forward316, &Forward317, &Forward318, &Forward319, &Forward320, &Forward321, &Forward322, &Forward323, &Forward324, &Forward325, &Forward326, &Forward327, &Forward328, &Forward329, &Forward330, &Forward331, &Forward332, &Forward333, &Forward334, &Forward335, &Forward336, &Forward337, &Forward338, &Forward339, &Forward340, &Forward341, &Forward342, &Forward343, &Forward344, &Forward345, &Forward346, &Forward347, &Forward348, &Forward349,\n\t&Forward350, &Forward351, &Forward352, &Forward353, &Forward354, &Forward355, &Forward356, &Forward357, &Forward358, &Forward359, &Forward360, &Forward361, &Forward362, &Forward363, &Forward364, &Forward365, &Forward366, &Forward367, &Forward368, &Forward369, &Forward370, &Forward371, &Forward372, &Forward373, &Forward374, &Forward375, &Forward376, &Forward377, &Forward378, &Forward379, &Forward380, &Forward381, &Forward382, &Forward383, &Forward384, &Forward385, &Forward386, &Forward387, &Forward388, &Forward389, &Forward390, &Forward391, &Forward392, &Forward393, &Forward394, &Forward395, &Forward396, &Forward397, &Forward398, &Forward399,\n\t&Forward400, &Forward401, &Forward402, &Forward403, &Forward404, &Forward405, &Forward406, &Forward407, &Forward408, &Forward409, &Forward410, &Forward411, &Forward412, &Forward413, &Forward414, &Forward415, &Forward416, &Forward417, &Forward418, &Forward419, &Forward420, &Forward421, &Forward422, &Forward423, &Forward424, &Forward425, &Forward426, &Forward427, &Forward428, &Forward429, &Forward430, &Forward431, &Forward432, &Forward433, &Forward434, &Forward435, &Forward436, &Forward437, &Forward438, &Forward439, &Forward440, &Forward441, &Forward442, &Forward443, &Forward444, &Forward445, &Forward446, &Forward447, &Forward448, &Forward449,\n\t&Forward450, &Forward451, &Forward452, &Forward453, &Forward454, &Forward455, &Forward456, &Forward457, &Forward458, &Forward459, &Forward460, &Forward461, &Forward462, &Forward463, &Forward464, &Forward465, &Forward466, &Forward467, &Forward468, &Forward469, &Forward470, &Forward471, &Forward472, &Forward473, &Forward474, &Forward475, &Forward476, &Forward477, &Forward478, &Forward479, &Forward480, &Forward481, &Forward482, &Forward483, &Forward484, &Forward485, &Forward486, &Forward487, &Forward488, &Forward489, &Forward490, &Forward491, &Forward492, &Forward493, &Forward494, &Forward495, &Forward496, &Forward497, &Forward498, &Forward499,\n\t&Forward500, &Forward501, &Forward502, &Forward503, &Forward504, &Forward505, &Forward506, &Forward507, &Forward508, &Forward509, &Forward510, &Forward511, &Forward512, &Forward513, &Forward514, &Forward515, &Forward516, &Forward517, &Forward518, &Forward519, &Forward520, &Forward521, &Forward522, &Forward523, &Forward524, &Forward525, &Forward526, &Forward527, &Forward528, &Forward529, &Forward530, &Forward531, &Forward532, &Forward533, &Forward534, &Forward535, &Forward536, &Forward537, &Forward538, &Forward539, &Forward540, &Forward541, &Forward542, &Forward543, &Forward544, &Forward545, &Forward546, &Forward547, &Forward548, &Forward549,\n\t&Forward550, &Forward551, &Forward552, &Forward553, &Forward554, &Forward555, &Forward556, &Forward557, &Forward558, &Forward559, &Forward560, &Forward561, &Forward562, &Forward563, &Forward564, &Forward565, &Forward566, &Forward567, &Forward568, &Forward569, &Forward570, &Forward571, &Forward572, &Forward573, &Forward574, &Forward575, &Forward576, &Forward577, &Forward578, &Forward579, &Forward580, &Forward581, &Forward582, &Forward583, &Forward584, &Forward585, &Forward586, &Forward587, &Forward588, &Forward589, &Forward590, &Forward591, &Forward592, &Forward593, &Forward594, &Forward595, &Forward596, &Forward597, &Forward598, &Forward599,\n\t&Forward600, &Forward601, &Forward602, &Forward603, &Forward604, &Forward605, &Forward606, &Forward607, &Forward608, &Forward609, &Forward610, &Forward611, &Forward612, &Forward613, &Forward614, &Forward615, &Forward616, &Forward617, &Forward618, &Forward619, &Forward620, &Forward621, &Forward622, &Forward623, &Forward624, &Forward625, &Forward626, &Forward627, &Forward628, &Forward629, &Forward630, &Forward631, &Forward632, &Forward633, &Forward634, &Forward635, &Forward636, &Forward637, &Forward638, &Forward639, &Forward640, &Forward641, &Forward642, &Forward643, &Forward644, &Forward645, &Forward646, &Forward647, &Forward648, &Forward649,\n\t&Forward650, &Forward651, &Forward652, &Forward653, &Forward654, &Forward655, &Forward656, &Forward657, &Forward658, &Forward659, &Forward660, &Forward661, &Forward662, &Forward663, &Forward664, &Forward665, &Forward666, &Forward667, &Forward668, &Forward669, &Forward670, &Forward671, &Forward672, &Forward673, &Forward674, &Forward675, &Forward676, &Forward677, &Forward678, &Forward679, &Forward680, &Forward681, &Forward682, &Forward683, &Forward684, &Forward685, &Forward686, &Forward687, &Forward688, &Forward689, &Forward690, &Forward691, &Forward692, &Forward693, &Forward694, &Forward695, &Forward696, &Forward697, &Forward698, &Forward699,\n\t&Forward700, &Forward701, &Forward702, &Forward703, &Forward704, &Forward705, &Forward706, &Forward707, &Forward708, &Forward709, &Forward710, &Forward711, &Forward712, &Forward713, &Forward714, &Forward715, &Forward716, &Forward717, &Forward718, &Forward719, &Forward720, &Forward721, &Forward722, &Forward723, &Forward724, &Forward725, &Forward726, &Forward727, &Forward728, &Forward729, &Forward730, &Forward731, &Forward732, &Forward733, &Forward734, &Forward735, &Forward736, &Forward737, &Forward738, &Forward739, &Forward740, &Forward741, &Forward742, &Forward743, &Forward744, &Forward745, &Forward746, &Forward747, &Forward748, &Forward749,\n\t&Forward750, &Forward751, &Forward752, &Forward753, &Forward754, &Forward755, &Forward756, &Forward757, &Forward758, &Forward759, &Forward760, &Forward761, &Forward762, &Forward763, &Forward764, &Forward765, &Forward766, &Forward767, &Forward768, &Forward769, &Forward770, &Forward771, &Forward772, &Forward773, &Forward774, &Forward775, &Forward776, &Forward777, &Forward778, &Forward779, &Forward780, &Forward781, &Forward782, &Forward783, &Forward784, &Forward785, &Forward786, &Forward787, &Forward788, &Forward789, &Forward790, &Forward791, &Forward792, &Forward793, &Forward794, &Forward795, &Forward796, &Forward797, &Forward798, &Forward799,\n\t&Forward800, &Forward801, &Forward802, &Forward803, &Forward804, &Forward805, &Forward806, &Forward807, &Forward808, &Forward809, &Forward810, &Forward811, &Forward812, &Forward813, &Forward814, &Forward815, &Forward816, &Forward817, &Forward818, &Forward819, &Forward820, &Forward821, &Forward822, &Forward823, &Forward824, &Forward825, &Forward826, &Forward827, &Forward828, &Forward829, &Forward830, &Forward831, &Forward832, &Forward833, &Forward834, &Forward835, &Forward836, &Forward837, &Forward838, &Forward839, &Forward840, &Forward841, &Forward842, &Forward843, &Forward844, &Forward845, &Forward846, &Forward847, &Forward848, &Forward849,\n\t&Forward850, &Forward851, &Forward852, &Forward853, &Forward854, &Forward855, &Forward856, &Forward857, &Forward858, &Forward859, &Forward860, &Forward861, &Forward862, &Forward863, &Forward864, &Forward865, &Forward866, &Forward867, &Forward868, &Forward869, &Forward870, &Forward871, &Forward872, &Forward873, &Forward874, &Forward875, &Forward876, &Forward877, &Forward878, &Forward879, &Forward880, &Forward881, &Forward882, &Forward883, &Forward884, &Forward885, &Forward886, &Forward887, &Forward888, &Forward889, &Forward890, &Forward891, &Forward892, &Forward893, &Forward894, &Forward895, &Forward896, &Forward897, &Forward898, &Forward899,\n\t&Forward900, &Forward901, &Forward902, &Forward903, &Forward904, &Forward905, &Forward906, &Forward907, &Forward908, &Forward909, &Forward910, &Forward911, &Forward912, &Forward913, &Forward914, &Forward915, &Forward916, &Forward917, &Forward918, &Forward919, &Forward920, &Forward921, &Forward922, &Forward923, &Forward924, &Forward925, &Forward926, &Forward927, &Forward928, &Forward929, &Forward930, &Forward931, &Forward932, &Forward933, &Forward934, &Forward935, &Forward936, &Forward937, &Forward938, &Forward939, &Forward940, &Forward941, &Forward942, &Forward943, &Forward944, &Forward945, &Forward946, &Forward947, &Forward948, &Forward949,\n\t&Forward950, &Forward951, &Forward952, &Forward953, &Forward954, &Forward955, &Forward956, &Forward957, &Forward958, &Forward959, &Forward960, &Forward961, &Forward962, &Forward963, &Forward964, &Forward965, &Forward966, &Forward967, &Forward968, &Forward969, &Forward970, &Forward971, &Forward972, &Forward973, &Forward974, &Forward975, &Forward976, &Forward977, &Forward978, &Forward979, &Forward980, &Forward981, &Forward982, &Forward983, &Forward984, &Forward985, &Forward986, &Forward987, &Forward988, &Forward989, &Forward990, &Forward991, &Forward992, &Forward993, &Forward994, &Forward995, &Forward996, &Forward997, &Forward998, &Forward999,\n\t&Forward1000, &Forward1001, &Forward1002, &Forward1003, &Forward1004, &Forward1005, &Forward1006, &Forward1007, &Forward1008, &Forward1009, &Forward1010, &Forward1011, &Forward1012, &Forward1013, &Forward1014, &Forward1015, &Forward1016, &Forward1017, &Forward1018\n};\n\nGenerateForwardOrdinalFunction(1) GenerateForwardOrdinalFunction(2) GenerateForwardOrdinalFunction(3) GenerateForwardOrdinalFunction(4) GenerateForwardOrdinalFunction(5) GenerateForwardOrdinalFunction(6) GenerateForwardOrdinalFunction(7) GenerateForwardOrdinalFunction(8) GenerateForwardOrdinalFunction(9) GenerateForwardOrdinalFunction(10) GenerateForwardOrdinalFunction(11) GenerateForwardOrdinalFunction(12) GenerateForwardOrdinalFunction(13) GenerateForwardOrdinalFunction(14) GenerateForwardOrdinalFunction(15) GenerateForwardOrdinalFunction(16) GenerateForwardOrdinalFunction(17) GenerateForwardOrdinalFunction(18) GenerateForwardOrdinalFunction(19) GenerateForwardOrdinalFunction(20) GenerateForwardOrdinalFunction(21) GenerateForwardOrdinalFunction(22) GenerateForwardOrdinalFunction(23) GenerateForwardOrdinalFunction(24) GenerateForwardOrdinalFunction(25) GenerateForwardOrdinalFunction(26) GenerateForwardOrdinalFunction(27) GenerateForwardOrdinalFunction(28) GenerateForwardOrdinalFunction(29) GenerateForwardOrdinalFunction(30) GenerateForwardOrdinalFunction(31) GenerateForwardOrdinalFunction(32) GenerateForwardOrdinalFunction(33) GenerateForwardOrdinalFunction(34) GenerateForwardOrdinalFunction(35) GenerateForwardOrdinalFunction(36) GenerateForwardOrdinalFunction(37) GenerateForwardOrdinalFunction(38) GenerateForwardOrdinalFunction(39) GenerateForwardOrdinalFunction(40) GenerateForwardOrdinalFunction(41) GenerateForwardOrdinalFunction(42) GenerateForwardOrdinalFunction(43) GenerateForwardOrdinalFunction(44) GenerateForwardOrdinalFunction(45) GenerateForwardOrdinalFunction(46) GenerateForwardOrdinalFunction(47) GenerateForwardOrdinalFunction(48) GenerateForwardOrdinalFunction(49) GenerateForwardOrdinalFunction(50)\nGenerateForwardOrdinalFunction(51) GenerateForwardOrdinalFunction(52) GenerateForwardOrdinalFunction(53) GenerateForwardOrdinalFunction(54) GenerateForwardOrdinalFunction(55) GenerateForwardOrdinalFunction(56) GenerateForwardOrdinalFunction(57) GenerateForwardOrdinalFunction(58) GenerateForwardOrdinalFunction(59) GenerateForwardOrdinalFunction(60) GenerateForwardOrdinalFunction(61) GenerateForwardOrdinalFunction(62) GenerateForwardOrdinalFunction(63) GenerateForwardOrdinalFunction(64) GenerateForwardOrdinalFunction(65) GenerateForwardOrdinalFunction(66) GenerateForwardOrdinalFunction(67) GenerateForwardOrdinalFunction(68) GenerateForwardOrdinalFunction(69) GenerateForwardOrdinalFunction(70) GenerateForwardOrdinalFunction(71) GenerateForwardOrdinalFunction(72) GenerateForwardOrdinalFunction(73) GenerateForwardOrdinalFunction(74) GenerateForwardOrdinalFunction(75) GenerateForwardOrdinalFunction(76) GenerateForwardOrdinalFunction(77) GenerateForwardOrdinalFunction(78) GenerateForwardOrdinalFunction(79) GenerateForwardOrdinalFunction(80) GenerateForwardOrdinalFunction(81) GenerateForwardOrdinalFunction(82) GenerateForwardOrdinalFunction(83) GenerateForwardOrdinalFunction(84) GenerateForwardOrdinalFunction(85) GenerateForwardOrdinalFunction(86) GenerateForwardOrdinalFunction(87) GenerateForwardOrdinalFunction(88) GenerateForwardOrdinalFunction(89) GenerateForwardOrdinalFunction(90) GenerateForwardOrdinalFunction(91) GenerateForwardOrdinalFunction(92) GenerateForwardOrdinalFunction(93) GenerateForwardOrdinalFunction(94) GenerateForwardOrdinalFunction(95) GenerateForwardOrdinalFunction(96) GenerateForwardOrdinalFunction(97) GenerateForwardOrdinalFunction(98) GenerateForwardOrdinalFunction(99) GenerateForwardOrdinalFunction(100)\nGenerateForwardOrdinalFunction(101) GenerateForwardOrdinalFunction(102) GenerateForwardOrdinalFunction(103) GenerateForwardOrdinalFunction(104) GenerateForwardOrdinalFunction(105) GenerateForwardOrdinalFunction(106) GenerateForwardOrdinalFunction(107) GenerateForwardOrdinalFunction(108) GenerateForwardOrdinalFunction(109) GenerateForwardOrdinalFunction(110) GenerateForwardOrdinalFunction(111) GenerateForwardOrdinalFunction(112) GenerateForwardOrdinalFunction(113) GenerateForwardOrdinalFunction(114) GenerateForwardOrdinalFunction(115) GenerateForwardOrdinalFunction(116) GenerateForwardOrdinalFunction(117) GenerateForwardOrdinalFunction(118) GenerateForwardOrdinalFunction(119) GenerateForwardOrdinalFunction(120) GenerateForwardOrdinalFunction(121) GenerateForwardOrdinalFunction(122) GenerateForwardOrdinalFunction(123) GenerateForwardOrdinalFunction(124) GenerateForwardOrdinalFunction(125) GenerateForwardOrdinalFunction(126) GenerateForwardOrdinalFunction(127) GenerateForwardOrdinalFunction(128) GenerateForwardOrdinalFunction(129) GenerateForwardOrdinalFunction(130) GenerateForwardOrdinalFunction(131) GenerateForwardOrdinalFunction(132) GenerateForwardOrdinalFunction(133) GenerateForwardOrdinalFunction(134) GenerateForwardOrdinalFunction(135) GenerateForwardOrdinalFunction(136) GenerateForwardOrdinalFunction(137) GenerateForwardOrdinalFunction(138) GenerateForwardOrdinalFunction(139) GenerateForwardOrdinalFunction(140) GenerateForwardOrdinalFunction(141) GenerateForwardOrdinalFunction(142) GenerateForwardOrdinalFunction(143) GenerateForwardOrdinalFunction(144) GenerateForwardOrdinalFunction(145) GenerateForwardOrdinalFunction(146) GenerateForwardOrdinalFunction(147) GenerateForwardOrdinalFunction(148) GenerateForwardOrdinalFunction(149) GenerateForwardOrdinalFunction(150)\nGenerateForwardOrdinalFunction(151) GenerateForwardOrdinalFunction(152) GenerateForwardOrdinalFunction(153) GenerateForwardOrdinalFunction(154) GenerateForwardOrdinalFunction(155) GenerateForwardOrdinalFunction(156) GenerateForwardOrdinalFunction(157) GenerateForwardOrdinalFunction(158) GenerateForwardOrdinalFunction(159) GenerateForwardOrdinalFunction(160) GenerateForwardOrdinalFunction(161) GenerateForwardOrdinalFunction(162) GenerateForwardOrdinalFunction(163) GenerateForwardOrdinalFunction(164) GenerateForwardOrdinalFunction(165) GenerateForwardOrdinalFunction(166) GenerateForwardOrdinalFunction(167) GenerateForwardOrdinalFunction(168) GenerateForwardOrdinalFunction(169) GenerateForwardOrdinalFunction(170) GenerateForwardOrdinalFunction(171) GenerateForwardOrdinalFunction(172) GenerateForwardOrdinalFunction(173) GenerateForwardOrdinalFunction(174) GenerateForwardOrdinalFunction(175) GenerateForwardOrdinalFunction(176) GenerateForwardOrdinalFunction(177) GenerateForwardOrdinalFunction(178) GenerateForwardOrdinalFunction(179) GenerateForwardOrdinalFunction(180) GenerateForwardOrdinalFunction(181) GenerateForwardOrdinalFunction(182) GenerateForwardOrdinalFunction(183) GenerateForwardOrdinalFunction(184) GenerateForwardOrdinalFunction(185) GenerateForwardOrdinalFunction(186) GenerateForwardOrdinalFunction(187) GenerateForwardOrdinalFunction(188) GenerateForwardOrdinalFunction(189) GenerateForwardOrdinalFunction(190) GenerateForwardOrdinalFunction(191) GenerateForwardOrdinalFunction(192) GenerateForwardOrdinalFunction(193) GenerateForwardOrdinalFunction(194) GenerateForwardOrdinalFunction(195) GenerateForwardOrdinalFunction(196) GenerateForwardOrdinalFunction(197) GenerateForwardOrdinalFunction(198) GenerateForwardOrdinalFunction(199) GenerateForwardOrdinalFunction(200)\nGenerateForwardOrdinalFunction(201) GenerateForwardOrdinalFunction(202) GenerateForwardOrdinalFunction(203) GenerateForwardOrdinalFunction(204) GenerateForwardOrdinalFunction(205) GenerateForwardOrdinalFunction(206) GenerateForwardOrdinalFunction(207) GenerateForwardOrdinalFunction(208) GenerateForwardOrdinalFunction(209) GenerateForwardOrdinalFunction(210) GenerateForwardOrdinalFunction(211) GenerateForwardOrdinalFunction(212) GenerateForwardOrdinalFunction(213) GenerateForwardOrdinalFunction(214) GenerateForwardOrdinalFunction(215) GenerateForwardOrdinalFunction(216) GenerateForwardOrdinalFunction(217) GenerateForwardOrdinalFunction(218) GenerateForwardOrdinalFunction(219) GenerateForwardOrdinalFunction(220) GenerateForwardOrdinalFunction(221) GenerateForwardOrdinalFunction(222) GenerateForwardOrdinalFunction(223) GenerateForwardOrdinalFunction(224) GenerateForwardOrdinalFunction(225) GenerateForwardOrdinalFunction(226) GenerateForwardOrdinalFunction(227) GenerateForwardOrdinalFunction(228) GenerateForwardOrdinalFunction(229) GenerateForwardOrdinalFunction(230) GenerateForwardOrdinalFunction(231) GenerateForwardOrdinalFunction(232) GenerateForwardOrdinalFunction(233) GenerateForwardOrdinalFunction(234) GenerateForwardOrdinalFunction(235) GenerateForwardOrdinalFunction(236) GenerateForwardOrdinalFunction(237) GenerateForwardOrdinalFunction(238) GenerateForwardOrdinalFunction(239) GenerateForwardOrdinalFunction(240) GenerateForwardOrdinalFunction(241) GenerateForwardOrdinalFunction(242) GenerateForwardOrdinalFunction(243) GenerateForwardOrdinalFunction(244) GenerateForwardOrdinalFunction(245) GenerateForwardOrdinalFunction(246) GenerateForwardOrdinalFunction(247) GenerateForwardOrdinalFunction(248) GenerateForwardOrdinalFunction(249) GenerateForwardOrdinalFunction(250)\nGenerateForwardOrdinalFunction(251) GenerateForwardOrdinalFunction(252) GenerateForwardOrdinalFunction(253) GenerateForwardOrdinalFunction(254) GenerateForwardOrdinalFunction(255) GenerateForwardOrdinalFunction(256) GenerateForwardOrdinalFunction(257) GenerateForwardOrdinalFunction(258) GenerateForwardOrdinalFunction(259) GenerateForwardOrdinalFunction(260) GenerateForwardOrdinalFunction(261) GenerateForwardOrdinalFunction(262) GenerateForwardOrdinalFunction(263) GenerateForwardOrdinalFunction(264) GenerateForwardOrdinalFunction(265) GenerateForwardOrdinalFunction(266) GenerateForwardOrdinalFunction(267) GenerateForwardOrdinalFunction(268) GenerateForwardOrdinalFunction(269) GenerateForwardOrdinalFunction(270) GenerateForwardOrdinalFunction(271) GenerateForwardOrdinalFunction(272) GenerateForwardOrdinalFunction(273) GenerateForwardOrdinalFunction(274) GenerateForwardOrdinalFunction(275) GenerateForwardOrdinalFunction(276) GenerateForwardOrdinalFunction(277) GenerateForwardOrdinalFunction(278) GenerateForwardOrdinalFunction(279) GenerateForwardOrdinalFunction(280) GenerateForwardOrdinalFunction(281) GenerateForwardOrdinalFunction(282) GenerateForwardOrdinalFunction(283) GenerateForwardOrdinalFunction(284) GenerateForwardOrdinalFunction(285) GenerateForwardOrdinalFunction(286) GenerateForwardOrdinalFunction(287) GenerateForwardOrdinalFunction(288) GenerateForwardOrdinalFunction(289) GenerateForwardOrdinalFunction(290) GenerateForwardOrdinalFunction(291) GenerateForwardOrdinalFunction(292) GenerateForwardOrdinalFunction(293) GenerateForwardOrdinalFunction(294) GenerateForwardOrdinalFunction(295) GenerateForwardOrdinalFunction(296) GenerateForwardOrdinalFunction(297) GenerateForwardOrdinalFunction(298) GenerateForwardOrdinalFunction(299) GenerateForwardOrdinalFunction(300)\nGenerateForwardOrdinalFunction(301) GenerateForwardOrdinalFunction(302) GenerateForwardOrdinalFunction(303) GenerateForwardOrdinalFunction(304) GenerateForwardOrdinalFunction(305) GenerateForwardOrdinalFunction(306) GenerateForwardOrdinalFunction(307) GenerateForwardOrdinalFunction(308) GenerateForwardOrdinalFunction(309) GenerateForwardOrdinalFunction(310) GenerateForwardOrdinalFunction(311) GenerateForwardOrdinalFunction(312) GenerateForwardOrdinalFunction(313) GenerateForwardOrdinalFunction(314) GenerateForwardOrdinalFunction(315) GenerateForwardOrdinalFunction(316) GenerateForwardOrdinalFunction(317) GenerateForwardOrdinalFunction(318) GenerateForwardOrdinalFunction(319) GenerateForwardOrdinalFunction(320) GenerateForwardOrdinalFunction(321) GenerateForwardOrdinalFunction(322) GenerateForwardOrdinalFunction(323) GenerateForwardOrdinalFunction(324) GenerateForwardOrdinalFunction(325) GenerateForwardOrdinalFunction(326) GenerateForwardOrdinalFunction(327) GenerateForwardOrdinalFunction(328) GenerateForwardOrdinalFunction(329) GenerateForwardOrdinalFunction(330) GenerateForwardOrdinalFunction(331) GenerateForwardOrdinalFunction(332) GenerateForwardOrdinalFunction(333) GenerateForwardOrdinalFunction(334) GenerateForwardOrdinalFunction(335) GenerateForwardOrdinalFunction(336) GenerateForwardOrdinalFunction(337) GenerateForwardOrdinalFunction(338) GenerateForwardOrdinalFunction(339) GenerateForwardOrdinalFunction(340) GenerateForwardOrdinalFunction(341) GenerateForwardOrdinalFunction(342) GenerateForwardOrdinalFunction(343) GenerateForwardOrdinalFunction(344) GenerateForwardOrdinalFunction(345) GenerateForwardOrdinalFunction(346) GenerateForwardOrdinalFunction(347) GenerateForwardOrdinalFunction(348) GenerateForwardOrdinalFunction(349) GenerateForwardOrdinalFunction(350)\nGenerateForwardOrdinalFunction(351) GenerateForwardOrdinalFunction(352) GenerateForwardOrdinalFunction(353) GenerateForwardOrdinalFunction(354) GenerateForwardOrdinalFunction(355) GenerateForwardOrdinalFunction(356) GenerateForwardOrdinalFunction(357) GenerateForwardOrdinalFunction(358) GenerateForwardOrdinalFunction(359) GenerateForwardOrdinalFunction(360) GenerateForwardOrdinalFunction(361) GenerateForwardOrdinalFunction(362) GenerateForwardOrdinalFunction(363) GenerateForwardOrdinalFunction(364) GenerateForwardOrdinalFunction(365) GenerateForwardOrdinalFunction(366) GenerateForwardOrdinalFunction(367) GenerateForwardOrdinalFunction(368) GenerateForwardOrdinalFunction(369) GenerateForwardOrdinalFunction(370) GenerateForwardOrdinalFunction(371) GenerateForwardOrdinalFunction(372) GenerateForwardOrdinalFunction(373) GenerateForwardOrdinalFunction(374) GenerateForwardOrdinalFunction(375) GenerateForwardOrdinalFunction(376) GenerateForwardOrdinalFunction(377) GenerateForwardOrdinalFunction(378) GenerateForwardOrdinalFunction(379) GenerateForwardOrdinalFunction(380) GenerateForwardOrdinalFunction(381) GenerateForwardOrdinalFunction(382) GenerateForwardOrdinalFunction(383) GenerateForwardOrdinalFunction(384) GenerateForwardOrdinalFunction(385) GenerateForwardOrdinalFunction(386) GenerateForwardOrdinalFunction(387) GenerateForwardOrdinalFunction(388) GenerateForwardOrdinalFunction(389) GenerateForwardOrdinalFunction(390) GenerateForwardOrdinalFunction(391) GenerateForwardOrdinalFunction(392) GenerateForwardOrdinalFunction(393) GenerateForwardOrdinalFunction(394) GenerateForwardOrdinalFunction(395) GenerateForwardOrdinalFunction(396) GenerateForwardOrdinalFunction(397) GenerateForwardOrdinalFunction(398) GenerateForwardOrdinalFunction(399) GenerateForwardOrdinalFunction(400)\nGenerateForwardOrdinalFunction(401) GenerateForwardOrdinalFunction(402) GenerateForwardOrdinalFunction(403) GenerateForwardOrdinalFunction(404) GenerateForwardOrdinalFunction(405) GenerateForwardOrdinalFunction(406) GenerateForwardOrdinalFunction(407) GenerateForwardOrdinalFunction(408) GenerateForwardOrdinalFunction(409) GenerateForwardOrdinalFunction(410) GenerateForwardOrdinalFunction(411) GenerateForwardOrdinalFunction(412) GenerateForwardOrdinalFunction(413) GenerateForwardOrdinalFunction(414) GenerateForwardOrdinalFunction(415) GenerateForwardOrdinalFunction(416) GenerateForwardOrdinalFunction(417) GenerateForwardOrdinalFunction(418) GenerateForwardOrdinalFunction(419) GenerateForwardOrdinalFunction(420) GenerateForwardOrdinalFunction(421) GenerateForwardOrdinalFunction(422) GenerateForwardOrdinalFunction(423) GenerateForwardOrdinalFunction(424) GenerateForwardOrdinalFunction(425) GenerateForwardOrdinalFunction(426) GenerateForwardOrdinalFunction(427) GenerateForwardOrdinalFunction(428) GenerateForwardOrdinalFunction(429) GenerateForwardOrdinalFunction(430) GenerateForwardOrdinalFunction(431) GenerateForwardOrdinalFunction(432) GenerateForwardOrdinalFunction(433) GenerateForwardOrdinalFunction(434) GenerateForwardOrdinalFunction(435) GenerateForwardOrdinalFunction(436) GenerateForwardOrdinalFunction(437) GenerateForwardOrdinalFunction(438) GenerateForwardOrdinalFunction(439) GenerateForwardOrdinalFunction(440) GenerateForwardOrdinalFunction(441) GenerateForwardOrdinalFunction(442) GenerateForwardOrdinalFunction(443) GenerateForwardOrdinalFunction(444) GenerateForwardOrdinalFunction(445) GenerateForwardOrdinalFunction(446) GenerateForwardOrdinalFunction(447) GenerateForwardOrdinalFunction(448) GenerateForwardOrdinalFunction(449) GenerateForwardOrdinalFunction(450)\nGenerateForwardOrdinalFunction(451) GenerateForwardOrdinalFunction(452) GenerateForwardOrdinalFunction(453) GenerateForwardOrdinalFunction(454) GenerateForwardOrdinalFunction(455) GenerateForwardOrdinalFunction(456) GenerateForwardOrdinalFunction(457) GenerateForwardOrdinalFunction(458) GenerateForwardOrdinalFunction(459) GenerateForwardOrdinalFunction(460) GenerateForwardOrdinalFunction(461) GenerateForwardOrdinalFunction(462) GenerateForwardOrdinalFunction(463) GenerateForwardOrdinalFunction(464) GenerateForwardOrdinalFunction(465) GenerateForwardOrdinalFunction(466) GenerateForwardOrdinalFunction(467) GenerateForwardOrdinalFunction(468) GenerateForwardOrdinalFunction(469) GenerateForwardOrdinalFunction(470) GenerateForwardOrdinalFunction(471) GenerateForwardOrdinalFunction(472) GenerateForwardOrdinalFunction(473) GenerateForwardOrdinalFunction(474) GenerateForwardOrdinalFunction(475) GenerateForwardOrdinalFunction(476) GenerateForwardOrdinalFunction(477) GenerateForwardOrdinalFunction(478) GenerateForwardOrdinalFunction(479) GenerateForwardOrdinalFunction(480) GenerateForwardOrdinalFunction(481) GenerateForwardOrdinalFunction(482) GenerateForwardOrdinalFunction(483) GenerateForwardOrdinalFunction(484) GenerateForwardOrdinalFunction(485) GenerateForwardOrdinalFunction(486) GenerateForwardOrdinalFunction(487) GenerateForwardOrdinalFunction(488) GenerateForwardOrdinalFunction(489) GenerateForwardOrdinalFunction(490) GenerateForwardOrdinalFunction(491) GenerateForwardOrdinalFunction(492) GenerateForwardOrdinalFunction(493) GenerateForwardOrdinalFunction(494) GenerateForwardOrdinalFunction(495) GenerateForwardOrdinalFunction(496) GenerateForwardOrdinalFunction(497) GenerateForwardOrdinalFunction(498) GenerateForwardOrdinalFunction(499) GenerateForwardOrdinalFunction(500)\nGenerateForwardOrdinalFunction(501) GenerateForwardOrdinalFunction(502) GenerateForwardOrdinalFunction(503) GenerateForwardOrdinalFunction(504) GenerateForwardOrdinalFunction(505) GenerateForwardOrdinalFunction(506) GenerateForwardOrdinalFunction(507) GenerateForwardOrdinalFunction(508) GenerateForwardOrdinalFunction(509) GenerateForwardOrdinalFunction(510) GenerateForwardOrdinalFunction(511) GenerateForwardOrdinalFunction(512) GenerateForwardOrdinalFunction(513) GenerateForwardOrdinalFunction(514) GenerateForwardOrdinalFunction(515) GenerateForwardOrdinalFunction(516) GenerateForwardOrdinalFunction(517) GenerateForwardOrdinalFunction(518) GenerateForwardOrdinalFunction(519) GenerateForwardOrdinalFunction(520) GenerateForwardOrdinalFunction(521) GenerateForwardOrdinalFunction(522) GenerateForwardOrdinalFunction(523) GenerateForwardOrdinalFunction(524) GenerateForwardOrdinalFunction(525) GenerateForwardOrdinalFunction(526) GenerateForwardOrdinalFunction(527) GenerateForwardOrdinalFunction(528) GenerateForwardOrdinalFunction(529) GenerateForwardOrdinalFunction(530) GenerateForwardOrdinalFunction(531) GenerateForwardOrdinalFunction(532) GenerateForwardOrdinalFunction(533) GenerateForwardOrdinalFunction(534) GenerateForwardOrdinalFunction(535) GenerateForwardOrdinalFunction(536) GenerateForwardOrdinalFunction(537) GenerateForwardOrdinalFunction(538) GenerateForwardOrdinalFunction(539) GenerateForwardOrdinalFunction(540) GenerateForwardOrdinalFunction(541) GenerateForwardOrdinalFunction(542) GenerateForwardOrdinalFunction(543) GenerateForwardOrdinalFunction(544) GenerateForwardOrdinalFunction(545) GenerateForwardOrdinalFunction(546) GenerateForwardOrdinalFunction(547) GenerateForwardOrdinalFunction(548) GenerateForwardOrdinalFunction(549) GenerateForwardOrdinalFunction(550)\nGenerateForwardOrdinalFunction(551) GenerateForwardOrdinalFunction(552) GenerateForwardOrdinalFunction(553) GenerateForwardOrdinalFunction(554) GenerateForwardOrdinalFunction(555) GenerateForwardOrdinalFunction(556) GenerateForwardOrdinalFunction(557) GenerateForwardOrdinalFunction(558) GenerateForwardOrdinalFunction(559) GenerateForwardOrdinalFunction(560) GenerateForwardOrdinalFunction(561) GenerateForwardOrdinalFunction(562) GenerateForwardOrdinalFunction(563) GenerateForwardOrdinalFunction(564) GenerateForwardOrdinalFunction(565) GenerateForwardOrdinalFunction(566) GenerateForwardOrdinalFunction(567) GenerateForwardOrdinalFunction(568) GenerateForwardOrdinalFunction(569) GenerateForwardOrdinalFunction(570) GenerateForwardOrdinalFunction(571) GenerateForwardOrdinalFunction(572) GenerateForwardOrdinalFunction(573) GenerateForwardOrdinalFunction(574) GenerateForwardOrdinalFunction(575) GenerateForwardOrdinalFunction(576) GenerateForwardOrdinalFunction(577) GenerateForwardOrdinalFunction(578) GenerateForwardOrdinalFunction(579) GenerateForwardOrdinalFunction(580) GenerateForwardOrdinalFunction(581) GenerateForwardOrdinalFunction(582) GenerateForwardOrdinalFunction(583) GenerateForwardOrdinalFunction(584) GenerateForwardOrdinalFunction(585) GenerateForwardOrdinalFunction(586) GenerateForwardOrdinalFunction(587) GenerateForwardOrdinalFunction(588) GenerateForwardOrdinalFunction(589) GenerateForwardOrdinalFunction(590) GenerateForwardOrdinalFunction(591) GenerateForwardOrdinalFunction(592) GenerateForwardOrdinalFunction(593) GenerateForwardOrdinalFunction(594) GenerateForwardOrdinalFunction(595) GenerateForwardOrdinalFunction(596) GenerateForwardOrdinalFunction(597) GenerateForwardOrdinalFunction(598) GenerateForwardOrdinalFunction(599) GenerateForwardOrdinalFunction(600)\nGenerateForwardOrdinalFunction(601) GenerateForwardOrdinalFunction(602) GenerateForwardOrdinalFunction(603) GenerateForwardOrdinalFunction(604) GenerateForwardOrdinalFunction(605) GenerateForwardOrdinalFunction(606) GenerateForwardOrdinalFunction(607) GenerateForwardOrdinalFunction(608) GenerateForwardOrdinalFunction(609) GenerateForwardOrdinalFunction(610) GenerateForwardOrdinalFunction(611) GenerateForwardOrdinalFunction(612) GenerateForwardOrdinalFunction(613) GenerateForwardOrdinalFunction(614) GenerateForwardOrdinalFunction(615) GenerateForwardOrdinalFunction(616) GenerateForwardOrdinalFunction(617) GenerateForwardOrdinalFunction(618) GenerateForwardOrdinalFunction(619) GenerateForwardOrdinalFunction(620) GenerateForwardOrdinalFunction(621) GenerateForwardOrdinalFunction(622) GenerateForwardOrdinalFunction(623) GenerateForwardOrdinalFunction(624) GenerateForwardOrdinalFunction(625) GenerateForwardOrdinalFunction(626) GenerateForwardOrdinalFunction(627) GenerateForwardOrdinalFunction(628) GenerateForwardOrdinalFunction(629) GenerateForwardOrdinalFunction(630) GenerateForwardOrdinalFunction(631) GenerateForwardOrdinalFunction(632) GenerateForwardOrdinalFunction(633) GenerateForwardOrdinalFunction(634) GenerateForwardOrdinalFunction(635) GenerateForwardOrdinalFunction(636) GenerateForwardOrdinalFunction(637) GenerateForwardOrdinalFunction(638) GenerateForwardOrdinalFunction(639) GenerateForwardOrdinalFunction(640) GenerateForwardOrdinalFunction(641) GenerateForwardOrdinalFunction(642) GenerateForwardOrdinalFunction(643) GenerateForwardOrdinalFunction(644) GenerateForwardOrdinalFunction(645) GenerateForwardOrdinalFunction(646) GenerateForwardOrdinalFunction(647) GenerateForwardOrdinalFunction(648) GenerateForwardOrdinalFunction(649) GenerateForwardOrdinalFunction(650)\nGenerateForwardOrdinalFunction(651) GenerateForwardOrdinalFunction(652) GenerateForwardOrdinalFunction(653) GenerateForwardOrdinalFunction(654) GenerateForwardOrdinalFunction(655) GenerateForwardOrdinalFunction(656) GenerateForwardOrdinalFunction(657) GenerateForwardOrdinalFunction(658) GenerateForwardOrdinalFunction(659) GenerateForwardOrdinalFunction(660) GenerateForwardOrdinalFunction(661) GenerateForwardOrdinalFunction(662) GenerateForwardOrdinalFunction(663) GenerateForwardOrdinalFunction(664) GenerateForwardOrdinalFunction(665) GenerateForwardOrdinalFunction(666) GenerateForwardOrdinalFunction(667) GenerateForwardOrdinalFunction(668) GenerateForwardOrdinalFunction(669) GenerateForwardOrdinalFunction(670) GenerateForwardOrdinalFunction(671) GenerateForwardOrdinalFunction(672) GenerateForwardOrdinalFunction(673) GenerateForwardOrdinalFunction(674) GenerateForwardOrdinalFunction(675) GenerateForwardOrdinalFunction(676) GenerateForwardOrdinalFunction(677) GenerateForwardOrdinalFunction(678) GenerateForwardOrdinalFunction(679) GenerateForwardOrdinalFunction(680) GenerateForwardOrdinalFunction(681) GenerateForwardOrdinalFunction(682) GenerateForwardOrdinalFunction(683) GenerateForwardOrdinalFunction(684) GenerateForwardOrdinalFunction(685) GenerateForwardOrdinalFunction(686) GenerateForwardOrdinalFunction(687) GenerateForwardOrdinalFunction(688) GenerateForwardOrdinalFunction(689) GenerateForwardOrdinalFunction(690) GenerateForwardOrdinalFunction(691) GenerateForwardOrdinalFunction(692) GenerateForwardOrdinalFunction(693) GenerateForwardOrdinalFunction(694) GenerateForwardOrdinalFunction(695) GenerateForwardOrdinalFunction(696) GenerateForwardOrdinalFunction(697) GenerateForwardOrdinalFunction(698) GenerateForwardOrdinalFunction(699) GenerateForwardOrdinalFunction(700)\nGenerateForwardOrdinalFunction(701) GenerateForwardOrdinalFunction(702) GenerateForwardOrdinalFunction(703) GenerateForwardOrdinalFunction(704) GenerateForwardOrdinalFunction(705) GenerateForwardOrdinalFunction(706) GenerateForwardOrdinalFunction(707) GenerateForwardOrdinalFunction(708) GenerateForwardOrdinalFunction(709) GenerateForwardOrdinalFunction(710) GenerateForwardOrdinalFunction(711) GenerateForwardOrdinalFunction(712) GenerateForwardOrdinalFunction(713) GenerateForwardOrdinalFunction(714) GenerateForwardOrdinalFunction(715) GenerateForwardOrdinalFunction(716) GenerateForwardOrdinalFunction(717) GenerateForwardOrdinalFunction(718) GenerateForwardOrdinalFunction(719) GenerateForwardOrdinalFunction(720) GenerateForwardOrdinalFunction(721) GenerateForwardOrdinalFunction(722) GenerateForwardOrdinalFunction(723) GenerateForwardOrdinalFunction(724) GenerateForwardOrdinalFunction(725) GenerateForwardOrdinalFunction(726) GenerateForwardOrdinalFunction(727) GenerateForwardOrdinalFunction(728) GenerateForwardOrdinalFunction(729) GenerateForwardOrdinalFunction(730) GenerateForwardOrdinalFunction(731) GenerateForwardOrdinalFunction(732) GenerateForwardOrdinalFunction(733) GenerateForwardOrdinalFunction(734) GenerateForwardOrdinalFunction(735) GenerateForwardOrdinalFunction(736) GenerateForwardOrdinalFunction(737) GenerateForwardOrdinalFunction(738) GenerateForwardOrdinalFunction(739) GenerateForwardOrdinalFunction(740) GenerateForwardOrdinalFunction(741) GenerateForwardOrdinalFunction(742) GenerateForwardOrdinalFunction(743) GenerateForwardOrdinalFunction(744) GenerateForwardOrdinalFunction(745) GenerateForwardOrdinalFunction(746) GenerateForwardOrdinalFunction(747) GenerateForwardOrdinalFunction(748) GenerateForwardOrdinalFunction(749) GenerateForwardOrdinalFunction(750)\nGenerateForwardOrdinalFunction(751) GenerateForwardOrdinalFunction(752) GenerateForwardOrdinalFunction(753) GenerateForwardOrdinalFunction(754) GenerateForwardOrdinalFunction(755) GenerateForwardOrdinalFunction(756) GenerateForwardOrdinalFunction(757) GenerateForwardOrdinalFunction(758) GenerateForwardOrdinalFunction(759) GenerateForwardOrdinalFunction(760) GenerateForwardOrdinalFunction(761) GenerateForwardOrdinalFunction(762) GenerateForwardOrdinalFunction(763) GenerateForwardOrdinalFunction(764) GenerateForwardOrdinalFunction(765) GenerateForwardOrdinalFunction(766) GenerateForwardOrdinalFunction(767) GenerateForwardOrdinalFunction(768) GenerateForwardOrdinalFunction(769) GenerateForwardOrdinalFunction(770) GenerateForwardOrdinalFunction(771) GenerateForwardOrdinalFunction(772) GenerateForwardOrdinalFunction(773) GenerateForwardOrdinalFunction(774) GenerateForwardOrdinalFunction(775) GenerateForwardOrdinalFunction(776) GenerateForwardOrdinalFunction(777) GenerateForwardOrdinalFunction(778) GenerateForwardOrdinalFunction(779) GenerateForwardOrdinalFunction(780) GenerateForwardOrdinalFunction(781) GenerateForwardOrdinalFunction(782) GenerateForwardOrdinalFunction(783) GenerateForwardOrdinalFunction(784) GenerateForwardOrdinalFunction(785) GenerateForwardOrdinalFunction(786) GenerateForwardOrdinalFunction(787) GenerateForwardOrdinalFunction(788) GenerateForwardOrdinalFunction(789) GenerateForwardOrdinalFunction(790) GenerateForwardOrdinalFunction(791) GenerateForwardOrdinalFunction(792) GenerateForwardOrdinalFunction(793) GenerateForwardOrdinalFunction(794) GenerateForwardOrdinalFunction(795) GenerateForwardOrdinalFunction(796) GenerateForwardOrdinalFunction(797) GenerateForwardOrdinalFunction(798) GenerateForwardOrdinalFunction(799) GenerateForwardOrdinalFunction(800)\nGenerateForwardOrdinalFunction(801) GenerateForwardOrdinalFunction(802) GenerateForwardOrdinalFunction(803) GenerateForwardOrdinalFunction(804) GenerateForwardOrdinalFunction(805) GenerateForwardOrdinalFunction(806) GenerateForwardOrdinalFunction(807) GenerateForwardOrdinalFunction(808) GenerateForwardOrdinalFunction(809) GenerateForwardOrdinalFunction(810) GenerateForwardOrdinalFunction(811) GenerateForwardOrdinalFunction(812) GenerateForwardOrdinalFunction(813) GenerateForwardOrdinalFunction(814) GenerateForwardOrdinalFunction(815) GenerateForwardOrdinalFunction(816) GenerateForwardOrdinalFunction(817) GenerateForwardOrdinalFunction(818) GenerateForwardOrdinalFunction(819) GenerateForwardOrdinalFunction(820) GenerateForwardOrdinalFunction(821) GenerateForwardOrdinalFunction(822) GenerateForwardOrdinalFunction(823) GenerateForwardOrdinalFunction(824) GenerateForwardOrdinalFunction(825) GenerateForwardOrdinalFunction(826) GenerateForwardOrdinalFunction(827) GenerateForwardOrdinalFunction(828) GenerateForwardOrdinalFunction(829) GenerateForwardOrdinalFunction(830) GenerateForwardOrdinalFunction(831) GenerateForwardOrdinalFunction(832) GenerateForwardOrdinalFunction(833) GenerateForwardOrdinalFunction(834) GenerateForwardOrdinalFunction(835) GenerateForwardOrdinalFunction(836) GenerateForwardOrdinalFunction(837) GenerateForwardOrdinalFunction(838) GenerateForwardOrdinalFunction(839) GenerateForwardOrdinalFunction(840) GenerateForwardOrdinalFunction(841) GenerateForwardOrdinalFunction(842) GenerateForwardOrdinalFunction(843) GenerateForwardOrdinalFunction(844) GenerateForwardOrdinalFunction(845) GenerateForwardOrdinalFunction(846) GenerateForwardOrdinalFunction(847) GenerateForwardOrdinalFunction(848) GenerateForwardOrdinalFunction(849) GenerateForwardOrdinalFunction(850)\nGenerateForwardOrdinalFunction(851) GenerateForwardOrdinalFunction(852) GenerateForwardOrdinalFunction(853) GenerateForwardOrdinalFunction(854) GenerateForwardOrdinalFunction(855) GenerateForwardOrdinalFunction(856) GenerateForwardOrdinalFunction(857) GenerateForwardOrdinalFunction(858) GenerateForwardOrdinalFunction(859) GenerateForwardOrdinalFunction(860) GenerateForwardOrdinalFunction(861) GenerateForwardOrdinalFunction(862) GenerateForwardOrdinalFunction(863) GenerateForwardOrdinalFunction(864) GenerateForwardOrdinalFunction(865) GenerateForwardOrdinalFunction(866) GenerateForwardOrdinalFunction(867) GenerateForwardOrdinalFunction(868) GenerateForwardOrdinalFunction(869) GenerateForwardOrdinalFunction(870) GenerateForwardOrdinalFunction(871) GenerateForwardOrdinalFunction(872) GenerateForwardOrdinalFunction(873) GenerateForwardOrdinalFunction(874) GenerateForwardOrdinalFunction(875) GenerateForwardOrdinalFunction(876) GenerateForwardOrdinalFunction(877) GenerateForwardOrdinalFunction(878) GenerateForwardOrdinalFunction(879) GenerateForwardOrdinalFunction(880) GenerateForwardOrdinalFunction(881) GenerateForwardOrdinalFunction(882) GenerateForwardOrdinalFunction(883) GenerateForwardOrdinalFunction(884) GenerateForwardOrdinalFunction(885) GenerateForwardOrdinalFunction(886) GenerateForwardOrdinalFunction(887) GenerateForwardOrdinalFunction(888) GenerateForwardOrdinalFunction(889) GenerateForwardOrdinalFunction(890) GenerateForwardOrdinalFunction(891) GenerateForwardOrdinalFunction(892) GenerateForwardOrdinalFunction(893) GenerateForwardOrdinalFunction(894) GenerateForwardOrdinalFunction(895) GenerateForwardOrdinalFunction(896) GenerateForwardOrdinalFunction(897) GenerateForwardOrdinalFunction(898) GenerateForwardOrdinalFunction(899) GenerateForwardOrdinalFunction(900)\nGenerateForwardOrdinalFunction(901) GenerateForwardOrdinalFunction(902) GenerateForwardOrdinalFunction(903) GenerateForwardOrdinalFunction(904) GenerateForwardOrdinalFunction(905) GenerateForwardOrdinalFunction(906) GenerateForwardOrdinalFunction(907) GenerateForwardOrdinalFunction(908) GenerateForwardOrdinalFunction(909) GenerateForwardOrdinalFunction(910) GenerateForwardOrdinalFunction(911) GenerateForwardOrdinalFunction(912) GenerateForwardOrdinalFunction(913) GenerateForwardOrdinalFunction(914) GenerateForwardOrdinalFunction(915) GenerateForwardOrdinalFunction(916) GenerateForwardOrdinalFunction(917) GenerateForwardOrdinalFunction(918) GenerateForwardOrdinalFunction(919) GenerateForwardOrdinalFunction(920) GenerateForwardOrdinalFunction(921) GenerateForwardOrdinalFunction(922) GenerateForwardOrdinalFunction(923) GenerateForwardOrdinalFunction(924) GenerateForwardOrdinalFunction(925) GenerateForwardOrdinalFunction(926) GenerateForwardOrdinalFunction(927) GenerateForwardOrdinalFunction(928) GenerateForwardOrdinalFunction(929) GenerateForwardOrdinalFunction(930) GenerateForwardOrdinalFunction(931) GenerateForwardOrdinalFunction(932) GenerateForwardOrdinalFunction(933) GenerateForwardOrdinalFunction(934) GenerateForwardOrdinalFunction(935) GenerateForwardOrdinalFunction(936) GenerateForwardOrdinalFunction(937) GenerateForwardOrdinalFunction(938) GenerateForwardOrdinalFunction(939) GenerateForwardOrdinalFunction(940) GenerateForwardOrdinalFunction(941) GenerateForwardOrdinalFunction(942) GenerateForwardOrdinalFunction(943) GenerateForwardOrdinalFunction(944) GenerateForwardOrdinalFunction(945) GenerateForwardOrdinalFunction(946) GenerateForwardOrdinalFunction(947) GenerateForwardOrdinalFunction(948) GenerateForwardOrdinalFunction(949) GenerateForwardOrdinalFunction(950)\nGenerateForwardOrdinalFunction(951) GenerateForwardOrdinalFunction(952) GenerateForwardOrdinalFunction(953) GenerateForwardOrdinalFunction(954) GenerateForwardOrdinalFunction(955) GenerateForwardOrdinalFunction(956) GenerateForwardOrdinalFunction(957) GenerateForwardOrdinalFunction(958) GenerateForwardOrdinalFunction(959) GenerateForwardOrdinalFunction(960) GenerateForwardOrdinalFunction(961) GenerateForwardOrdinalFunction(962) GenerateForwardOrdinalFunction(963) GenerateForwardOrdinalFunction(964) GenerateForwardOrdinalFunction(965) GenerateForwardOrdinalFunction(966) GenerateForwardOrdinalFunction(967) GenerateForwardOrdinalFunction(968) GenerateForwardOrdinalFunction(969) GenerateForwardOrdinalFunction(970) GenerateForwardOrdinalFunction(971) GenerateForwardOrdinalFunction(972) GenerateForwardOrdinalFunction(973) GenerateForwardOrdinalFunction(974) GenerateForwardOrdinalFunction(975) GenerateForwardOrdinalFunction(976) GenerateForwardOrdinalFunction(977) GenerateForwardOrdinalFunction(978) GenerateForwardOrdinalFunction(979) GenerateForwardOrdinalFunction(980) GenerateForwardOrdinalFunction(981) GenerateForwardOrdinalFunction(982) GenerateForwardOrdinalFunction(983) GenerateForwardOrdinalFunction(984) GenerateForwardOrdinalFunction(985) GenerateForwardOrdinalFunction(986) GenerateForwardOrdinalFunction(987) GenerateForwardOrdinalFunction(988) GenerateForwardOrdinalFunction(989) GenerateForwardOrdinalFunction(990) GenerateForwardOrdinalFunction(991) GenerateForwardOrdinalFunction(992) GenerateForwardOrdinalFunction(993) GenerateForwardOrdinalFunction(994) GenerateForwardOrdinalFunction(995) GenerateForwardOrdinalFunction(996) GenerateForwardOrdinalFunction(997) GenerateForwardOrdinalFunction(998) GenerateForwardOrdinalFunction(999) GenerateForwardOrdinalFunction(1000)\nGenerateForwardOrdinalFunction(1001) GenerateForwardOrdinalFunction(1002) GenerateForwardOrdinalFunction(1003) GenerateForwardOrdinalFunction(1004) GenerateForwardOrdinalFunction(1005) GenerateForwardOrdinalFunction(1006) GenerateForwardOrdinalFunction(1007) GenerateForwardOrdinalFunction(1008) GenerateForwardOrdinalFunction(1009) GenerateForwardOrdinalFunction(1010) GenerateForwardOrdinalFunction(1011) GenerateForwardOrdinalFunction(1012) GenerateForwardOrdinalFunction(1013) GenerateForwardOrdinalFunction(1014) GenerateForwardOrdinalFunction(1015) GenerateForwardOrdinalFunction(1016) GenerateForwardOrdinalFunction(1017) GenerateForwardOrdinalFunction(1018) GenerateForwardOrdinalFunction(1019)\nstd::vector<void*> forwardOrdinalAddresses = {\n\t&ForwardOrdinal1, &ForwardOrdinal2, &ForwardOrdinal3, &ForwardOrdinal4, &ForwardOrdinal5, &ForwardOrdinal6, &ForwardOrdinal7, &ForwardOrdinal8, &ForwardOrdinal9, &ForwardOrdinal10, &ForwardOrdinal11, &ForwardOrdinal12, &ForwardOrdinal13, &ForwardOrdinal14, &ForwardOrdinal15, &ForwardOrdinal16, &ForwardOrdinal17, &ForwardOrdinal18, &ForwardOrdinal19, &ForwardOrdinal20, &ForwardOrdinal21, &ForwardOrdinal22, &ForwardOrdinal23, &ForwardOrdinal24, &ForwardOrdinal25, &ForwardOrdinal26, &ForwardOrdinal27, &ForwardOrdinal28, &ForwardOrdinal29, &ForwardOrdinal30, &ForwardOrdinal31, &ForwardOrdinal32, &ForwardOrdinal33, &ForwardOrdinal34, &ForwardOrdinal35, &ForwardOrdinal36, &ForwardOrdinal37, &ForwardOrdinal38, &ForwardOrdinal39, &ForwardOrdinal40, &ForwardOrdinal41, &ForwardOrdinal42, &ForwardOrdinal43, &ForwardOrdinal44, &ForwardOrdinal45, &ForwardOrdinal46, &ForwardOrdinal47, &ForwardOrdinal48, &ForwardOrdinal49, &ForwardOrdinal50,\n\t&ForwardOrdinal51, &ForwardOrdinal52, &ForwardOrdinal53, &ForwardOrdinal54, &ForwardOrdinal55, &ForwardOrdinal56, &ForwardOrdinal57, &ForwardOrdinal58, &ForwardOrdinal59, &ForwardOrdinal60, &ForwardOrdinal61, &ForwardOrdinal62, &ForwardOrdinal63, &ForwardOrdinal64, &ForwardOrdinal65, &ForwardOrdinal66, &ForwardOrdinal67, &ForwardOrdinal68, &ForwardOrdinal69, &ForwardOrdinal70, &ForwardOrdinal71, &ForwardOrdinal72, &ForwardOrdinal73, &ForwardOrdinal74, &ForwardOrdinal75, &ForwardOrdinal76, &ForwardOrdinal77, &ForwardOrdinal78, &ForwardOrdinal79, &ForwardOrdinal80, &ForwardOrdinal81, &ForwardOrdinal82, &ForwardOrdinal83, &ForwardOrdinal84, &ForwardOrdinal85, &ForwardOrdinal86, &ForwardOrdinal87, &ForwardOrdinal88, &ForwardOrdinal89, &ForwardOrdinal90, &ForwardOrdinal91, &ForwardOrdinal92, &ForwardOrdinal93, &ForwardOrdinal94, &ForwardOrdinal95, &ForwardOrdinal96, &ForwardOrdinal97, &ForwardOrdinal98, &ForwardOrdinal99, &ForwardOrdinal100,\n\t&ForwardOrdinal101, &ForwardOrdinal102, &ForwardOrdinal103, &ForwardOrdinal104, &ForwardOrdinal105, &ForwardOrdinal106, &ForwardOrdinal107, &ForwardOrdinal108, &ForwardOrdinal109, &ForwardOrdinal110, &ForwardOrdinal111, &ForwardOrdinal112, &ForwardOrdinal113, &ForwardOrdinal114, &ForwardOrdinal115, &ForwardOrdinal116, &ForwardOrdinal117, &ForwardOrdinal118, &ForwardOrdinal119, &ForwardOrdinal120, &ForwardOrdinal121, &ForwardOrdinal122, &ForwardOrdinal123, &ForwardOrdinal124, &ForwardOrdinal125, &ForwardOrdinal126, &ForwardOrdinal127, &ForwardOrdinal128, &ForwardOrdinal129, &ForwardOrdinal130, &ForwardOrdinal131, &ForwardOrdinal132, &ForwardOrdinal133, &ForwardOrdinal134, &ForwardOrdinal135, &ForwardOrdinal136, &ForwardOrdinal137, &ForwardOrdinal138, &ForwardOrdinal139, &ForwardOrdinal140, &ForwardOrdinal141, &ForwardOrdinal142, &ForwardOrdinal143, &ForwardOrdinal144, &ForwardOrdinal145, &ForwardOrdinal146, &ForwardOrdinal147, &ForwardOrdinal148, &ForwardOrdinal149, &ForwardOrdinal150,\n\t&ForwardOrdinal151, &ForwardOrdinal152, &ForwardOrdinal153, &ForwardOrdinal154, &ForwardOrdinal155, &ForwardOrdinal156, &ForwardOrdinal157, &ForwardOrdinal158, &ForwardOrdinal159, &ForwardOrdinal160, &ForwardOrdinal161, &ForwardOrdinal162, &ForwardOrdinal163, &ForwardOrdinal164, &ForwardOrdinal165, &ForwardOrdinal166, &ForwardOrdinal167, &ForwardOrdinal168, &ForwardOrdinal169, &ForwardOrdinal170, &ForwardOrdinal171, &ForwardOrdinal172, &ForwardOrdinal173, &ForwardOrdinal174, &ForwardOrdinal175, &ForwardOrdinal176, &ForwardOrdinal177, &ForwardOrdinal178, &ForwardOrdinal179, &ForwardOrdinal180, &ForwardOrdinal181, &ForwardOrdinal182, &ForwardOrdinal183, &ForwardOrdinal184, &ForwardOrdinal185, &ForwardOrdinal186, &ForwardOrdinal187, &ForwardOrdinal188, &ForwardOrdinal189, &ForwardOrdinal190, &ForwardOrdinal191, &ForwardOrdinal192, &ForwardOrdinal193, &ForwardOrdinal194, &ForwardOrdinal195, &ForwardOrdinal196, &ForwardOrdinal197, &ForwardOrdinal198, &ForwardOrdinal199, &ForwardOrdinal200,\n\t&ForwardOrdinal201, &ForwardOrdinal202, &ForwardOrdinal203, &ForwardOrdinal204, &ForwardOrdinal205, &ForwardOrdinal206, &ForwardOrdinal207, &ForwardOrdinal208, &ForwardOrdinal209, &ForwardOrdinal210, &ForwardOrdinal211, &ForwardOrdinal212, &ForwardOrdinal213, &ForwardOrdinal214, &ForwardOrdinal215, &ForwardOrdinal216, &ForwardOrdinal217, &ForwardOrdinal218, &ForwardOrdinal219, &ForwardOrdinal220, &ForwardOrdinal221, &ForwardOrdinal222, &ForwardOrdinal223, &ForwardOrdinal224, &ForwardOrdinal225, &ForwardOrdinal226, &ForwardOrdinal227, &ForwardOrdinal228, &ForwardOrdinal229, &ForwardOrdinal230, &ForwardOrdinal231, &ForwardOrdinal232, &ForwardOrdinal233, &ForwardOrdinal234, &ForwardOrdinal235, &ForwardOrdinal236, &ForwardOrdinal237, &ForwardOrdinal238, &ForwardOrdinal239, &ForwardOrdinal240, &ForwardOrdinal241, &ForwardOrdinal242, &ForwardOrdinal243, &ForwardOrdinal244, &ForwardOrdinal245, &ForwardOrdinal246, &ForwardOrdinal247, &ForwardOrdinal248, &ForwardOrdinal249, &ForwardOrdinal250,\n\t&ForwardOrdinal251, &ForwardOrdinal252, &ForwardOrdinal253, &ForwardOrdinal254, &ForwardOrdinal255, &ForwardOrdinal256, &ForwardOrdinal257, &ForwardOrdinal258, &ForwardOrdinal259, &ForwardOrdinal260, &ForwardOrdinal261, &ForwardOrdinal262, &ForwardOrdinal263, &ForwardOrdinal264, &ForwardOrdinal265, &ForwardOrdinal266, &ForwardOrdinal267, &ForwardOrdinal268, &ForwardOrdinal269, &ForwardOrdinal270, &ForwardOrdinal271, &ForwardOrdinal272, &ForwardOrdinal273, &ForwardOrdinal274, &ForwardOrdinal275, &ForwardOrdinal276, &ForwardOrdinal277, &ForwardOrdinal278, &ForwardOrdinal279, &ForwardOrdinal280, &ForwardOrdinal281, &ForwardOrdinal282, &ForwardOrdinal283, &ForwardOrdinal284, &ForwardOrdinal285, &ForwardOrdinal286, &ForwardOrdinal287, &ForwardOrdinal288, &ForwardOrdinal289, &ForwardOrdinal290, &ForwardOrdinal291, &ForwardOrdinal292, &ForwardOrdinal293, &ForwardOrdinal294, &ForwardOrdinal295, &ForwardOrdinal296, &ForwardOrdinal297, &ForwardOrdinal298, &ForwardOrdinal299, &ForwardOrdinal300,\n\t&ForwardOrdinal301, &ForwardOrdinal302, &ForwardOrdinal303, &ForwardOrdinal304, &ForwardOrdinal305, &ForwardOrdinal306, &ForwardOrdinal307, &ForwardOrdinal308, &ForwardOrdinal309, &ForwardOrdinal310, &ForwardOrdinal311, &ForwardOrdinal312, &ForwardOrdinal313, &ForwardOrdinal314, &ForwardOrdinal315, &ForwardOrdinal316, &ForwardOrdinal317, &ForwardOrdinal318, &ForwardOrdinal319, &ForwardOrdinal320, &ForwardOrdinal321, &ForwardOrdinal322, &ForwardOrdinal323, &ForwardOrdinal324, &ForwardOrdinal325, &ForwardOrdinal326, &ForwardOrdinal327, &ForwardOrdinal328, &ForwardOrdinal329, &ForwardOrdinal330, &ForwardOrdinal331, &ForwardOrdinal332, &ForwardOrdinal333, &ForwardOrdinal334, &ForwardOrdinal335, &ForwardOrdinal336, &ForwardOrdinal337, &ForwardOrdinal338, &ForwardOrdinal339, &ForwardOrdinal340, &ForwardOrdinal341, &ForwardOrdinal342, &ForwardOrdinal343, &ForwardOrdinal344, &ForwardOrdinal345, &ForwardOrdinal346, &ForwardOrdinal347, &ForwardOrdinal348, &ForwardOrdinal349, &ForwardOrdinal350,\n\t&ForwardOrdinal351, &ForwardOrdinal352, &ForwardOrdinal353, &ForwardOrdinal354, &ForwardOrdinal355, &ForwardOrdinal356, &ForwardOrdinal357, &ForwardOrdinal358, &ForwardOrdinal359, &ForwardOrdinal360, &ForwardOrdinal361, &ForwardOrdinal362, &ForwardOrdinal363, &ForwardOrdinal364, &ForwardOrdinal365, &ForwardOrdinal366, &ForwardOrdinal367, &ForwardOrdinal368, &ForwardOrdinal369, &ForwardOrdinal370, &ForwardOrdinal371, &ForwardOrdinal372, &ForwardOrdinal373, &ForwardOrdinal374, &ForwardOrdinal375, &ForwardOrdinal376, &ForwardOrdinal377, &ForwardOrdinal378, &ForwardOrdinal379, &ForwardOrdinal380, &ForwardOrdinal381, &ForwardOrdinal382, &ForwardOrdinal383, &ForwardOrdinal384, &ForwardOrdinal385, &ForwardOrdinal386, &ForwardOrdinal387, &ForwardOrdinal388, &ForwardOrdinal389, &ForwardOrdinal390, &ForwardOrdinal391, &ForwardOrdinal392, &ForwardOrdinal393, &ForwardOrdinal394, &ForwardOrdinal395, &ForwardOrdinal396, &ForwardOrdinal397, &ForwardOrdinal398, &ForwardOrdinal399, &ForwardOrdinal400,\n\t&ForwardOrdinal401, &ForwardOrdinal402, &ForwardOrdinal403, &ForwardOrdinal404, &ForwardOrdinal405, &ForwardOrdinal406, &ForwardOrdinal407, &ForwardOrdinal408, &ForwardOrdinal409, &ForwardOrdinal410, &ForwardOrdinal411, &ForwardOrdinal412, &ForwardOrdinal413, &ForwardOrdinal414, &ForwardOrdinal415, &ForwardOrdinal416, &ForwardOrdinal417, &ForwardOrdinal418, &ForwardOrdinal419, &ForwardOrdinal420, &ForwardOrdinal421, &ForwardOrdinal422, &ForwardOrdinal423, &ForwardOrdinal424, &ForwardOrdinal425, &ForwardOrdinal426, &ForwardOrdinal427, &ForwardOrdinal428, &ForwardOrdinal429, &ForwardOrdinal430, &ForwardOrdinal431, &ForwardOrdinal432, &ForwardOrdinal433, &ForwardOrdinal434, &ForwardOrdinal435, &ForwardOrdinal436, &ForwardOrdinal437, &ForwardOrdinal438, &ForwardOrdinal439, &ForwardOrdinal440, &ForwardOrdinal441, &ForwardOrdinal442, &ForwardOrdinal443, &ForwardOrdinal444, &ForwardOrdinal445, &ForwardOrdinal446, &ForwardOrdinal447, &ForwardOrdinal448, &ForwardOrdinal449, &ForwardOrdinal450,\n\t&ForwardOrdinal451, &ForwardOrdinal452, &ForwardOrdinal453, &ForwardOrdinal454, &ForwardOrdinal455, &ForwardOrdinal456, &ForwardOrdinal457, &ForwardOrdinal458, &ForwardOrdinal459, &ForwardOrdinal460, &ForwardOrdinal461, &ForwardOrdinal462, &ForwardOrdinal463, &ForwardOrdinal464, &ForwardOrdinal465, &ForwardOrdinal466, &ForwardOrdinal467, &ForwardOrdinal468, &ForwardOrdinal469, &ForwardOrdinal470, &ForwardOrdinal471, &ForwardOrdinal472, &ForwardOrdinal473, &ForwardOrdinal474, &ForwardOrdinal475, &ForwardOrdinal476, &ForwardOrdinal477, &ForwardOrdinal478, &ForwardOrdinal479, &ForwardOrdinal480, &ForwardOrdinal481, &ForwardOrdinal482, &ForwardOrdinal483, &ForwardOrdinal484, &ForwardOrdinal485, &ForwardOrdinal486, &ForwardOrdinal487, &ForwardOrdinal488, &ForwardOrdinal489, &ForwardOrdinal490, &ForwardOrdinal491, &ForwardOrdinal492, &ForwardOrdinal493, &ForwardOrdinal494, &ForwardOrdinal495, &ForwardOrdinal496, &ForwardOrdinal497, &ForwardOrdinal498, &ForwardOrdinal499, &ForwardOrdinal500,\n\t&ForwardOrdinal501, &ForwardOrdinal502, &ForwardOrdinal503, &ForwardOrdinal504, &ForwardOrdinal505, &ForwardOrdinal506, &ForwardOrdinal507, &ForwardOrdinal508, &ForwardOrdinal509, &ForwardOrdinal510, &ForwardOrdinal511, &ForwardOrdinal512, &ForwardOrdinal513, &ForwardOrdinal514, &ForwardOrdinal515, &ForwardOrdinal516, &ForwardOrdinal517, &ForwardOrdinal518, &ForwardOrdinal519, &ForwardOrdinal520, &ForwardOrdinal521, &ForwardOrdinal522, &ForwardOrdinal523, &ForwardOrdinal524, &ForwardOrdinal525, &ForwardOrdinal526, &ForwardOrdinal527, &ForwardOrdinal528, &ForwardOrdinal529, &ForwardOrdinal530, &ForwardOrdinal531, &ForwardOrdinal532, &ForwardOrdinal533, &ForwardOrdinal534, &ForwardOrdinal535, &ForwardOrdinal536, &ForwardOrdinal537, &ForwardOrdinal538, &ForwardOrdinal539, &ForwardOrdinal540, &ForwardOrdinal541, &ForwardOrdinal542, &ForwardOrdinal543, &ForwardOrdinal544, &ForwardOrdinal545, &ForwardOrdinal546, &ForwardOrdinal547, &ForwardOrdinal548, &ForwardOrdinal549, &ForwardOrdinal550,\n\t&ForwardOrdinal551, &ForwardOrdinal552, &ForwardOrdinal553, &ForwardOrdinal554, &ForwardOrdinal555, &ForwardOrdinal556, &ForwardOrdinal557, &ForwardOrdinal558, &ForwardOrdinal559, &ForwardOrdinal560, &ForwardOrdinal561, &ForwardOrdinal562, &ForwardOrdinal563, &ForwardOrdinal564, &ForwardOrdinal565, &ForwardOrdinal566, &ForwardOrdinal567, &ForwardOrdinal568, &ForwardOrdinal569, &ForwardOrdinal570, &ForwardOrdinal571, &ForwardOrdinal572, &ForwardOrdinal573, &ForwardOrdinal574, &ForwardOrdinal575, &ForwardOrdinal576, &ForwardOrdinal577, &ForwardOrdinal578, &ForwardOrdinal579, &ForwardOrdinal580, &ForwardOrdinal581, &ForwardOrdinal582, &ForwardOrdinal583, &ForwardOrdinal584, &ForwardOrdinal585, &ForwardOrdinal586, &ForwardOrdinal587, &ForwardOrdinal588, &ForwardOrdinal589, &ForwardOrdinal590, &ForwardOrdinal591, &ForwardOrdinal592, &ForwardOrdinal593, &ForwardOrdinal594, &ForwardOrdinal595, &ForwardOrdinal596, &ForwardOrdinal597, &ForwardOrdinal598, &ForwardOrdinal599, &ForwardOrdinal600,\n\t&ForwardOrdinal601, &ForwardOrdinal602, &ForwardOrdinal603, &ForwardOrdinal604, &ForwardOrdinal605, &ForwardOrdinal606, &ForwardOrdinal607, &ForwardOrdinal608, &ForwardOrdinal609, &ForwardOrdinal610, &ForwardOrdinal611, &ForwardOrdinal612, &ForwardOrdinal613, &ForwardOrdinal614, &ForwardOrdinal615, &ForwardOrdinal616, &ForwardOrdinal617, &ForwardOrdinal618, &ForwardOrdinal619, &ForwardOrdinal620, &ForwardOrdinal621, &ForwardOrdinal622, &ForwardOrdinal623, &ForwardOrdinal624, &ForwardOrdinal625, &ForwardOrdinal626, &ForwardOrdinal627, &ForwardOrdinal628, &ForwardOrdinal629, &ForwardOrdinal630, &ForwardOrdinal631, &ForwardOrdinal632, &ForwardOrdinal633, &ForwardOrdinal634, &ForwardOrdinal635, &ForwardOrdinal636, &ForwardOrdinal637, &ForwardOrdinal638, &ForwardOrdinal639, &ForwardOrdinal640, &ForwardOrdinal641, &ForwardOrdinal642, &ForwardOrdinal643, &ForwardOrdinal644, &ForwardOrdinal645, &ForwardOrdinal646, &ForwardOrdinal647, &ForwardOrdinal648, &ForwardOrdinal649, &ForwardOrdinal650,\n\t&ForwardOrdinal651, &ForwardOrdinal652, &ForwardOrdinal653, &ForwardOrdinal654, &ForwardOrdinal655, &ForwardOrdinal656, &ForwardOrdinal657, &ForwardOrdinal658, &ForwardOrdinal659, &ForwardOrdinal660, &ForwardOrdinal661, &ForwardOrdinal662, &ForwardOrdinal663, &ForwardOrdinal664, &ForwardOrdinal665, &ForwardOrdinal666, &ForwardOrdinal667, &ForwardOrdinal668, &ForwardOrdinal669, &ForwardOrdinal670, &ForwardOrdinal671, &ForwardOrdinal672, &ForwardOrdinal673, &ForwardOrdinal674, &ForwardOrdinal675, &ForwardOrdinal676, &ForwardOrdinal677, &ForwardOrdinal678, &ForwardOrdinal679, &ForwardOrdinal680, &ForwardOrdinal681, &ForwardOrdinal682, &ForwardOrdinal683, &ForwardOrdinal684, &ForwardOrdinal685, &ForwardOrdinal686, &ForwardOrdinal687, &ForwardOrdinal688, &ForwardOrdinal689, &ForwardOrdinal690, &ForwardOrdinal691, &ForwardOrdinal692, &ForwardOrdinal693, &ForwardOrdinal694, &ForwardOrdinal695, &ForwardOrdinal696, &ForwardOrdinal697, &ForwardOrdinal698, &ForwardOrdinal699, &ForwardOrdinal700,\n\t&ForwardOrdinal701, &ForwardOrdinal702, &ForwardOrdinal703, &ForwardOrdinal704, &ForwardOrdinal705, &ForwardOrdinal706, &ForwardOrdinal707, &ForwardOrdinal708, &ForwardOrdinal709, &ForwardOrdinal710, &ForwardOrdinal711, &ForwardOrdinal712, &ForwardOrdinal713, &ForwardOrdinal714, &ForwardOrdinal715, &ForwardOrdinal716, &ForwardOrdinal717, &ForwardOrdinal718, &ForwardOrdinal719, &ForwardOrdinal720, &ForwardOrdinal721, &ForwardOrdinal722, &ForwardOrdinal723, &ForwardOrdinal724, &ForwardOrdinal725, &ForwardOrdinal726, &ForwardOrdinal727, &ForwardOrdinal728, &ForwardOrdinal729, &ForwardOrdinal730, &ForwardOrdinal731, &ForwardOrdinal732, &ForwardOrdinal733, &ForwardOrdinal734, &ForwardOrdinal735, &ForwardOrdinal736, &ForwardOrdinal737, &ForwardOrdinal738, &ForwardOrdinal739, &ForwardOrdinal740, &ForwardOrdinal741, &ForwardOrdinal742, &ForwardOrdinal743, &ForwardOrdinal744, &ForwardOrdinal745, &ForwardOrdinal746, &ForwardOrdinal747, &ForwardOrdinal748, &ForwardOrdinal749, &ForwardOrdinal750,\n\t&ForwardOrdinal751, &ForwardOrdinal752, &ForwardOrdinal753, &ForwardOrdinal754, &ForwardOrdinal755, &ForwardOrdinal756, &ForwardOrdinal757, &ForwardOrdinal758, &ForwardOrdinal759, &ForwardOrdinal760, &ForwardOrdinal761, &ForwardOrdinal762, &ForwardOrdinal763, &ForwardOrdinal764, &ForwardOrdinal765, &ForwardOrdinal766, &ForwardOrdinal767, &ForwardOrdinal768, &ForwardOrdinal769, &ForwardOrdinal770, &ForwardOrdinal771, &ForwardOrdinal772, &ForwardOrdinal773, &ForwardOrdinal774, &ForwardOrdinal775, &ForwardOrdinal776, &ForwardOrdinal777, &ForwardOrdinal778, &ForwardOrdinal779, &ForwardOrdinal780, &ForwardOrdinal781, &ForwardOrdinal782, &ForwardOrdinal783, &ForwardOrdinal784, &ForwardOrdinal785, &ForwardOrdinal786, &ForwardOrdinal787, &ForwardOrdinal788, &ForwardOrdinal789, &ForwardOrdinal790, &ForwardOrdinal791, &ForwardOrdinal792, &ForwardOrdinal793, &ForwardOrdinal794, &ForwardOrdinal795, &ForwardOrdinal796, &ForwardOrdinal797, &ForwardOrdinal798, &ForwardOrdinal799, &ForwardOrdinal800,\n\t&ForwardOrdinal801, &ForwardOrdinal802, &ForwardOrdinal803, &ForwardOrdinal804, &ForwardOrdinal805, &ForwardOrdinal806, &ForwardOrdinal807, &ForwardOrdinal808, &ForwardOrdinal809, &ForwardOrdinal810, &ForwardOrdinal811, &ForwardOrdinal812, &ForwardOrdinal813, &ForwardOrdinal814, &ForwardOrdinal815, &ForwardOrdinal816, &ForwardOrdinal817, &ForwardOrdinal818, &ForwardOrdinal819, &ForwardOrdinal820, &ForwardOrdinal821, &ForwardOrdinal822, &ForwardOrdinal823, &ForwardOrdinal824, &ForwardOrdinal825, &ForwardOrdinal826, &ForwardOrdinal827, &ForwardOrdinal828, &ForwardOrdinal829, &ForwardOrdinal830, &ForwardOrdinal831, &ForwardOrdinal832, &ForwardOrdinal833, &ForwardOrdinal834, &ForwardOrdinal835, &ForwardOrdinal836, &ForwardOrdinal837, &ForwardOrdinal838, &ForwardOrdinal839, &ForwardOrdinal840, &ForwardOrdinal841, &ForwardOrdinal842, &ForwardOrdinal843, &ForwardOrdinal844, &ForwardOrdinal845, &ForwardOrdinal846, &ForwardOrdinal847, &ForwardOrdinal848, &ForwardOrdinal849, &ForwardOrdinal850,\n\t&ForwardOrdinal851, &ForwardOrdinal852, &ForwardOrdinal853, &ForwardOrdinal854, &ForwardOrdinal855, &ForwardOrdinal856, &ForwardOrdinal857, &ForwardOrdinal858, &ForwardOrdinal859, &ForwardOrdinal860, &ForwardOrdinal861, &ForwardOrdinal862, &ForwardOrdinal863, &ForwardOrdinal864, &ForwardOrdinal865, &ForwardOrdinal866, &ForwardOrdinal867, &ForwardOrdinal868, &ForwardOrdinal869, &ForwardOrdinal870, &ForwardOrdinal871, &ForwardOrdinal872, &ForwardOrdinal873, &ForwardOrdinal874, &ForwardOrdinal875, &ForwardOrdinal876, &ForwardOrdinal877, &ForwardOrdinal878, &ForwardOrdinal879, &ForwardOrdinal880, &ForwardOrdinal881, &ForwardOrdinal882, &ForwardOrdinal883, &ForwardOrdinal884, &ForwardOrdinal885, &ForwardOrdinal886, &ForwardOrdinal887, &ForwardOrdinal888, &ForwardOrdinal889, &ForwardOrdinal890, &ForwardOrdinal891, &ForwardOrdinal892, &ForwardOrdinal893, &ForwardOrdinal894, &ForwardOrdinal895, &ForwardOrdinal896, &ForwardOrdinal897, &ForwardOrdinal898, &ForwardOrdinal899, &ForwardOrdinal900,\n\t&ForwardOrdinal901, &ForwardOrdinal902, &ForwardOrdinal903, &ForwardOrdinal904, &ForwardOrdinal905, &ForwardOrdinal906, &ForwardOrdinal907, &ForwardOrdinal908, &ForwardOrdinal909, &ForwardOrdinal910, &ForwardOrdinal911, &ForwardOrdinal912, &ForwardOrdinal913, &ForwardOrdinal914, &ForwardOrdinal915, &ForwardOrdinal916, &ForwardOrdinal917, &ForwardOrdinal918, &ForwardOrdinal919, &ForwardOrdinal920, &ForwardOrdinal921, &ForwardOrdinal922, &ForwardOrdinal923, &ForwardOrdinal924, &ForwardOrdinal925, &ForwardOrdinal926, &ForwardOrdinal927, &ForwardOrdinal928, &ForwardOrdinal929, &ForwardOrdinal930, &ForwardOrdinal931, &ForwardOrdinal932, &ForwardOrdinal933, &ForwardOrdinal934, &ForwardOrdinal935, &ForwardOrdinal936, &ForwardOrdinal937, &ForwardOrdinal938, &ForwardOrdinal939, &ForwardOrdinal940, &ForwardOrdinal941, &ForwardOrdinal942, &ForwardOrdinal943, &ForwardOrdinal944, &ForwardOrdinal945, &ForwardOrdinal946, &ForwardOrdinal947, &ForwardOrdinal948, &ForwardOrdinal949, &ForwardOrdinal950,\n\t&ForwardOrdinal951, &ForwardOrdinal952, &ForwardOrdinal953, &ForwardOrdinal954, &ForwardOrdinal955, &ForwardOrdinal956, &ForwardOrdinal957, &ForwardOrdinal958, &ForwardOrdinal959, &ForwardOrdinal960, &ForwardOrdinal961, &ForwardOrdinal962, &ForwardOrdinal963, &ForwardOrdinal964, &ForwardOrdinal965, &ForwardOrdinal966, &ForwardOrdinal967, &ForwardOrdinal968, &ForwardOrdinal969, &ForwardOrdinal970, &ForwardOrdinal971, &ForwardOrdinal972, &ForwardOrdinal973, &ForwardOrdinal974, &ForwardOrdinal975, &ForwardOrdinal976, &ForwardOrdinal977, &ForwardOrdinal978, &ForwardOrdinal979, &ForwardOrdinal980, &ForwardOrdinal981, &ForwardOrdinal982, &ForwardOrdinal983, &ForwardOrdinal984, &ForwardOrdinal985, &ForwardOrdinal986, &ForwardOrdinal987, &ForwardOrdinal988, &ForwardOrdinal989, &ForwardOrdinal990, &ForwardOrdinal991, &ForwardOrdinal992, &ForwardOrdinal993, &ForwardOrdinal994, &ForwardOrdinal995, &ForwardOrdinal996, &ForwardOrdinal997, &ForwardOrdinal998, &ForwardOrdinal999, &ForwardOrdinal1000,\n\t&ForwardOrdinal1001, &ForwardOrdinal1002, &ForwardOrdinal1003, &ForwardOrdinal1004, &ForwardOrdinal1005, &ForwardOrdinal1006, &ForwardOrdinal1007, &ForwardOrdinal1008, &ForwardOrdinal1009, &ForwardOrdinal1010, &ForwardOrdinal1011, &ForwardOrdinal1012, &ForwardOrdinal1013, &ForwardOrdinal1014, &ForwardOrdinal1015, &ForwardOrdinal1016, &ForwardOrdinal1017, &ForwardOrdinal1018, &ForwardOrdinal1019\n};\n\nGenerateForwardSharedFunction(0) GenerateForwardSharedFunction(1) GenerateForwardSharedFunction(2) GenerateForwardSharedFunction(3) GenerateForwardSharedFunction(4) GenerateForwardSharedFunction(5) GenerateForwardSharedFunction(6) GenerateForwardSharedFunction(7) GenerateForwardSharedFunction(8) GenerateForwardSharedFunction(9) GenerateForwardSharedFunction(10) GenerateForwardSharedFunction(11) GenerateForwardSharedFunction(12) GenerateForwardSharedFunction(13) GenerateForwardSharedFunction(14) GenerateForwardSharedFunction(15) GenerateForwardSharedFunction(16) GenerateForwardSharedFunction(17) GenerateForwardSharedFunction(18) GenerateForwardSharedFunction(19) GenerateForwardSharedFunction(20) GenerateForwardSharedFunction(21) GenerateForwardSharedFunction(22) GenerateForwardSharedFunction(23) GenerateForwardSharedFunction(24) GenerateForwardSharedFunction(25) GenerateForwardSharedFunction(26) GenerateForwardSharedFunction(27) GenerateForwardSharedFunction(28) GenerateForwardSharedFunction(29) GenerateForwardSharedFunction(30) GenerateForwardSharedFunction(31) GenerateForwardSharedFunction(32) GenerateForwardSharedFunction(33) GenerateForwardSharedFunction(34) GenerateForwardSharedFunction(35) GenerateForwardSharedFunction(36) GenerateForwardSharedFunction(37) GenerateForwardSharedFunction(38) GenerateForwardSharedFunction(39) GenerateForwardSharedFunction(40) GenerateForwardSharedFunction(41) GenerateForwardSharedFunction(42) GenerateForwardSharedFunction(43) GenerateForwardSharedFunction(44) GenerateForwardSharedFunction(45) GenerateForwardSharedFunction(46) GenerateForwardSharedFunction(47) GenerateForwardSharedFunction(48) GenerateForwardSharedFunction(49)\nstd::vector<void*> forwardSharedAddresses = {\n\t&ForwardShared0, &ForwardShared1, &ForwardShared2, &ForwardShared3, &ForwardShared4, &ForwardShared5, &ForwardShared6, &ForwardShared7, &ForwardShared8, &ForwardShared9, &ForwardShared10, &ForwardShared11, &ForwardShared12, &ForwardShared13, &ForwardShared14, &ForwardShared15, &ForwardShared16, &ForwardShared17, &ForwardShared18, &ForwardShared19, &ForwardShared20, &ForwardShared21, &ForwardShared22, &ForwardShared23, &ForwardShared24, &ForwardShared25, &ForwardShared26, &ForwardShared27, &ForwardShared28, &ForwardShared29, &ForwardShared30, &ForwardShared31, &ForwardShared32, &ForwardShared33, &ForwardShared34, &ForwardShared35, &ForwardShared36, &ForwardShared37, &ForwardShared38, &ForwardShared39, &ForwardShared40, &ForwardShared41, &ForwardShared42, &ForwardShared43, &ForwardShared44, &ForwardShared45, &ForwardShared46, &ForwardShared47, &ForwardShared48, &ForwardShared49\n};\n\n#ifndef _WIN64\n#define Export_(index, name) __pragma(comment(linker, \"/export:\"#name\"=_Forward\"#index))\n#define ExportOrdinal_(ordinal) __pragma(comment(linker, \"/export:\"#ordinal\"=_ForwardOrdinal\"#ordinal\",@\"#ordinal\",NONAME\"))\n#define ExportShared_(index, name) __pragma(comment(linker, \"/export:\"#name\"=_ForwardShared\"##index))\n#else\n#define Export_(index, name) __pragma(comment(linker, \"/export:\"#name\"=Forward\"#index))\n#define ExportOrdinal_(ordinal) __pragma(comment(linker, \"/export:\"#ordinal\"=ForwardOrdinal\"#ordinal\",@\"#ordinal\",NONAME\"))\n#define ExportShared_(index, name) __pragma(comment(linker, \"/export:\"#name\"=ForwardShared\"##index))\n#endif\n\n#define Export(index, name) Export_(index, name)\n#define ExportOrdinal(ordinal) ExportOrdinal_(ordinal)\n#define ExportShared(index, name) ExportShared_(index, name)\n\n// Handle export names shared by multiple DLLs\n// Note: it's fine if these are duplicated in the normal export list\n#define ExpandNumber_(num) #num\n#define ExpandNumber(num) ExpandNumber_(num)\nExportShared(ExpandNumber(SharedExportIndex_DllCanUnloadNow), DllCanUnloadNow)\nExportShared(ExpandNumber(SharedExportIndex_DllGetClassObject), DllGetClassObject)\nExportShared(ExpandNumber(SharedExportIndex_SetAppCompatStringPointer), SetAppCompatStringPointer)\n\n// Export an amount of ordinals equal to highest amount of exports exported by one of the supported DLLs\nExportOrdinal(1) ExportOrdinal(2) ExportOrdinal(3) ExportOrdinal(4) ExportOrdinal(5) ExportOrdinal(6) ExportOrdinal(7) ExportOrdinal(8) ExportOrdinal(9) ExportOrdinal(10) ExportOrdinal(11) ExportOrdinal(12) ExportOrdinal(13) ExportOrdinal(14) ExportOrdinal(15) ExportOrdinal(16) ExportOrdinal(17) ExportOrdinal(18) ExportOrdinal(19) ExportOrdinal(20) ExportOrdinal(21) ExportOrdinal(22) ExportOrdinal(23) ExportOrdinal(24) ExportOrdinal(25) ExportOrdinal(26) ExportOrdinal(27) ExportOrdinal(28) ExportOrdinal(29) ExportOrdinal(30) ExportOrdinal(31) ExportOrdinal(32) ExportOrdinal(33) ExportOrdinal(34) ExportOrdinal(35) ExportOrdinal(36) ExportOrdinal(37) ExportOrdinal(38) ExportOrdinal(39) ExportOrdinal(40) ExportOrdinal(41) ExportOrdinal(42) ExportOrdinal(43) ExportOrdinal(44) ExportOrdinal(45) ExportOrdinal(46) ExportOrdinal(47) ExportOrdinal(48) ExportOrdinal(49) ExportOrdinal(50)\nExportOrdinal(51) ExportOrdinal(52) ExportOrdinal(53) ExportOrdinal(54) ExportOrdinal(55) ExportOrdinal(56) ExportOrdinal(57) ExportOrdinal(58) ExportOrdinal(59) ExportOrdinal(60) ExportOrdinal(61) ExportOrdinal(62) ExportOrdinal(63) ExportOrdinal(64) ExportOrdinal(65) ExportOrdinal(66) ExportOrdinal(67) ExportOrdinal(68) ExportOrdinal(69) ExportOrdinal(70) ExportOrdinal(71) ExportOrdinal(72) ExportOrdinal(73) ExportOrdinal(74) ExportOrdinal(75) ExportOrdinal(76) ExportOrdinal(77) ExportOrdinal(78) ExportOrdinal(79) ExportOrdinal(80) ExportOrdinal(81) ExportOrdinal(82) ExportOrdinal(83) ExportOrdinal(84) ExportOrdinal(85) ExportOrdinal(86) ExportOrdinal(87) ExportOrdinal(88) ExportOrdinal(89) ExportOrdinal(90) ExportOrdinal(91) ExportOrdinal(92) ExportOrdinal(93) ExportOrdinal(94) ExportOrdinal(95) ExportOrdinal(96) ExportOrdinal(97) ExportOrdinal(98) ExportOrdinal(99) ExportOrdinal(100)\nExportOrdinal(101) ExportOrdinal(102) ExportOrdinal(103) ExportOrdinal(104) ExportOrdinal(105) ExportOrdinal(106) ExportOrdinal(107) ExportOrdinal(108) ExportOrdinal(109) ExportOrdinal(110) ExportOrdinal(111) ExportOrdinal(112) ExportOrdinal(113) ExportOrdinal(114) ExportOrdinal(115) ExportOrdinal(116) ExportOrdinal(117) ExportOrdinal(118) ExportOrdinal(119) ExportOrdinal(120) ExportOrdinal(121) ExportOrdinal(122) ExportOrdinal(123) ExportOrdinal(124) ExportOrdinal(125) ExportOrdinal(126) ExportOrdinal(127) ExportOrdinal(128) ExportOrdinal(129) ExportOrdinal(130) ExportOrdinal(131) ExportOrdinal(132) ExportOrdinal(133) ExportOrdinal(134) ExportOrdinal(135) ExportOrdinal(136) ExportOrdinal(137) ExportOrdinal(138) ExportOrdinal(139) ExportOrdinal(140) ExportOrdinal(141) ExportOrdinal(142) ExportOrdinal(143) ExportOrdinal(144) ExportOrdinal(145) ExportOrdinal(146) ExportOrdinal(147) ExportOrdinal(148) ExportOrdinal(149) ExportOrdinal(150)\nExportOrdinal(151) ExportOrdinal(152) ExportOrdinal(153) ExportOrdinal(154) ExportOrdinal(155) ExportOrdinal(156) ExportOrdinal(157) ExportOrdinal(158) ExportOrdinal(159) ExportOrdinal(160) ExportOrdinal(161) ExportOrdinal(162) ExportOrdinal(163) ExportOrdinal(164) ExportOrdinal(165) ExportOrdinal(166) ExportOrdinal(167) ExportOrdinal(168) ExportOrdinal(169) ExportOrdinal(170) ExportOrdinal(171) ExportOrdinal(172) ExportOrdinal(173) ExportOrdinal(174) ExportOrdinal(175) ExportOrdinal(176) ExportOrdinal(177) ExportOrdinal(178) ExportOrdinal(179) ExportOrdinal(180) ExportOrdinal(181) ExportOrdinal(182) ExportOrdinal(183) ExportOrdinal(184) ExportOrdinal(185) ExportOrdinal(186) ExportOrdinal(187) ExportOrdinal(188) ExportOrdinal(189) ExportOrdinal(190) ExportOrdinal(191) ExportOrdinal(192) ExportOrdinal(193) ExportOrdinal(194) ExportOrdinal(195) ExportOrdinal(196) ExportOrdinal(197) ExportOrdinal(198) ExportOrdinal(199) ExportOrdinal(200)\nExportOrdinal(201) ExportOrdinal(202) ExportOrdinal(203) ExportOrdinal(204) ExportOrdinal(205) ExportOrdinal(206) ExportOrdinal(207) ExportOrdinal(208) ExportOrdinal(209) ExportOrdinal(210) ExportOrdinal(211) ExportOrdinal(212) ExportOrdinal(213) ExportOrdinal(214) ExportOrdinal(215) ExportOrdinal(216) ExportOrdinal(217) ExportOrdinal(218) ExportOrdinal(219) ExportOrdinal(220) ExportOrdinal(221) ExportOrdinal(222) ExportOrdinal(223) ExportOrdinal(224) ExportOrdinal(225) ExportOrdinal(226) ExportOrdinal(227) ExportOrdinal(228) ExportOrdinal(229) ExportOrdinal(230) ExportOrdinal(231) ExportOrdinal(232) ExportOrdinal(233) ExportOrdinal(234) ExportOrdinal(235) ExportOrdinal(236) ExportOrdinal(237) ExportOrdinal(238) ExportOrdinal(239) ExportOrdinal(240) ExportOrdinal(241) ExportOrdinal(242) ExportOrdinal(243) ExportOrdinal(244) ExportOrdinal(245) ExportOrdinal(246) ExportOrdinal(247) ExportOrdinal(248) ExportOrdinal(249) ExportOrdinal(250)\nExportOrdinal(251) ExportOrdinal(252) ExportOrdinal(253) ExportOrdinal(254) ExportOrdinal(255) ExportOrdinal(256) ExportOrdinal(257) ExportOrdinal(258) ExportOrdinal(259) ExportOrdinal(260) ExportOrdinal(261) ExportOrdinal(262) ExportOrdinal(263) ExportOrdinal(264) ExportOrdinal(265) ExportOrdinal(266) ExportOrdinal(267) ExportOrdinal(268) ExportOrdinal(269) ExportOrdinal(270) ExportOrdinal(271) ExportOrdinal(272) ExportOrdinal(273) ExportOrdinal(274) ExportOrdinal(275) ExportOrdinal(276) ExportOrdinal(277) ExportOrdinal(278) ExportOrdinal(279) ExportOrdinal(280) ExportOrdinal(281) ExportOrdinal(282) ExportOrdinal(283) ExportOrdinal(284) ExportOrdinal(285) ExportOrdinal(286) ExportOrdinal(287) ExportOrdinal(288) ExportOrdinal(289) ExportOrdinal(290) ExportOrdinal(291) ExportOrdinal(292) ExportOrdinal(293) ExportOrdinal(294) ExportOrdinal(295) ExportOrdinal(296) ExportOrdinal(297) ExportOrdinal(298) ExportOrdinal(299) ExportOrdinal(300)\nExportOrdinal(301) ExportOrdinal(302) ExportOrdinal(303) ExportOrdinal(304) ExportOrdinal(305) ExportOrdinal(306) ExportOrdinal(307) ExportOrdinal(308) ExportOrdinal(309) ExportOrdinal(310) ExportOrdinal(311) ExportOrdinal(312) ExportOrdinal(313) ExportOrdinal(314) ExportOrdinal(315) ExportOrdinal(316) ExportOrdinal(317) ExportOrdinal(318) ExportOrdinal(319) ExportOrdinal(320) ExportOrdinal(321) ExportOrdinal(322) ExportOrdinal(323) ExportOrdinal(324) ExportOrdinal(325) ExportOrdinal(326) ExportOrdinal(327) ExportOrdinal(328) ExportOrdinal(329) ExportOrdinal(330) ExportOrdinal(331) ExportOrdinal(332) ExportOrdinal(333) ExportOrdinal(334) ExportOrdinal(335) ExportOrdinal(336) ExportOrdinal(337) ExportOrdinal(338) ExportOrdinal(339) ExportOrdinal(340) ExportOrdinal(341) ExportOrdinal(342) ExportOrdinal(343) ExportOrdinal(344) ExportOrdinal(345) ExportOrdinal(346) ExportOrdinal(347) ExportOrdinal(348) ExportOrdinal(349) ExportOrdinal(350)\nExportOrdinal(351) ExportOrdinal(352) ExportOrdinal(353) ExportOrdinal(354) ExportOrdinal(355) ExportOrdinal(356) ExportOrdinal(357) ExportOrdinal(358) ExportOrdinal(359) ExportOrdinal(360) ExportOrdinal(361) ExportOrdinal(362) ExportOrdinal(363) ExportOrdinal(364) ExportOrdinal(365) ExportOrdinal(366) ExportOrdinal(367) ExportOrdinal(368) ExportOrdinal(369) ExportOrdinal(370) ExportOrdinal(371) ExportOrdinal(372) ExportOrdinal(373) ExportOrdinal(374) ExportOrdinal(375) ExportOrdinal(376) ExportOrdinal(377) ExportOrdinal(378) ExportOrdinal(379) ExportOrdinal(380) ExportOrdinal(381) ExportOrdinal(382) ExportOrdinal(383) ExportOrdinal(384) ExportOrdinal(385) ExportOrdinal(386) ExportOrdinal(387) ExportOrdinal(388) ExportOrdinal(389) ExportOrdinal(390) ExportOrdinal(391) ExportOrdinal(392) ExportOrdinal(393) ExportOrdinal(394) ExportOrdinal(395) ExportOrdinal(396) ExportOrdinal(397) ExportOrdinal(398) ExportOrdinal(399) ExportOrdinal(400)\nExportOrdinal(401) ExportOrdinal(402) ExportOrdinal(403) ExportOrdinal(404) ExportOrdinal(405) ExportOrdinal(406) ExportOrdinal(407) ExportOrdinal(408) ExportOrdinal(409) ExportOrdinal(410) ExportOrdinal(411) ExportOrdinal(412) ExportOrdinal(413) ExportOrdinal(414) ExportOrdinal(415) ExportOrdinal(416) ExportOrdinal(417) ExportOrdinal(418) ExportOrdinal(419) ExportOrdinal(420) ExportOrdinal(421) ExportOrdinal(422) ExportOrdinal(423) ExportOrdinal(424) ExportOrdinal(425) ExportOrdinal(426) ExportOrdinal(427) ExportOrdinal(428) ExportOrdinal(429) ExportOrdinal(430) ExportOrdinal(431) ExportOrdinal(432) ExportOrdinal(433) ExportOrdinal(434) ExportOrdinal(435) ExportOrdinal(436) ExportOrdinal(437) ExportOrdinal(438) ExportOrdinal(439) ExportOrdinal(440) ExportOrdinal(441) ExportOrdinal(442) ExportOrdinal(443) ExportOrdinal(444) ExportOrdinal(445) ExportOrdinal(446) ExportOrdinal(447) ExportOrdinal(448) ExportOrdinal(449) ExportOrdinal(450)\nExportOrdinal(451) ExportOrdinal(452) ExportOrdinal(453) ExportOrdinal(454) ExportOrdinal(455) ExportOrdinal(456) ExportOrdinal(457) ExportOrdinal(458) ExportOrdinal(459) ExportOrdinal(460) ExportOrdinal(461) ExportOrdinal(462) ExportOrdinal(463) ExportOrdinal(464) ExportOrdinal(465) ExportOrdinal(466) ExportOrdinal(467) ExportOrdinal(468) ExportOrdinal(469) ExportOrdinal(470) ExportOrdinal(471) ExportOrdinal(472) ExportOrdinal(473) ExportOrdinal(474) ExportOrdinal(475) ExportOrdinal(476) ExportOrdinal(477) ExportOrdinal(478) ExportOrdinal(479) ExportOrdinal(480) ExportOrdinal(481) ExportOrdinal(482) ExportOrdinal(483) ExportOrdinal(484) ExportOrdinal(485) ExportOrdinal(486) ExportOrdinal(487) ExportOrdinal(488) ExportOrdinal(489) ExportOrdinal(490) ExportOrdinal(491) ExportOrdinal(492) ExportOrdinal(493) ExportOrdinal(494) ExportOrdinal(495) ExportOrdinal(496) ExportOrdinal(497) ExportOrdinal(498) ExportOrdinal(499) ExportOrdinal(500)\nExportOrdinal(501) ExportOrdinal(502) ExportOrdinal(503) ExportOrdinal(504) ExportOrdinal(505) ExportOrdinal(506) ExportOrdinal(507) ExportOrdinal(508) ExportOrdinal(509) ExportOrdinal(510) ExportOrdinal(511) ExportOrdinal(512) ExportOrdinal(513) ExportOrdinal(514) ExportOrdinal(515) ExportOrdinal(516) ExportOrdinal(517) ExportOrdinal(518) ExportOrdinal(519) ExportOrdinal(520) ExportOrdinal(521) ExportOrdinal(522) ExportOrdinal(523) ExportOrdinal(524) ExportOrdinal(525) ExportOrdinal(526) ExportOrdinal(527) ExportOrdinal(528) ExportOrdinal(529) ExportOrdinal(530) ExportOrdinal(531) ExportOrdinal(532) ExportOrdinal(533) ExportOrdinal(534) ExportOrdinal(535) ExportOrdinal(536) ExportOrdinal(537) ExportOrdinal(538) ExportOrdinal(539) ExportOrdinal(540) ExportOrdinal(541) ExportOrdinal(542) ExportOrdinal(543) ExportOrdinal(544) ExportOrdinal(545) ExportOrdinal(546) ExportOrdinal(547) ExportOrdinal(548) ExportOrdinal(549) ExportOrdinal(550)\nExportOrdinal(551) ExportOrdinal(552) ExportOrdinal(553) ExportOrdinal(554) ExportOrdinal(555) ExportOrdinal(556) ExportOrdinal(557) ExportOrdinal(558) ExportOrdinal(559) ExportOrdinal(560) ExportOrdinal(561) ExportOrdinal(562) ExportOrdinal(563) ExportOrdinal(564) ExportOrdinal(565) ExportOrdinal(566) ExportOrdinal(567) ExportOrdinal(568) ExportOrdinal(569) ExportOrdinal(570) ExportOrdinal(571) ExportOrdinal(572) ExportOrdinal(573) ExportOrdinal(574) ExportOrdinal(575) ExportOrdinal(576) ExportOrdinal(577) ExportOrdinal(578) ExportOrdinal(579) ExportOrdinal(580) ExportOrdinal(581) ExportOrdinal(582) ExportOrdinal(583) ExportOrdinal(584) ExportOrdinal(585) ExportOrdinal(586) ExportOrdinal(587) ExportOrdinal(588) ExportOrdinal(589) ExportOrdinal(590) ExportOrdinal(591) ExportOrdinal(592) ExportOrdinal(593) ExportOrdinal(594) ExportOrdinal(595) ExportOrdinal(596) ExportOrdinal(597) ExportOrdinal(598) ExportOrdinal(599) ExportOrdinal(600)\nExportOrdinal(601) ExportOrdinal(602) ExportOrdinal(603) ExportOrdinal(604) ExportOrdinal(605) ExportOrdinal(606) ExportOrdinal(607) ExportOrdinal(608) ExportOrdinal(609) ExportOrdinal(610) ExportOrdinal(611) ExportOrdinal(612) ExportOrdinal(613) ExportOrdinal(614) ExportOrdinal(615) ExportOrdinal(616) ExportOrdinal(617) ExportOrdinal(618) ExportOrdinal(619) ExportOrdinal(620) ExportOrdinal(621) ExportOrdinal(622) ExportOrdinal(623) ExportOrdinal(624) ExportOrdinal(625) ExportOrdinal(626) ExportOrdinal(627) ExportOrdinal(628) ExportOrdinal(629) ExportOrdinal(630) ExportOrdinal(631) ExportOrdinal(632) ExportOrdinal(633) ExportOrdinal(634) ExportOrdinal(635) ExportOrdinal(636) ExportOrdinal(637) ExportOrdinal(638) ExportOrdinal(639) ExportOrdinal(640) ExportOrdinal(641) ExportOrdinal(642) ExportOrdinal(643) ExportOrdinal(644) ExportOrdinal(645) ExportOrdinal(646) ExportOrdinal(647) ExportOrdinal(648) ExportOrdinal(649) ExportOrdinal(650)\nExportOrdinal(651) ExportOrdinal(652) ExportOrdinal(653) ExportOrdinal(654) ExportOrdinal(655) ExportOrdinal(656) ExportOrdinal(657) ExportOrdinal(658) ExportOrdinal(659) ExportOrdinal(660) ExportOrdinal(661) ExportOrdinal(662) ExportOrdinal(663) ExportOrdinal(664) ExportOrdinal(665) ExportOrdinal(666) ExportOrdinal(667) ExportOrdinal(668) ExportOrdinal(669) ExportOrdinal(670) ExportOrdinal(671) ExportOrdinal(672) ExportOrdinal(673) ExportOrdinal(674) ExportOrdinal(675) ExportOrdinal(676) ExportOrdinal(677) ExportOrdinal(678) ExportOrdinal(679) ExportOrdinal(680) ExportOrdinal(681) ExportOrdinal(682) ExportOrdinal(683) ExportOrdinal(684) ExportOrdinal(685) ExportOrdinal(686) ExportOrdinal(687) ExportOrdinal(688) ExportOrdinal(689) ExportOrdinal(690) ExportOrdinal(691) ExportOrdinal(692) ExportOrdinal(693) ExportOrdinal(694) ExportOrdinal(695) ExportOrdinal(696) ExportOrdinal(697) ExportOrdinal(698) ExportOrdinal(699) ExportOrdinal(700)\nExportOrdinal(701) ExportOrdinal(702) ExportOrdinal(703) ExportOrdinal(704) ExportOrdinal(705) ExportOrdinal(706) ExportOrdinal(707) ExportOrdinal(708) ExportOrdinal(709) ExportOrdinal(710) ExportOrdinal(711) ExportOrdinal(712) ExportOrdinal(713) ExportOrdinal(714) ExportOrdinal(715) ExportOrdinal(716) ExportOrdinal(717) ExportOrdinal(718) ExportOrdinal(719) ExportOrdinal(720) ExportOrdinal(721) ExportOrdinal(722) ExportOrdinal(723) ExportOrdinal(724) ExportOrdinal(725) ExportOrdinal(726) ExportOrdinal(727) ExportOrdinal(728) ExportOrdinal(729) ExportOrdinal(730) ExportOrdinal(731) ExportOrdinal(732) ExportOrdinal(733) ExportOrdinal(734) ExportOrdinal(735) ExportOrdinal(736) ExportOrdinal(737) ExportOrdinal(738) ExportOrdinal(739) ExportOrdinal(740) ExportOrdinal(741) ExportOrdinal(742) ExportOrdinal(743) ExportOrdinal(744) ExportOrdinal(745) ExportOrdinal(746) ExportOrdinal(747) ExportOrdinal(748) ExportOrdinal(749) ExportOrdinal(750)\nExportOrdinal(751) ExportOrdinal(752) ExportOrdinal(753) ExportOrdinal(754) ExportOrdinal(755) ExportOrdinal(756) ExportOrdinal(757) ExportOrdinal(758) ExportOrdinal(759) ExportOrdinal(760) ExportOrdinal(761) ExportOrdinal(762) ExportOrdinal(763) ExportOrdinal(764) ExportOrdinal(765) ExportOrdinal(766) ExportOrdinal(767) ExportOrdinal(768) ExportOrdinal(769) ExportOrdinal(770) ExportOrdinal(771) ExportOrdinal(772) ExportOrdinal(773) ExportOrdinal(774) ExportOrdinal(775) ExportOrdinal(776) ExportOrdinal(777) ExportOrdinal(778) ExportOrdinal(779) ExportOrdinal(780) ExportOrdinal(781) ExportOrdinal(782) ExportOrdinal(783) ExportOrdinal(784) ExportOrdinal(785) ExportOrdinal(786) ExportOrdinal(787) ExportOrdinal(788) ExportOrdinal(789) ExportOrdinal(790) ExportOrdinal(791) ExportOrdinal(792) ExportOrdinal(793) ExportOrdinal(794) ExportOrdinal(795) ExportOrdinal(796) ExportOrdinal(797) ExportOrdinal(798) ExportOrdinal(799) ExportOrdinal(800)\nExportOrdinal(801) ExportOrdinal(802) ExportOrdinal(803) ExportOrdinal(804) ExportOrdinal(805) ExportOrdinal(806) ExportOrdinal(807) ExportOrdinal(808) ExportOrdinal(809) ExportOrdinal(810) ExportOrdinal(811) ExportOrdinal(812) ExportOrdinal(813) ExportOrdinal(814) ExportOrdinal(815) ExportOrdinal(816) ExportOrdinal(817) ExportOrdinal(818) ExportOrdinal(819) ExportOrdinal(820) ExportOrdinal(821) ExportOrdinal(822) ExportOrdinal(823) ExportOrdinal(824) ExportOrdinal(825) ExportOrdinal(826) ExportOrdinal(827) ExportOrdinal(828) ExportOrdinal(829) ExportOrdinal(830) ExportOrdinal(831) ExportOrdinal(832) ExportOrdinal(833) ExportOrdinal(834) ExportOrdinal(835) ExportOrdinal(836) ExportOrdinal(837) ExportOrdinal(838) ExportOrdinal(839) ExportOrdinal(840) ExportOrdinal(841) ExportOrdinal(842) ExportOrdinal(843) ExportOrdinal(844) ExportOrdinal(845) ExportOrdinal(846) ExportOrdinal(847) ExportOrdinal(848) ExportOrdinal(849) ExportOrdinal(850)\nExportOrdinal(851) ExportOrdinal(852) ExportOrdinal(853) ExportOrdinal(854) ExportOrdinal(855) ExportOrdinal(856) ExportOrdinal(857) ExportOrdinal(858) ExportOrdinal(859) ExportOrdinal(860) ExportOrdinal(861) ExportOrdinal(862) ExportOrdinal(863) ExportOrdinal(864) ExportOrdinal(865) ExportOrdinal(866) ExportOrdinal(867) ExportOrdinal(868) ExportOrdinal(869) ExportOrdinal(870) ExportOrdinal(871) ExportOrdinal(872) ExportOrdinal(873) ExportOrdinal(874) ExportOrdinal(875) ExportOrdinal(876) ExportOrdinal(877) ExportOrdinal(878) ExportOrdinal(879) ExportOrdinal(880) ExportOrdinal(881) ExportOrdinal(882) ExportOrdinal(883) ExportOrdinal(884) ExportOrdinal(885) ExportOrdinal(886) ExportOrdinal(887) ExportOrdinal(888) ExportOrdinal(889) ExportOrdinal(890) ExportOrdinal(891) ExportOrdinal(892) ExportOrdinal(893) ExportOrdinal(894) ExportOrdinal(895) ExportOrdinal(896) ExportOrdinal(897) ExportOrdinal(898) ExportOrdinal(899) ExportOrdinal(900)\nExportOrdinal(901) ExportOrdinal(902) ExportOrdinal(903) ExportOrdinal(904) ExportOrdinal(905) ExportOrdinal(906) ExportOrdinal(907) ExportOrdinal(908) ExportOrdinal(909) ExportOrdinal(910) ExportOrdinal(911) ExportOrdinal(912) ExportOrdinal(913) ExportOrdinal(914) ExportOrdinal(915) ExportOrdinal(916) ExportOrdinal(917) ExportOrdinal(918) ExportOrdinal(919) ExportOrdinal(920) ExportOrdinal(921) ExportOrdinal(922) ExportOrdinal(923) ExportOrdinal(924) ExportOrdinal(925) ExportOrdinal(926) ExportOrdinal(927) ExportOrdinal(928) ExportOrdinal(929) ExportOrdinal(930) ExportOrdinal(931) ExportOrdinal(932) ExportOrdinal(933) ExportOrdinal(934) ExportOrdinal(935) ExportOrdinal(936) ExportOrdinal(937) ExportOrdinal(938) ExportOrdinal(939) ExportOrdinal(940) ExportOrdinal(941) ExportOrdinal(942) ExportOrdinal(943) ExportOrdinal(944) ExportOrdinal(945) ExportOrdinal(946) ExportOrdinal(947) ExportOrdinal(948) ExportOrdinal(949) ExportOrdinal(950)\nExportOrdinal(951) ExportOrdinal(952) ExportOrdinal(953) ExportOrdinal(954) ExportOrdinal(955) ExportOrdinal(956) ExportOrdinal(957) ExportOrdinal(958) ExportOrdinal(959) ExportOrdinal(960) ExportOrdinal(961) ExportOrdinal(962) ExportOrdinal(963) ExportOrdinal(964) ExportOrdinal(965) ExportOrdinal(966) ExportOrdinal(967) ExportOrdinal(968) ExportOrdinal(969) ExportOrdinal(970) ExportOrdinal(971) ExportOrdinal(972) ExportOrdinal(973) ExportOrdinal(974) ExportOrdinal(975) ExportOrdinal(976) ExportOrdinal(977) ExportOrdinal(978) ExportOrdinal(979) ExportOrdinal(980) ExportOrdinal(981) ExportOrdinal(982) ExportOrdinal(983) ExportOrdinal(984) ExportOrdinal(985) ExportOrdinal(986) ExportOrdinal(987) ExportOrdinal(988) ExportOrdinal(989) ExportOrdinal(990) ExportOrdinal(991) ExportOrdinal(992) ExportOrdinal(993) ExportOrdinal(994) ExportOrdinal(995) ExportOrdinal(996) ExportOrdinal(997) ExportOrdinal(998) ExportOrdinal(999) ExportOrdinal(1000)\nExportOrdinal(1001) ExportOrdinal(1002) ExportOrdinal(1003) ExportOrdinal(1004) ExportOrdinal(1005) ExportOrdinal(1006) ExportOrdinal(1007) ExportOrdinal(1008) ExportOrdinal(1009) ExportOrdinal(1010) ExportOrdinal(1011) ExportOrdinal(1012) ExportOrdinal(1013) ExportOrdinal(1014) ExportOrdinal(1015) ExportOrdinal(1016) ExportOrdinal(1017) ExportOrdinal(1018) ExportOrdinal(1019)\n\n// dxgi\nExport(0, ApplyCompatResolutionQuirking) Export(1, CompatString) Export(2, CompatValue) Export(3, DXGIDumpJournal) Export(4, PIXBeginCapture) Export(5, PIXEndCapture) Export(6, PIXGetCaptureState) Export(7, SetAppCompatStringPointer) Export(8, UpdateHMDEmulationStatus) Export(9, CreateDXGIFactory) Export(10, CreateDXGIFactory1) Export(11, CreateDXGIFactory2) Export(12, DXGID3D10CreateDevice) Export(13, DXGID3D10CreateLayeredDevice) Export(14, DXGID3D10GetLayeredDeviceSize) Export(15, DXGID3D10RegisterLayers) Export(16, DXGIDeclareAdapterRemovalSupport) Export(17, DXGIGetDebugInterface1) Export(18, DXGIReportAdapterConfiguration)\n\n// d3d10\nExport(0, D3D10CompileEffectFromMemory) Export(1, D3D10CompileShader) Export(2, D3D10CreateBlob) Export(3, D3D10CreateDevice) Export(4, D3D10CreateDeviceAndSwapChain) Export(5, D3D10CreateEffectFromMemory) Export(6, D3D10CreateEffectPoolFromMemory) Export(7, D3D10CreateStateBlock) Export(8, D3D10DisassembleEffect) Export(9, D3D10DisassembleShader) Export(10, D3D10GetGeometryShaderProfile) Export(11, D3D10GetInputAndOutputSignatureBlob) Export(12, D3D10GetInputSignatureBlob) Export(13, D3D10GetOutputSignatureBlob) Export(14, D3D10GetPixelShaderProfile) Export(15, D3D10GetShaderDebugInfo) Export(16, D3D10GetVersion) Export(17, D3D10GetVertexShaderProfile) Export(18, D3D10PreprocessShader) Export(19, D3D10ReflectShader) Export(20, D3D10RegisterLayers) Export(21, D3D10StateBlockMaskDifference) Export(22, D3D10StateBlockMaskDisableAll) Export(23, D3D10StateBlockMaskDisableCapture) Export(24, D3D10StateBlockMaskEnableAll) Export(25, D3D10StateBlockMaskEnableCapture) Export(26, D3D10StateBlockMaskGetSetting) Export(27, D3D10StateBlockMaskIntersect) Export(28, D3D10StateBlockMaskUnion)\n\n// d3d11\nExport(0, D3D11CreateDeviceForD3D12) Export(1, D3DKMTCloseAdapter) Export(2, D3DKMTDestroyAllocation) Export(3, D3DKMTDestroyContext) Export(4, D3DKMTDestroyDevice) Export(5, D3DKMTDestroySynchronizationObject) Export(6, D3DKMTPresent) Export(7, D3DKMTQueryAdapterInfo) Export(8, D3DKMTSetDisplayPrivateDriverFormat) Export(9, D3DKMTSignalSynchronizationObject) Export(10, D3DKMTUnlock) Export(11, D3DKMTWaitForSynchronizationObject) Export(12, EnableFeatureLevelUpgrade) Export(13, OpenAdapter10) Export(14, OpenAdapter10_2) Export(15, CreateDirect3D11DeviceFromDXGIDevice) Export(16, CreateDirect3D11SurfaceFromDXGISurface) Export(17, D3D11CoreCreateDevice) Export(18, D3D11CoreCreateLayeredDevice) Export(19, D3D11CoreGetLayeredDeviceSize) Export(20, D3D11CoreRegisterLayers) Export(21, D3D11CreateDevice) Export(22, D3D11CreateDeviceAndSwapChain) Export(23, D3D11On12CreateDevice) Export(24, D3DKMTCreateAllocation) Export(25, D3DKMTCreateContext) Export(26, D3DKMTCreateDevice) Export(27, D3DKMTCreateSynchronizationObject) Export(28, D3DKMTEscape) Export(29, D3DKMTGetContextSchedulingPriority) Export(30, D3DKMTGetDeviceState) Export(31, D3DKMTGetDisplayModeList) Export(32, D3DKMTGetMultisampleMethodList) Export(33, D3DKMTGetRuntimeData) Export(34, D3DKMTGetSharedPrimaryHandle) Export(35, D3DKMTLock) Export(36, D3DKMTOpenAdapterFromHdc) Export(37, D3DKMTOpenResource) Export(38, D3DKMTQueryAllocationResidency) Export(39, D3DKMTQueryResourceInfo) Export(40, D3DKMTRender) Export(41, D3DKMTSetAllocationPriority) Export(42, D3DKMTSetContextSchedulingPriority) Export(43, D3DKMTSetDisplayMode) Export(44, D3DKMTSetGammaRamp) Export(45, D3DKMTSetVidPnSourceOwner) Export(46, D3DKMTWaitForVerticalBlankEvent) Export(47, D3DPerformance_BeginEvent) Export(48, D3DPerformance_EndEvent) Export(49, D3DPerformance_GetStatus)\nExport(50, D3DPerformance_SetMarker)\n\n// d3d12 - crashes for some unknown reason!\nExport(0, GetBehaviorValue) Export(1, D3D12CreateDevice) Export(2, D3D12GetDebugInterface) Export(3, SetAppCompatStringPointer) Export(4, D3D12CoreCreateLayeredDevice) Export(5, D3D12CoreGetLayeredDeviceSize) Export(6, D3D12CoreRegisterLayers) Export(7, D3D12CreateRootSignatureDeserializer) Export(8, D3D12CreateVersionedRootSignatureDeserializer) Export(9, D3D12DeviceRemovedExtendedData) Export(10, D3D12EnableExperimentalFeatures) Export(11, D3D12GetInterface) Export(12, D3D12PIXEventsReplaceBlock) Export(13, D3D12PIXGetThreadInfo) Export(14, D3D12PIXNotifyWakeFromFenceSignal) Export(15, D3D12PIXReportCounter) Export(16, D3D12SerializeRootSignature) Export(17, D3D12SerializeVersionedRootSignature)\n\n// dinput8\nExport(0, DirectInput8Create) Export(1, DllCanUnloadNow) Export(2, DllGetClassObject) Export(3, DllRegisterServer) Export(4, DllUnregisterServer) Export(5, GetdfDIJoystick)\n\n// xinput1_4 AND xinput1_3\nExport(0, DllMain) Export(1, XInputGetState) Export(2, XInputSetState) Export(3, XInputGetCapabilities) Export(4, XInputEnable) Export(5, XInputGetBatteryInformation) Export(6, XInputGetKeystroke) Export(7, XInputGetAudioDeviceIds)\n\n// steam_api64\n#ifdef _WIN64\nExport(0, GetHSteamPipe) Export(1, GetHSteamUser) Export(2, SteamAPI_GetHSteamPipe) Export(3, SteamAPI_GetHSteamUser) Export(4, SteamAPI_GetSteamInstallPath) Export(5, SteamAPI_ISteamAppList_GetAppBuildId) Export(6, SteamAPI_ISteamAppList_GetAppInstallDir) Export(7, SteamAPI_ISteamAppList_GetAppName) Export(8, SteamAPI_ISteamAppList_GetInstalledApps) Export(9, SteamAPI_ISteamAppList_GetNumInstalledApps) Export(10, SteamAPI_ISteamApps_BGetDLCDataByIndex) Export(11, SteamAPI_ISteamApps_BIsAppInstalled) Export(12, SteamAPI_ISteamApps_BIsCybercafe) Export(13, SteamAPI_ISteamApps_BIsDlcInstalled) Export(14, SteamAPI_ISteamApps_BIsLowViolence) Export(15, SteamAPI_ISteamApps_BIsSubscribed) Export(16, SteamAPI_ISteamApps_BIsSubscribedApp) Export(17, SteamAPI_ISteamApps_BIsSubscribedFromFamilySharing) Export(18, SteamAPI_ISteamApps_BIsSubscribedFromFreeWeekend) Export(19, SteamAPI_ISteamApps_BIsTimedTrial) Export(20, SteamAPI_ISteamApps_BIsVACBanned) Export(21, SteamAPI_ISteamApps_GetAppBuildId) Export(22, SteamAPI_ISteamApps_GetAppInstallDir) Export(23, SteamAPI_ISteamApps_GetAppOwner) Export(24, SteamAPI_ISteamApps_GetAvailableGameLanguages) Export(25, SteamAPI_ISteamApps_GetCurrentBetaName) Export(26, SteamAPI_ISteamApps_GetCurrentGameLanguage) Export(27, SteamAPI_ISteamApps_GetDLCCount) Export(28, SteamAPI_ISteamApps_GetDlcDownloadProgress) Export(29, SteamAPI_ISteamApps_GetEarliestPurchaseUnixTime) Export(30, SteamAPI_ISteamApps_GetFileDetails) Export(31, SteamAPI_ISteamApps_GetInstalledDepots) Export(32, SteamAPI_ISteamApps_GetLaunchCommandLine) Export(33, SteamAPI_ISteamApps_GetLaunchQueryParam) Export(34, SteamAPI_ISteamApps_InstallDLC) Export(35, SteamAPI_ISteamApps_MarkContentCorrupt) Export(36, SteamAPI_ISteamApps_RequestAllProofOfPurchaseKeys) Export(37, SteamAPI_ISteamApps_RequestAppProofOfPurchaseKey) Export(38, SteamAPI_ISteamApps_UninstallDLC) Export(39, SteamAPI_ISteamClient_BReleaseSteamPipe) Export(40, SteamAPI_ISteamClient_BShutdownIfAllPipesClosed) Export(41, SteamAPI_ISteamClient_ConnectToGlobalUser) Export(42, SteamAPI_ISteamClient_CreateLocalUser) Export(43, SteamAPI_ISteamClient_CreateSteamPipe) Export(44, SteamAPI_ISteamClient_GetIPCCallCount) Export(45, SteamAPI_ISteamClient_GetISteamAppList) Export(46, SteamAPI_ISteamClient_GetISteamApps) Export(47, SteamAPI_ISteamClient_GetISteamController) Export(48, SteamAPI_ISteamClient_GetISteamFriends) Export(49, SteamAPI_ISteamClient_GetISteamGameSearch)\nExport(50, SteamAPI_ISteamClient_GetISteamGameServer) Export(51, SteamAPI_ISteamClient_GetISteamGameServerStats) Export(52, SteamAPI_ISteamClient_GetISteamGenericInterface) Export(53, SteamAPI_ISteamClient_GetISteamHTMLSurface) Export(54, SteamAPI_ISteamClient_GetISteamHTTP) Export(55, SteamAPI_ISteamClient_GetISteamInput) Export(56, SteamAPI_ISteamClient_GetISteamInventory) Export(57, SteamAPI_ISteamClient_GetISteamMatchmaking) Export(58, SteamAPI_ISteamClient_GetISteamMatchmakingServers) Export(59, SteamAPI_ISteamClient_GetISteamMusic) Export(60, SteamAPI_ISteamClient_GetISteamMusicRemote) Export(61, SteamAPI_ISteamClient_GetISteamNetworking) Export(62, SteamAPI_ISteamClient_GetISteamParentalSettings) Export(63, SteamAPI_ISteamClient_GetISteamParties) Export(64, SteamAPI_ISteamClient_GetISteamRemotePlay) Export(65, SteamAPI_ISteamClient_GetISteamRemoteStorage) Export(66, SteamAPI_ISteamClient_GetISteamScreenshots) Export(67, SteamAPI_ISteamClient_GetISteamUGC) Export(68, SteamAPI_ISteamClient_GetISteamUser) Export(69, SteamAPI_ISteamClient_GetISteamUserStats) Export(70, SteamAPI_ISteamClient_GetISteamUtils) Export(71, SteamAPI_ISteamClient_GetISteamVideo) Export(72, SteamAPI_ISteamClient_ReleaseUser) Export(73, SteamAPI_ISteamClient_SetLocalIPBinding) Export(74, SteamAPI_ISteamClient_SetWarningMessageHook) Export(75, SteamAPI_ISteamController_ActivateActionSet) Export(76, SteamAPI_ISteamController_ActivateActionSetLayer) Export(77, SteamAPI_ISteamController_DeactivateActionSetLayer) Export(78, SteamAPI_ISteamController_DeactivateAllActionSetLayers) Export(79, SteamAPI_ISteamController_GetActionOriginFromXboxOrigin) Export(80, SteamAPI_ISteamController_GetActionSetHandle) Export(81, SteamAPI_ISteamController_GetActiveActionSetLayers) Export(82, SteamAPI_ISteamController_GetAnalogActionData) Export(83, SteamAPI_ISteamController_GetAnalogActionHandle) Export(84, SteamAPI_ISteamController_GetAnalogActionOrigins) Export(85, SteamAPI_ISteamController_GetConnectedControllers) Export(86, SteamAPI_ISteamController_GetControllerBindingRevision) Export(87, SteamAPI_ISteamController_GetControllerForGamepadIndex) Export(88, SteamAPI_ISteamController_GetCurrentActionSet) Export(89, SteamAPI_ISteamController_GetDigitalActionData) Export(90, SteamAPI_ISteamController_GetDigitalActionHandle) Export(91, SteamAPI_ISteamController_GetDigitalActionOrigins) Export(92, SteamAPI_ISteamController_GetGamepadIndexForController) Export(93, SteamAPI_ISteamController_GetGlyphForActionOrigin) Export(94, SteamAPI_ISteamController_GetGlyphForXboxOrigin) Export(95, SteamAPI_ISteamController_GetInputTypeForHandle) Export(96, SteamAPI_ISteamController_GetMotionData) Export(97, SteamAPI_ISteamController_GetStringForActionOrigin) Export(98, SteamAPI_ISteamController_GetStringForXboxOrigin) Export(99, SteamAPI_ISteamController_Init)\nExport(100, SteamAPI_ISteamController_RunFrame) Export(101, SteamAPI_ISteamController_SetLEDColor) Export(102, SteamAPI_ISteamController_ShowBindingPanel) Export(103, SteamAPI_ISteamController_Shutdown) Export(104, SteamAPI_ISteamController_StopAnalogActionMomentum) Export(105, SteamAPI_ISteamController_TranslateActionOrigin) Export(106, SteamAPI_ISteamController_TriggerHapticPulse) Export(107, SteamAPI_ISteamController_TriggerRepeatedHapticPulse) Export(108, SteamAPI_ISteamController_TriggerVibration) Export(109, SteamAPI_ISteamFriends_ActivateGameOverlay) Export(110, SteamAPI_ISteamFriends_ActivateGameOverlayInviteDialog) Export(111, SteamAPI_ISteamFriends_ActivateGameOverlayInviteDialogConnectString) Export(112, SteamAPI_ISteamFriends_ActivateGameOverlayRemotePlayTogetherInviteDialog) Export(113, SteamAPI_ISteamFriends_ActivateGameOverlayToStore) Export(114, SteamAPI_ISteamFriends_ActivateGameOverlayToUser) Export(115, SteamAPI_ISteamFriends_ActivateGameOverlayToWebPage) Export(116, SteamAPI_ISteamFriends_ClearRichPresence) Export(117, SteamAPI_ISteamFriends_CloseClanChatWindowInSteam) Export(118, SteamAPI_ISteamFriends_DownloadClanActivityCounts) Export(119, SteamAPI_ISteamFriends_EnumerateFollowingList) Export(120, SteamAPI_ISteamFriends_GetChatMemberByIndex) Export(121, SteamAPI_ISteamFriends_GetClanActivityCounts) Export(122, SteamAPI_ISteamFriends_GetClanByIndex) Export(123, SteamAPI_ISteamFriends_GetClanChatMemberCount) Export(124, SteamAPI_ISteamFriends_GetClanChatMessage) Export(125, SteamAPI_ISteamFriends_GetClanCount) Export(126, SteamAPI_ISteamFriends_GetClanName) Export(127, SteamAPI_ISteamFriends_GetClanOfficerByIndex) Export(128, SteamAPI_ISteamFriends_GetClanOfficerCount) Export(129, SteamAPI_ISteamFriends_GetClanOwner) Export(130, SteamAPI_ISteamFriends_GetClanTag) Export(131, SteamAPI_ISteamFriends_GetCoplayFriend) Export(132, SteamAPI_ISteamFriends_GetCoplayFriendCount) Export(133, SteamAPI_ISteamFriends_GetFollowerCount) Export(134, SteamAPI_ISteamFriends_GetFriendByIndex) Export(135, SteamAPI_ISteamFriends_GetFriendCoplayGame) Export(136, SteamAPI_ISteamFriends_GetFriendCoplayTime) Export(137, SteamAPI_ISteamFriends_GetFriendCount) Export(138, SteamAPI_ISteamFriends_GetFriendCountFromSource) Export(139, SteamAPI_ISteamFriends_GetFriendFromSourceByIndex) Export(140, SteamAPI_ISteamFriends_GetFriendGamePlayed) Export(141, SteamAPI_ISteamFriends_GetFriendMessage) Export(142, SteamAPI_ISteamFriends_GetFriendPersonaName) Export(143, SteamAPI_ISteamFriends_GetFriendPersonaNameHistory) Export(144, SteamAPI_ISteamFriends_GetFriendPersonaState) Export(145, SteamAPI_ISteamFriends_GetFriendRelationship) Export(146, SteamAPI_ISteamFriends_GetFriendRichPresence) Export(147, SteamAPI_ISteamFriends_GetFriendRichPresenceKeyByIndex) Export(148, SteamAPI_ISteamFriends_GetFriendRichPresenceKeyCount) Export(149, SteamAPI_ISteamFriends_GetFriendSteamLevel)\nExport(150, SteamAPI_ISteamFriends_GetFriendsGroupCount) Export(151, SteamAPI_ISteamFriends_GetFriendsGroupIDByIndex) Export(152, SteamAPI_ISteamFriends_GetFriendsGroupMembersCount) Export(153, SteamAPI_ISteamFriends_GetFriendsGroupMembersList) Export(154, SteamAPI_ISteamFriends_GetFriendsGroupName) Export(155, SteamAPI_ISteamFriends_GetLargeFriendAvatar) Export(156, SteamAPI_ISteamFriends_GetMediumFriendAvatar) Export(157, SteamAPI_ISteamFriends_GetNumChatsWithUnreadPriorityMessages) Export(158, SteamAPI_ISteamFriends_GetPersonaName) Export(159, SteamAPI_ISteamFriends_GetPersonaState) Export(160, SteamAPI_ISteamFriends_GetPlayerNickname) Export(161, SteamAPI_ISteamFriends_GetSmallFriendAvatar) Export(162, SteamAPI_ISteamFriends_GetUserRestrictions) Export(163, SteamAPI_ISteamFriends_HasFriend) Export(164, SteamAPI_ISteamFriends_InviteUserToGame) Export(165, SteamAPI_ISteamFriends_IsClanChatAdmin) Export(166, SteamAPI_ISteamFriends_IsClanChatWindowOpenInSteam) Export(167, SteamAPI_ISteamFriends_IsClanOfficialGameGroup) Export(168, SteamAPI_ISteamFriends_IsClanPublic) Export(169, SteamAPI_ISteamFriends_IsFollowing) Export(170, SteamAPI_ISteamFriends_IsUserInSource) Export(171, SteamAPI_ISteamFriends_JoinClanChatRoom) Export(172, SteamAPI_ISteamFriends_LeaveClanChatRoom) Export(173, SteamAPI_ISteamFriends_OpenClanChatWindowInSteam) Export(174, SteamAPI_ISteamFriends_RegisterProtocolInOverlayBrowser) Export(175, SteamAPI_ISteamFriends_ReplyToFriendMessage) Export(176, SteamAPI_ISteamFriends_RequestClanOfficerList) Export(177, SteamAPI_ISteamFriends_RequestFriendRichPresence) Export(178, SteamAPI_ISteamFriends_RequestUserInformation) Export(179, SteamAPI_ISteamFriends_SendClanChatMessage) Export(180, SteamAPI_ISteamFriends_SetInGameVoiceSpeaking) Export(181, SteamAPI_ISteamFriends_SetListenForFriendsMessages) Export(182, SteamAPI_ISteamFriends_SetPersonaName) Export(183, SteamAPI_ISteamFriends_SetPlayedWith) Export(184, SteamAPI_ISteamFriends_SetRichPresence) Export(185, SteamAPI_ISteamGameSearch_AcceptGame) Export(186, SteamAPI_ISteamGameSearch_AddGameSearchParams) Export(187, SteamAPI_ISteamGameSearch_CancelRequestPlayersForGame) Export(188, SteamAPI_ISteamGameSearch_DeclineGame) Export(189, SteamAPI_ISteamGameSearch_EndGame) Export(190, SteamAPI_ISteamGameSearch_EndGameSearch) Export(191, SteamAPI_ISteamGameSearch_HostConfirmGameStart) Export(192, SteamAPI_ISteamGameSearch_RequestPlayersForGame) Export(193, SteamAPI_ISteamGameSearch_RetrieveConnectionDetails) Export(194, SteamAPI_ISteamGameSearch_SearchForGameSolo) Export(195, SteamAPI_ISteamGameSearch_SearchForGameWithLobby) Export(196, SteamAPI_ISteamGameSearch_SetConnectionDetails) Export(197, SteamAPI_ISteamGameSearch_SetGameHostParams) Export(198, SteamAPI_ISteamGameSearch_SubmitPlayerResult) Export(199, SteamAPI_ISteamGameServerStats_ClearUserAchievement)\nExport(200, SteamAPI_ISteamGameServerStats_GetUserAchievement) Export(201, SteamAPI_ISteamGameServerStats_GetUserStatFloat) Export(202, SteamAPI_ISteamGameServerStats_GetUserStatInt32) Export(203, SteamAPI_ISteamGameServerStats_RequestUserStats) Export(204, SteamAPI_ISteamGameServerStats_SetUserAchievement) Export(205, SteamAPI_ISteamGameServerStats_SetUserStatFloat) Export(206, SteamAPI_ISteamGameServerStats_SetUserStatInt32) Export(207, SteamAPI_ISteamGameServerStats_StoreUserStats) Export(208, SteamAPI_ISteamGameServerStats_UpdateUserAvgRateStat) Export(209, SteamAPI_ISteamGameServer_AssociateWithClan) Export(210, SteamAPI_ISteamGameServer_BLoggedOn) Export(211, SteamAPI_ISteamGameServer_BSecure) Export(212, SteamAPI_ISteamGameServer_BUpdateUserData) Export(213, SteamAPI_ISteamGameServer_BeginAuthSession) Export(214, SteamAPI_ISteamGameServer_CancelAuthTicket) Export(215, SteamAPI_ISteamGameServer_ClearAllKeyValues) Export(216, SteamAPI_ISteamGameServer_ComputeNewPlayerCompatibility) Export(217, SteamAPI_ISteamGameServer_CreateUnauthenticatedUserConnection) Export(218, SteamAPI_ISteamGameServer_EnableHeartbeats) Export(219, SteamAPI_ISteamGameServer_EndAuthSession) Export(220, SteamAPI_ISteamGameServer_ForceHeartbeat) Export(221, SteamAPI_ISteamGameServer_GetAuthSessionTicket) Export(222, SteamAPI_ISteamGameServer_GetGameplayStats) Export(223, SteamAPI_ISteamGameServer_GetNextOutgoingPacket) Export(224, SteamAPI_ISteamGameServer_GetPublicIP) Export(225, SteamAPI_ISteamGameServer_GetServerReputation) Export(226, SteamAPI_ISteamGameServer_GetSteamID) Export(227, SteamAPI_ISteamGameServer_HandleIncomingPacket) Export(228, SteamAPI_ISteamGameServer_LogOff) Export(229, SteamAPI_ISteamGameServer_LogOn) Export(230, SteamAPI_ISteamGameServer_LogOnAnonymous) Export(231, SteamAPI_ISteamGameServer_RequestUserGroupStatus) Export(232, SteamAPI_ISteamGameServer_SendUserConnectAndAuthenticate) Export(233, SteamAPI_ISteamGameServer_SendUserDisconnect) Export(234, SteamAPI_ISteamGameServer_SetBotPlayerCount) Export(235, SteamAPI_ISteamGameServer_SetDedicatedServer) Export(236, SteamAPI_ISteamGameServer_SetGameData) Export(237, SteamAPI_ISteamGameServer_SetGameDescription) Export(238, SteamAPI_ISteamGameServer_SetGameTags) Export(239, SteamAPI_ISteamGameServer_SetHeartbeatInterval) Export(240, SteamAPI_ISteamGameServer_SetKeyValue) Export(241, SteamAPI_ISteamGameServer_SetMapName) Export(242, SteamAPI_ISteamGameServer_SetMaxPlayerCount) Export(243, SteamAPI_ISteamGameServer_SetModDir) Export(244, SteamAPI_ISteamGameServer_SetPasswordProtected) Export(245, SteamAPI_ISteamGameServer_SetProduct) Export(246, SteamAPI_ISteamGameServer_SetRegion) Export(247, SteamAPI_ISteamGameServer_SetServerName) Export(248, SteamAPI_ISteamGameServer_SetSpectatorPort) Export(249, SteamAPI_ISteamGameServer_SetSpectatorServerName)\nExport(250, SteamAPI_ISteamGameServer_UserHasLicenseForApp) Export(251, SteamAPI_ISteamGameServer_WasRestartRequested) Export(252, SteamAPI_ISteamHTMLSurface_AddHeader) Export(253, SteamAPI_ISteamHTMLSurface_AllowStartRequest) Export(254, SteamAPI_ISteamHTMLSurface_CopyToClipboard) Export(255, SteamAPI_ISteamHTMLSurface_CreateBrowser) Export(256, SteamAPI_ISteamHTMLSurface_ExecuteJavascript) Export(257, SteamAPI_ISteamHTMLSurface_FileLoadDialogResponse) Export(258, SteamAPI_ISteamHTMLSurface_Find) Export(259, SteamAPI_ISteamHTMLSurface_GetLinkAtPosition) Export(260, SteamAPI_ISteamHTMLSurface_GoBack) Export(261, SteamAPI_ISteamHTMLSurface_GoForward) Export(262, SteamAPI_ISteamHTMLSurface_Init) Export(263, SteamAPI_ISteamHTMLSurface_JSDialogResponse) Export(264, SteamAPI_ISteamHTMLSurface_KeyChar) Export(265, SteamAPI_ISteamHTMLSurface_KeyDown) Export(266, SteamAPI_ISteamHTMLSurface_KeyUp) Export(267, SteamAPI_ISteamHTMLSurface_LoadURL) Export(268, SteamAPI_ISteamHTMLSurface_MouseDoubleClick) Export(269, SteamAPI_ISteamHTMLSurface_MouseDown) Export(270, SteamAPI_ISteamHTMLSurface_MouseMove) Export(271, SteamAPI_ISteamHTMLSurface_MouseUp) Export(272, SteamAPI_ISteamHTMLSurface_MouseWheel) Export(273, SteamAPI_ISteamHTMLSurface_OpenDeveloperTools) Export(274, SteamAPI_ISteamHTMLSurface_PasteFromClipboard) Export(275, SteamAPI_ISteamHTMLSurface_Reload) Export(276, SteamAPI_ISteamHTMLSurface_RemoveBrowser) Export(277, SteamAPI_ISteamHTMLSurface_SetBackgroundMode) Export(278, SteamAPI_ISteamHTMLSurface_SetCookie) Export(279, SteamAPI_ISteamHTMLSurface_SetDPIScalingFactor) Export(280, SteamAPI_ISteamHTMLSurface_SetHorizontalScroll) Export(281, SteamAPI_ISteamHTMLSurface_SetKeyFocus) Export(282, SteamAPI_ISteamHTMLSurface_SetPageScaleFactor) Export(283, SteamAPI_ISteamHTMLSurface_SetSize) Export(284, SteamAPI_ISteamHTMLSurface_SetVerticalScroll) Export(285, SteamAPI_ISteamHTMLSurface_Shutdown) Export(286, SteamAPI_ISteamHTMLSurface_StopFind) Export(287, SteamAPI_ISteamHTMLSurface_StopLoad) Export(288, SteamAPI_ISteamHTMLSurface_ViewSource) Export(289, SteamAPI_ISteamHTTP_CreateCookieContainer) Export(290, SteamAPI_ISteamHTTP_CreateHTTPRequest) Export(291, SteamAPI_ISteamHTTP_DeferHTTPRequest) Export(292, SteamAPI_ISteamHTTP_GetHTTPDownloadProgressPct) Export(293, SteamAPI_ISteamHTTP_GetHTTPRequestWasTimedOut) Export(294, SteamAPI_ISteamHTTP_GetHTTPResponseBodyData) Export(295, SteamAPI_ISteamHTTP_GetHTTPResponseBodySize) Export(296, SteamAPI_ISteamHTTP_GetHTTPResponseHeaderSize) Export(297, SteamAPI_ISteamHTTP_GetHTTPResponseHeaderValue) Export(298, SteamAPI_ISteamHTTP_GetHTTPStreamingResponseBodyData) Export(299, SteamAPI_ISteamHTTP_PrioritizeHTTPRequest)\nExport(300, SteamAPI_ISteamHTTP_ReleaseCookieContainer) Export(301, SteamAPI_ISteamHTTP_ReleaseHTTPRequest) Export(302, SteamAPI_ISteamHTTP_SendHTTPRequest) Export(303, SteamAPI_ISteamHTTP_SendHTTPRequestAndStreamResponse) Export(304, SteamAPI_ISteamHTTP_SetCookie) Export(305, SteamAPI_ISteamHTTP_SetHTTPRequestAbsoluteTimeoutMS) Export(306, SteamAPI_ISteamHTTP_SetHTTPRequestContextValue) Export(307, SteamAPI_ISteamHTTP_SetHTTPRequestCookieContainer) Export(308, SteamAPI_ISteamHTTP_SetHTTPRequestGetOrPostParameter) Export(309, SteamAPI_ISteamHTTP_SetHTTPRequestHeaderValue) Export(310, SteamAPI_ISteamHTTP_SetHTTPRequestNetworkActivityTimeout) Export(311, SteamAPI_ISteamHTTP_SetHTTPRequestRawPostBody) Export(312, SteamAPI_ISteamHTTP_SetHTTPRequestRequiresVerifiedCertificate) Export(313, SteamAPI_ISteamHTTP_SetHTTPRequestUserAgentInfo) Export(314, SteamAPI_ISteamInput_ActivateActionSet) Export(315, SteamAPI_ISteamInput_ActivateActionSetLayer) Export(316, SteamAPI_ISteamInput_DeactivateActionSetLayer) Export(317, SteamAPI_ISteamInput_DeactivateAllActionSetLayers) Export(318, SteamAPI_ISteamInput_GetActionOriginFromXboxOrigin) Export(319, SteamAPI_ISteamInput_GetActionSetHandle) Export(320, SteamAPI_ISteamInput_GetActiveActionSetLayers) Export(321, SteamAPI_ISteamInput_GetAnalogActionData) Export(322, SteamAPI_ISteamInput_GetAnalogActionHandle) Export(323, SteamAPI_ISteamInput_GetAnalogActionOrigins) Export(324, SteamAPI_ISteamInput_GetConnectedControllers) Export(325, SteamAPI_ISteamInput_GetControllerForGamepadIndex) Export(326, SteamAPI_ISteamInput_GetCurrentActionSet) Export(327, SteamAPI_ISteamInput_GetDeviceBindingRevision) Export(328, SteamAPI_ISteamInput_GetDigitalActionData) Export(329, SteamAPI_ISteamInput_GetDigitalActionHandle) Export(330, SteamAPI_ISteamInput_GetDigitalActionOrigins) Export(331, SteamAPI_ISteamInput_GetGamepadIndexForController) Export(332, SteamAPI_ISteamInput_GetGlyphForActionOrigin) Export(333, SteamAPI_ISteamInput_GetGlyphForXboxOrigin) Export(334, SteamAPI_ISteamInput_GetInputTypeForHandle) Export(335, SteamAPI_ISteamInput_GetMotionData) Export(336, SteamAPI_ISteamInput_GetRemotePlaySessionID) Export(337, SteamAPI_ISteamInput_GetStringForActionOrigin) Export(338, SteamAPI_ISteamInput_GetStringForXboxOrigin) Export(339, SteamAPI_ISteamInput_Init) Export(340, SteamAPI_ISteamInput_RunFrame) Export(341, SteamAPI_ISteamInput_SetLEDColor) Export(342, SteamAPI_ISteamInput_ShowBindingPanel) Export(343, SteamAPI_ISteamInput_Shutdown) Export(344, SteamAPI_ISteamInput_StopAnalogActionMomentum) Export(345, SteamAPI_ISteamInput_TranslateActionOrigin) Export(346, SteamAPI_ISteamInput_TriggerHapticPulse) Export(347, SteamAPI_ISteamInput_TriggerRepeatedHapticPulse) Export(348, SteamAPI_ISteamInput_TriggerVibration) Export(349, SteamAPI_ISteamInventory_AddPromoItem)\nExport(350, SteamAPI_ISteamInventory_AddPromoItems) Export(351, SteamAPI_ISteamInventory_CheckResultSteamID) Export(352, SteamAPI_ISteamInventory_ConsumeItem) Export(353, SteamAPI_ISteamInventory_DeserializeResult) Export(354, SteamAPI_ISteamInventory_DestroyResult) Export(355, SteamAPI_ISteamInventory_ExchangeItems) Export(356, SteamAPI_ISteamInventory_GenerateItems) Export(357, SteamAPI_ISteamInventory_GetAllItems) Export(358, SteamAPI_ISteamInventory_GetEligiblePromoItemDefinitionIDs) Export(359, SteamAPI_ISteamInventory_GetItemDefinitionIDs) Export(360, SteamAPI_ISteamInventory_GetItemDefinitionProperty) Export(361, SteamAPI_ISteamInventory_GetItemPrice) Export(362, SteamAPI_ISteamInventory_GetItemsByID) Export(363, SteamAPI_ISteamInventory_GetItemsWithPrices) Export(364, SteamAPI_ISteamInventory_GetNumItemsWithPrices) Export(365, SteamAPI_ISteamInventory_GetResultItemProperty) Export(366, SteamAPI_ISteamInventory_GetResultItems) Export(367, SteamAPI_ISteamInventory_GetResultStatus) Export(368, SteamAPI_ISteamInventory_GetResultTimestamp) Export(369, SteamAPI_ISteamInventory_GrantPromoItems) Export(370, SteamAPI_ISteamInventory_InspectItem) Export(371, SteamAPI_ISteamInventory_LoadItemDefinitions) Export(372, SteamAPI_ISteamInventory_RemoveProperty) Export(373, SteamAPI_ISteamInventory_RequestEligiblePromoItemDefinitionsIDs) Export(374, SteamAPI_ISteamInventory_RequestPrices) Export(375, SteamAPI_ISteamInventory_SendItemDropHeartbeat) Export(376, SteamAPI_ISteamInventory_SerializeResult) Export(377, SteamAPI_ISteamInventory_SetPropertyBool) Export(378, SteamAPI_ISteamInventory_SetPropertyFloat) Export(379, SteamAPI_ISteamInventory_SetPropertyInt64) Export(380, SteamAPI_ISteamInventory_SetPropertyString) Export(381, SteamAPI_ISteamInventory_StartPurchase) Export(382, SteamAPI_ISteamInventory_StartUpdateProperties) Export(383, SteamAPI_ISteamInventory_SubmitUpdateProperties) Export(384, SteamAPI_ISteamInventory_TradeItems) Export(385, SteamAPI_ISteamInventory_TransferItemQuantity) Export(386, SteamAPI_ISteamInventory_TriggerItemDrop) Export(387, SteamAPI_ISteamMatchmakingPingResponse_ServerFailedToRespond) Export(388, SteamAPI_ISteamMatchmakingPingResponse_ServerResponded) Export(389, SteamAPI_ISteamMatchmakingPlayersResponse_AddPlayerToList) Export(390, SteamAPI_ISteamMatchmakingPlayersResponse_PlayersFailedToRespond) Export(391, SteamAPI_ISteamMatchmakingPlayersResponse_PlayersRefreshComplete) Export(392, SteamAPI_ISteamMatchmakingRulesResponse_RulesFailedToRespond) Export(393, SteamAPI_ISteamMatchmakingRulesResponse_RulesRefreshComplete) Export(394, SteamAPI_ISteamMatchmakingRulesResponse_RulesResponded) Export(395, SteamAPI_ISteamMatchmakingServerListResponse_RefreshComplete) Export(396, SteamAPI_ISteamMatchmakingServerListResponse_ServerFailedToRespond) Export(397, SteamAPI_ISteamMatchmakingServerListResponse_ServerResponded) Export(398, SteamAPI_ISteamMatchmakingServers_CancelQuery) Export(399, SteamAPI_ISteamMatchmakingServers_CancelServerQuery)\nExport(400, SteamAPI_ISteamMatchmakingServers_GetServerCount) Export(401, SteamAPI_ISteamMatchmakingServers_GetServerDetails) Export(402, SteamAPI_ISteamMatchmakingServers_IsRefreshing) Export(403, SteamAPI_ISteamMatchmakingServers_PingServer) Export(404, SteamAPI_ISteamMatchmakingServers_PlayerDetails) Export(405, SteamAPI_ISteamMatchmakingServers_RefreshQuery) Export(406, SteamAPI_ISteamMatchmakingServers_RefreshServer) Export(407, SteamAPI_ISteamMatchmakingServers_ReleaseRequest) Export(408, SteamAPI_ISteamMatchmakingServers_RequestFavoritesServerList) Export(409, SteamAPI_ISteamMatchmakingServers_RequestFriendsServerList) Export(410, SteamAPI_ISteamMatchmakingServers_RequestHistoryServerList) Export(411, SteamAPI_ISteamMatchmakingServers_RequestInternetServerList) Export(412, SteamAPI_ISteamMatchmakingServers_RequestLANServerList) Export(413, SteamAPI_ISteamMatchmakingServers_RequestSpectatorServerList) Export(414, SteamAPI_ISteamMatchmakingServers_ServerRules) Export(415, SteamAPI_ISteamMatchmaking_AddFavoriteGame) Export(416, SteamAPI_ISteamMatchmaking_AddRequestLobbyListCompatibleMembersFilter) Export(417, SteamAPI_ISteamMatchmaking_AddRequestLobbyListDistanceFilter) Export(418, SteamAPI_ISteamMatchmaking_AddRequestLobbyListFilterSlotsAvailable) Export(419, SteamAPI_ISteamMatchmaking_AddRequestLobbyListNearValueFilter) Export(420, SteamAPI_ISteamMatchmaking_AddRequestLobbyListNumericalFilter) Export(421, SteamAPI_ISteamMatchmaking_AddRequestLobbyListResultCountFilter) Export(422, SteamAPI_ISteamMatchmaking_AddRequestLobbyListStringFilter) Export(423, SteamAPI_ISteamMatchmaking_CreateLobby) Export(424, SteamAPI_ISteamMatchmaking_DeleteLobbyData) Export(425, SteamAPI_ISteamMatchmaking_GetFavoriteGame) Export(426, SteamAPI_ISteamMatchmaking_GetFavoriteGameCount) Export(427, SteamAPI_ISteamMatchmaking_GetLobbyByIndex) Export(428, SteamAPI_ISteamMatchmaking_GetLobbyChatEntry) Export(429, SteamAPI_ISteamMatchmaking_GetLobbyData) Export(430, SteamAPI_ISteamMatchmaking_GetLobbyDataByIndex) Export(431, SteamAPI_ISteamMatchmaking_GetLobbyDataCount) Export(432, SteamAPI_ISteamMatchmaking_GetLobbyGameServer) Export(433, SteamAPI_ISteamMatchmaking_GetLobbyMemberByIndex) Export(434, SteamAPI_ISteamMatchmaking_GetLobbyMemberData) Export(435, SteamAPI_ISteamMatchmaking_GetLobbyMemberLimit) Export(436, SteamAPI_ISteamMatchmaking_GetLobbyOwner) Export(437, SteamAPI_ISteamMatchmaking_GetNumLobbyMembers) Export(438, SteamAPI_ISteamMatchmaking_InviteUserToLobby) Export(439, SteamAPI_ISteamMatchmaking_JoinLobby) Export(440, SteamAPI_ISteamMatchmaking_LeaveLobby) Export(441, SteamAPI_ISteamMatchmaking_RemoveFavoriteGame) Export(442, SteamAPI_ISteamMatchmaking_RequestLobbyData) Export(443, SteamAPI_ISteamMatchmaking_RequestLobbyList) Export(444, SteamAPI_ISteamMatchmaking_SendLobbyChatMsg) Export(445, SteamAPI_ISteamMatchmaking_SetLinkedLobby) Export(446, SteamAPI_ISteamMatchmaking_SetLobbyData) Export(447, SteamAPI_ISteamMatchmaking_SetLobbyGameServer) Export(448, SteamAPI_ISteamMatchmaking_SetLobbyJoinable) Export(449, SteamAPI_ISteamMatchmaking_SetLobbyMemberData)\nExport(450, SteamAPI_ISteamMatchmaking_SetLobbyMemberLimit) Export(451, SteamAPI_ISteamMatchmaking_SetLobbyOwner) Export(452, SteamAPI_ISteamMatchmaking_SetLobbyType) Export(453, SteamAPI_ISteamMusicRemote_BActivationSuccess) Export(454, SteamAPI_ISteamMusicRemote_BIsCurrentMusicRemote) Export(455, SteamAPI_ISteamMusicRemote_CurrentEntryDidChange) Export(456, SteamAPI_ISteamMusicRemote_CurrentEntryIsAvailable) Export(457, SteamAPI_ISteamMusicRemote_CurrentEntryWillChange) Export(458, SteamAPI_ISteamMusicRemote_DeregisterSteamMusicRemote) Export(459, SteamAPI_ISteamMusicRemote_EnableLooped) Export(460, SteamAPI_ISteamMusicRemote_EnablePlayNext) Export(461, SteamAPI_ISteamMusicRemote_EnablePlayPrevious) Export(462, SteamAPI_ISteamMusicRemote_EnablePlaylists) Export(463, SteamAPI_ISteamMusicRemote_EnableQueue) Export(464, SteamAPI_ISteamMusicRemote_EnableShuffled) Export(465, SteamAPI_ISteamMusicRemote_PlaylistDidChange) Export(466, SteamAPI_ISteamMusicRemote_PlaylistWillChange) Export(467, SteamAPI_ISteamMusicRemote_QueueDidChange) Export(468, SteamAPI_ISteamMusicRemote_QueueWillChange) Export(469, SteamAPI_ISteamMusicRemote_RegisterSteamMusicRemote) Export(470, SteamAPI_ISteamMusicRemote_ResetPlaylistEntries) Export(471, SteamAPI_ISteamMusicRemote_ResetQueueEntries) Export(472, SteamAPI_ISteamMusicRemote_SetCurrentPlaylistEntry) Export(473, SteamAPI_ISteamMusicRemote_SetCurrentQueueEntry) Export(474, SteamAPI_ISteamMusicRemote_SetDisplayName) Export(475, SteamAPI_ISteamMusicRemote_SetPNGIcon_64x64) Export(476, SteamAPI_ISteamMusicRemote_SetPlaylistEntry) Export(477, SteamAPI_ISteamMusicRemote_SetQueueEntry) Export(478, SteamAPI_ISteamMusicRemote_UpdateCurrentEntryCoverArt) Export(479, SteamAPI_ISteamMusicRemote_UpdateCurrentEntryElapsedSeconds) Export(480, SteamAPI_ISteamMusicRemote_UpdateCurrentEntryText) Export(481, SteamAPI_ISteamMusicRemote_UpdateLooped) Export(482, SteamAPI_ISteamMusicRemote_UpdatePlaybackStatus) Export(483, SteamAPI_ISteamMusicRemote_UpdateShuffled) Export(484, SteamAPI_ISteamMusicRemote_UpdateVolume) Export(485, SteamAPI_ISteamMusic_BIsEnabled) Export(486, SteamAPI_ISteamMusic_BIsPlaying) Export(487, SteamAPI_ISteamMusic_GetPlaybackStatus) Export(488, SteamAPI_ISteamMusic_GetVolume) Export(489, SteamAPI_ISteamMusic_Pause) Export(490, SteamAPI_ISteamMusic_Play) Export(491, SteamAPI_ISteamMusic_PlayNext) Export(492, SteamAPI_ISteamMusic_PlayPrevious) Export(493, SteamAPI_ISteamMusic_SetVolume) Export(494, SteamAPI_ISteamNetworkingMessages_AcceptSessionWithUser) Export(495, SteamAPI_ISteamNetworkingMessages_CloseChannelWithUser) Export(496, SteamAPI_ISteamNetworkingMessages_CloseSessionWithUser) Export(497, SteamAPI_ISteamNetworkingMessages_GetSessionConnectionInfo) Export(498, SteamAPI_ISteamNetworkingMessages_ReceiveMessagesOnChannel) Export(499, SteamAPI_ISteamNetworkingMessages_SendMessageToUser)\nExport(500, SteamAPI_ISteamNetworkingSockets_AcceptConnection) Export(501, SteamAPI_ISteamNetworkingSockets_CloseConnection) Export(502, SteamAPI_ISteamNetworkingSockets_CloseListenSocket) Export(503, SteamAPI_ISteamNetworkingSockets_ConnectByIPAddress) Export(504, SteamAPI_ISteamNetworkingSockets_ConnectP2P) Export(505, SteamAPI_ISteamNetworkingSockets_ConnectP2PCustomSignaling) Export(506, SteamAPI_ISteamNetworkingSockets_ConnectToHostedDedicatedServer) Export(507, SteamAPI_ISteamNetworkingSockets_CreateHostedDedicatedServerListenSocket) Export(508, SteamAPI_ISteamNetworkingSockets_CreateListenSocketIP) Export(509, SteamAPI_ISteamNetworkingSockets_CreateListenSocketP2P) Export(510, SteamAPI_ISteamNetworkingSockets_CreatePollGroup) Export(511, SteamAPI_ISteamNetworkingSockets_CreateSocketPair) Export(512, SteamAPI_ISteamNetworkingSockets_DestroyPollGroup) Export(513, SteamAPI_ISteamNetworkingSockets_FindRelayAuthTicketForServer) Export(514, SteamAPI_ISteamNetworkingSockets_FlushMessagesOnConnection) Export(515, SteamAPI_ISteamNetworkingSockets_GetAuthenticationStatus) Export(516, SteamAPI_ISteamNetworkingSockets_GetCertificateRequest) Export(517, SteamAPI_ISteamNetworkingSockets_GetConnectionInfo) Export(518, SteamAPI_ISteamNetworkingSockets_GetConnectionName) Export(519, SteamAPI_ISteamNetworkingSockets_GetConnectionUserData) Export(520, SteamAPI_ISteamNetworkingSockets_GetDetailedConnectionStatus) Export(521, SteamAPI_ISteamNetworkingSockets_GetGameCoordinatorServerLogin) Export(522, SteamAPI_ISteamNetworkingSockets_GetHostedDedicatedServerAddress) Export(523, SteamAPI_ISteamNetworkingSockets_GetHostedDedicatedServerPOPID) Export(524, SteamAPI_ISteamNetworkingSockets_GetHostedDedicatedServerPort) Export(525, SteamAPI_ISteamNetworkingSockets_GetIdentity) Export(526, SteamAPI_ISteamNetworkingSockets_GetListenSocketAddress) Export(527, SteamAPI_ISteamNetworkingSockets_GetQuickConnectionStatus) Export(528, SteamAPI_ISteamNetworkingSockets_InitAuthentication) Export(529, SteamAPI_ISteamNetworkingSockets_ReceiveMessagesOnConnection) Export(530, SteamAPI_ISteamNetworkingSockets_ReceiveMessagesOnPollGroup) Export(531, SteamAPI_ISteamNetworkingSockets_ReceivedP2PCustomSignal) Export(532, SteamAPI_ISteamNetworkingSockets_ReceivedRelayAuthTicket) Export(533, SteamAPI_ISteamNetworkingSockets_RunCallbacks) Export(534, SteamAPI_ISteamNetworkingSockets_SendMessageToConnection) Export(535, SteamAPI_ISteamNetworkingSockets_SendMessages) Export(536, SteamAPI_ISteamNetworkingSockets_SetCertificate) Export(537, SteamAPI_ISteamNetworkingSockets_SetConnectionName) Export(538, SteamAPI_ISteamNetworkingSockets_SetConnectionPollGroup) Export(539, SteamAPI_ISteamNetworkingSockets_SetConnectionUserData) Export(540, SteamAPI_ISteamNetworkingUtils_AllocateMessage) Export(541, SteamAPI_ISteamNetworkingUtils_CheckPingDataUpToDate) Export(542, SteamAPI_ISteamNetworkingUtils_ConvertPingLocationToString) Export(543, SteamAPI_ISteamNetworkingUtils_EstimatePingTimeBetweenTwoLocations) Export(544, SteamAPI_ISteamNetworkingUtils_EstimatePingTimeFromLocalHost) Export(545, SteamAPI_ISteamNetworkingUtils_GetConfigValue) Export(546, SteamAPI_ISteamNetworkingUtils_GetConfigValueInfo) Export(547, SteamAPI_ISteamNetworkingUtils_GetDirectPingToPOP) Export(548, SteamAPI_ISteamNetworkingUtils_GetFirstConfigValue) Export(549, SteamAPI_ISteamNetworkingUtils_GetLocalPingLocation)\nExport(550, SteamAPI_ISteamNetworkingUtils_GetLocalTimestamp) Export(551, SteamAPI_ISteamNetworkingUtils_GetPOPCount) Export(552, SteamAPI_ISteamNetworkingUtils_GetPOPList) Export(553, SteamAPI_ISteamNetworkingUtils_GetPingToDataCenter) Export(554, SteamAPI_ISteamNetworkingUtils_GetRelayNetworkStatus) Export(555, SteamAPI_ISteamNetworkingUtils_InitRelayNetworkAccess) Export(556, SteamAPI_ISteamNetworkingUtils_ParsePingLocationString) Export(557, SteamAPI_ISteamNetworkingUtils_SetConfigValue) Export(558, SteamAPI_ISteamNetworkingUtils_SetConfigValueStruct) Export(559, SteamAPI_ISteamNetworkingUtils_SetConnectionConfigValueFloat) Export(560, SteamAPI_ISteamNetworkingUtils_SetConnectionConfigValueInt32) Export(561, SteamAPI_ISteamNetworkingUtils_SetConnectionConfigValueString) Export(562, SteamAPI_ISteamNetworkingUtils_SetDebugOutputFunction) Export(563, SteamAPI_ISteamNetworkingUtils_SetGlobalCallback_MessagesSessionFailed) Export(564, SteamAPI_ISteamNetworkingUtils_SetGlobalCallback_MessagesSessionRequest) Export(565, SteamAPI_ISteamNetworkingUtils_SetGlobalCallback_SteamNetAuthenticationStatusChanged) Export(566, SteamAPI_ISteamNetworkingUtils_SetGlobalCallback_SteamNetConnectionStatusChanged) Export(567, SteamAPI_ISteamNetworkingUtils_SetGlobalCallback_SteamRelayNetworkStatusChanged) Export(568, SteamAPI_ISteamNetworkingUtils_SetGlobalConfigValueFloat) Export(569, SteamAPI_ISteamNetworkingUtils_SetGlobalConfigValueInt32) Export(570, SteamAPI_ISteamNetworkingUtils_SetGlobalConfigValuePtr) Export(571, SteamAPI_ISteamNetworkingUtils_SetGlobalConfigValueString) Export(572, SteamAPI_ISteamNetworkingUtils_SteamNetworkingIPAddr_ParseString) Export(573, SteamAPI_ISteamNetworkingUtils_SteamNetworkingIPAddr_ToString) Export(574, SteamAPI_ISteamNetworkingUtils_SteamNetworkingIdentity_ParseString) Export(575, SteamAPI_ISteamNetworkingUtils_SteamNetworkingIdentity_ToString) Export(576, SteamAPI_ISteamNetworking_AcceptP2PSessionWithUser) Export(577, SteamAPI_ISteamNetworking_AllowP2PPacketRelay) Export(578, SteamAPI_ISteamNetworking_CloseP2PChannelWithUser) Export(579, SteamAPI_ISteamNetworking_CloseP2PSessionWithUser) Export(580, SteamAPI_ISteamNetworking_CreateConnectionSocket) Export(581, SteamAPI_ISteamNetworking_CreateListenSocket) Export(582, SteamAPI_ISteamNetworking_CreateP2PConnectionSocket) Export(583, SteamAPI_ISteamNetworking_DestroyListenSocket) Export(584, SteamAPI_ISteamNetworking_DestroySocket) Export(585, SteamAPI_ISteamNetworking_GetListenSocketInfo) Export(586, SteamAPI_ISteamNetworking_GetMaxPacketSize) Export(587, SteamAPI_ISteamNetworking_GetP2PSessionState) Export(588, SteamAPI_ISteamNetworking_GetSocketConnectionType) Export(589, SteamAPI_ISteamNetworking_GetSocketInfo) Export(590, SteamAPI_ISteamNetworking_IsDataAvailable) Export(591, SteamAPI_ISteamNetworking_IsDataAvailableOnSocket) Export(592, SteamAPI_ISteamNetworking_IsP2PPacketAvailable) Export(593, SteamAPI_ISteamNetworking_ReadP2PPacket) Export(594, SteamAPI_ISteamNetworking_RetrieveData) Export(595, SteamAPI_ISteamNetworking_RetrieveDataFromSocket) Export(596, SteamAPI_ISteamNetworking_SendDataOnSocket) Export(597, SteamAPI_ISteamNetworking_SendP2PPacket) Export(598, SteamAPI_ISteamParentalSettings_BIsAppBlocked) Export(599, SteamAPI_ISteamParentalSettings_BIsAppInBlockList)\nExport(600, SteamAPI_ISteamParentalSettings_BIsFeatureBlocked) Export(601, SteamAPI_ISteamParentalSettings_BIsFeatureInBlockList) Export(602, SteamAPI_ISteamParentalSettings_BIsParentalLockEnabled) Export(603, SteamAPI_ISteamParentalSettings_BIsParentalLockLocked) Export(604, SteamAPI_ISteamParties_CancelReservation) Export(605, SteamAPI_ISteamParties_ChangeNumOpenSlots) Export(606, SteamAPI_ISteamParties_CreateBeacon) Export(607, SteamAPI_ISteamParties_DestroyBeacon) Export(608, SteamAPI_ISteamParties_GetAvailableBeaconLocations) Export(609, SteamAPI_ISteamParties_GetBeaconByIndex) Export(610, SteamAPI_ISteamParties_GetBeaconDetails) Export(611, SteamAPI_ISteamParties_GetBeaconLocationData) Export(612, SteamAPI_ISteamParties_GetNumActiveBeacons) Export(613, SteamAPI_ISteamParties_GetNumAvailableBeaconLocations) Export(614, SteamAPI_ISteamParties_JoinParty) Export(615, SteamAPI_ISteamParties_OnReservationCompleted) Export(616, SteamAPI_ISteamRemotePlay_BGetSessionClientResolution) Export(617, SteamAPI_ISteamRemotePlay_BSendRemotePlayTogetherInvite) Export(618, SteamAPI_ISteamRemotePlay_GetSessionClientFormFactor) Export(619, SteamAPI_ISteamRemotePlay_GetSessionClientName) Export(620, SteamAPI_ISteamRemotePlay_GetSessionCount) Export(621, SteamAPI_ISteamRemotePlay_GetSessionID) Export(622, SteamAPI_ISteamRemotePlay_GetSessionSteamID) Export(623, SteamAPI_ISteamRemoteStorage_CommitPublishedFileUpdate) Export(624, SteamAPI_ISteamRemoteStorage_CreatePublishedFileUpdateRequest) Export(625, SteamAPI_ISteamRemoteStorage_DeletePublishedFile) Export(626, SteamAPI_ISteamRemoteStorage_EnumeratePublishedFilesByUserAction) Export(627, SteamAPI_ISteamRemoteStorage_EnumeratePublishedWorkshopFiles) Export(628, SteamAPI_ISteamRemoteStorage_EnumerateUserPublishedFiles) Export(629, SteamAPI_ISteamRemoteStorage_EnumerateUserSharedWorkshopFiles) Export(630, SteamAPI_ISteamRemoteStorage_EnumerateUserSubscribedFiles) Export(631, SteamAPI_ISteamRemoteStorage_FileDelete) Export(632, SteamAPI_ISteamRemoteStorage_FileExists) Export(633, SteamAPI_ISteamRemoteStorage_FileForget) Export(634, SteamAPI_ISteamRemoteStorage_FilePersisted) Export(635, SteamAPI_ISteamRemoteStorage_FileRead) Export(636, SteamAPI_ISteamRemoteStorage_FileReadAsync) Export(637, SteamAPI_ISteamRemoteStorage_FileReadAsyncComplete) Export(638, SteamAPI_ISteamRemoteStorage_FileShare) Export(639, SteamAPI_ISteamRemoteStorage_FileWrite) Export(640, SteamAPI_ISteamRemoteStorage_FileWriteAsync) Export(641, SteamAPI_ISteamRemoteStorage_FileWriteStreamCancel) Export(642, SteamAPI_ISteamRemoteStorage_FileWriteStreamClose) Export(643, SteamAPI_ISteamRemoteStorage_FileWriteStreamOpen) Export(644, SteamAPI_ISteamRemoteStorage_FileWriteStreamWriteChunk) Export(645, SteamAPI_ISteamRemoteStorage_GetCachedUGCCount) Export(646, SteamAPI_ISteamRemoteStorage_GetCachedUGCHandle) Export(647, SteamAPI_ISteamRemoteStorage_GetFileCount) Export(648, SteamAPI_ISteamRemoteStorage_GetFileNameAndSize) Export(649, SteamAPI_ISteamRemoteStorage_GetFileSize)\nExport(650, SteamAPI_ISteamRemoteStorage_GetFileTimestamp) Export(651, SteamAPI_ISteamRemoteStorage_GetPublishedFileDetails) Export(652, SteamAPI_ISteamRemoteStorage_GetPublishedItemVoteDetails) Export(653, SteamAPI_ISteamRemoteStorage_GetQuota) Export(654, SteamAPI_ISteamRemoteStorage_GetSyncPlatforms) Export(655, SteamAPI_ISteamRemoteStorage_GetUGCDetails) Export(656, SteamAPI_ISteamRemoteStorage_GetUGCDownloadProgress) Export(657, SteamAPI_ISteamRemoteStorage_GetUserPublishedItemVoteDetails) Export(658, SteamAPI_ISteamRemoteStorage_IsCloudEnabledForAccount) Export(659, SteamAPI_ISteamRemoteStorage_IsCloudEnabledForApp) Export(660, SteamAPI_ISteamRemoteStorage_PublishVideo) Export(661, SteamAPI_ISteamRemoteStorage_PublishWorkshopFile) Export(662, SteamAPI_ISteamRemoteStorage_SetCloudEnabledForApp) Export(663, SteamAPI_ISteamRemoteStorage_SetSyncPlatforms) Export(664, SteamAPI_ISteamRemoteStorage_SetUserPublishedFileAction) Export(665, SteamAPI_ISteamRemoteStorage_SubscribePublishedFile) Export(666, SteamAPI_ISteamRemoteStorage_UGCDownload) Export(667, SteamAPI_ISteamRemoteStorage_UGCDownloadToLocation) Export(668, SteamAPI_ISteamRemoteStorage_UGCRead) Export(669, SteamAPI_ISteamRemoteStorage_UnsubscribePublishedFile) Export(670, SteamAPI_ISteamRemoteStorage_UpdatePublishedFileDescription) Export(671, SteamAPI_ISteamRemoteStorage_UpdatePublishedFileFile) Export(672, SteamAPI_ISteamRemoteStorage_UpdatePublishedFilePreviewFile) Export(673, SteamAPI_ISteamRemoteStorage_UpdatePublishedFileSetChangeDescription) Export(674, SteamAPI_ISteamRemoteStorage_UpdatePublishedFileTags) Export(675, SteamAPI_ISteamRemoteStorage_UpdatePublishedFileTitle) Export(676, SteamAPI_ISteamRemoteStorage_UpdatePublishedFileVisibility) Export(677, SteamAPI_ISteamRemoteStorage_UpdateUserPublishedItemVote) Export(678, SteamAPI_ISteamScreenshots_AddScreenshotToLibrary) Export(679, SteamAPI_ISteamScreenshots_AddVRScreenshotToLibrary) Export(680, SteamAPI_ISteamScreenshots_HookScreenshots) Export(681, SteamAPI_ISteamScreenshots_IsScreenshotsHooked) Export(682, SteamAPI_ISteamScreenshots_SetLocation) Export(683, SteamAPI_ISteamScreenshots_TagPublishedFile) Export(684, SteamAPI_ISteamScreenshots_TagUser) Export(685, SteamAPI_ISteamScreenshots_TriggerScreenshot) Export(686, SteamAPI_ISteamScreenshots_WriteScreenshot) Export(687, SteamAPI_ISteamUGC_AddAppDependency) Export(688, SteamAPI_ISteamUGC_AddDependency) Export(689, SteamAPI_ISteamUGC_AddExcludedTag) Export(690, SteamAPI_ISteamUGC_AddItemKeyValueTag) Export(691, SteamAPI_ISteamUGC_AddItemPreviewFile) Export(692, SteamAPI_ISteamUGC_AddItemPreviewVideo) Export(693, SteamAPI_ISteamUGC_AddItemToFavorites) Export(694, SteamAPI_ISteamUGC_AddRequiredKeyValueTag) Export(695, SteamAPI_ISteamUGC_AddRequiredTag) Export(696, SteamAPI_ISteamUGC_AddRequiredTagGroup) Export(697, SteamAPI_ISteamUGC_BInitWorkshopForGameServer) Export(698, SteamAPI_ISteamUGC_CreateItem) Export(699, SteamAPI_ISteamUGC_CreateQueryAllUGCRequestCursor)\nExport(700, SteamAPI_ISteamUGC_CreateQueryAllUGCRequestPage) Export(701, SteamAPI_ISteamUGC_CreateQueryUGCDetailsRequest) Export(702, SteamAPI_ISteamUGC_CreateQueryUserUGCRequest) Export(703, SteamAPI_ISteamUGC_DeleteItem) Export(704, SteamAPI_ISteamUGC_DownloadItem) Export(705, SteamAPI_ISteamUGC_GetAppDependencies) Export(706, SteamAPI_ISteamUGC_GetItemDownloadInfo) Export(707, SteamAPI_ISteamUGC_GetItemInstallInfo) Export(708, SteamAPI_ISteamUGC_GetItemState) Export(709, SteamAPI_ISteamUGC_GetItemUpdateProgress) Export(710, SteamAPI_ISteamUGC_GetNumSubscribedItems) Export(711, SteamAPI_ISteamUGC_GetQueryFirstUGCKeyValueTag) Export(712, SteamAPI_ISteamUGC_GetQueryUGCAdditionalPreview) Export(713, SteamAPI_ISteamUGC_GetQueryUGCChildren) Export(714, SteamAPI_ISteamUGC_GetQueryUGCKeyValueTag) Export(715, SteamAPI_ISteamUGC_GetQueryUGCMetadata) Export(716, SteamAPI_ISteamUGC_GetQueryUGCNumAdditionalPreviews) Export(717, SteamAPI_ISteamUGC_GetQueryUGCNumKeyValueTags) Export(718, SteamAPI_ISteamUGC_GetQueryUGCNumTags) Export(719, SteamAPI_ISteamUGC_GetQueryUGCPreviewURL) Export(720, SteamAPI_ISteamUGC_GetQueryUGCResult) Export(721, SteamAPI_ISteamUGC_GetQueryUGCStatistic) Export(722, SteamAPI_ISteamUGC_GetQueryUGCTag) Export(723, SteamAPI_ISteamUGC_GetQueryUGCTagDisplayName) Export(724, SteamAPI_ISteamUGC_GetSubscribedItems) Export(725, SteamAPI_ISteamUGC_GetUserItemVote) Export(726, SteamAPI_ISteamUGC_ReleaseQueryUGCRequest) Export(727, SteamAPI_ISteamUGC_RemoveAllItemKeyValueTags) Export(728, SteamAPI_ISteamUGC_RemoveAppDependency) Export(729, SteamAPI_ISteamUGC_RemoveDependency) Export(730, SteamAPI_ISteamUGC_RemoveItemFromFavorites) Export(731, SteamAPI_ISteamUGC_RemoveItemKeyValueTags) Export(732, SteamAPI_ISteamUGC_RemoveItemPreview) Export(733, SteamAPI_ISteamUGC_RequestUGCDetails) Export(734, SteamAPI_ISteamUGC_SendQueryUGCRequest) Export(735, SteamAPI_ISteamUGC_SetAllowCachedResponse) Export(736, SteamAPI_ISteamUGC_SetAllowLegacyUpload) Export(737, SteamAPI_ISteamUGC_SetCloudFileNameFilter) Export(738, SteamAPI_ISteamUGC_SetItemContent) Export(739, SteamAPI_ISteamUGC_SetItemDescription) Export(740, SteamAPI_ISteamUGC_SetItemMetadata) Export(741, SteamAPI_ISteamUGC_SetItemPreview) Export(742, SteamAPI_ISteamUGC_SetItemTags) Export(743, SteamAPI_ISteamUGC_SetItemTitle) Export(744, SteamAPI_ISteamUGC_SetItemUpdateLanguage) Export(745, SteamAPI_ISteamUGC_SetItemVisibility) Export(746, SteamAPI_ISteamUGC_SetLanguage) Export(747, SteamAPI_ISteamUGC_SetMatchAnyTag) Export(748, SteamAPI_ISteamUGC_SetRankedByTrendDays) Export(749, SteamAPI_ISteamUGC_SetReturnAdditionalPreviews)\nExport(750, SteamAPI_ISteamUGC_SetReturnChildren) Export(751, SteamAPI_ISteamUGC_SetReturnKeyValueTags) Export(752, SteamAPI_ISteamUGC_SetReturnLongDescription) Export(753, SteamAPI_ISteamUGC_SetReturnMetadata) Export(754, SteamAPI_ISteamUGC_SetReturnOnlyIDs) Export(755, SteamAPI_ISteamUGC_SetReturnPlaytimeStats) Export(756, SteamAPI_ISteamUGC_SetReturnTotalOnly) Export(757, SteamAPI_ISteamUGC_SetSearchText) Export(758, SteamAPI_ISteamUGC_SetUserItemVote) Export(759, SteamAPI_ISteamUGC_StartItemUpdate) Export(760, SteamAPI_ISteamUGC_StartPlaytimeTracking) Export(761, SteamAPI_ISteamUGC_StopPlaytimeTracking) Export(762, SteamAPI_ISteamUGC_StopPlaytimeTrackingForAllItems) Export(763, SteamAPI_ISteamUGC_SubmitItemUpdate) Export(764, SteamAPI_ISteamUGC_SubscribeItem) Export(765, SteamAPI_ISteamUGC_SuspendDownloads) Export(766, SteamAPI_ISteamUGC_UnsubscribeItem) Export(767, SteamAPI_ISteamUGC_UpdateItemPreviewFile) Export(768, SteamAPI_ISteamUGC_UpdateItemPreviewVideo) Export(769, SteamAPI_ISteamUserStats_AttachLeaderboardUGC) Export(770, SteamAPI_ISteamUserStats_ClearAchievement) Export(771, SteamAPI_ISteamUserStats_DownloadLeaderboardEntries) Export(772, SteamAPI_ISteamUserStats_DownloadLeaderboardEntriesForUsers) Export(773, SteamAPI_ISteamUserStats_FindLeaderboard) Export(774, SteamAPI_ISteamUserStats_FindOrCreateLeaderboard) Export(775, SteamAPI_ISteamUserStats_GetAchievement) Export(776, SteamAPI_ISteamUserStats_GetAchievementAchievedPercent) Export(777, SteamAPI_ISteamUserStats_GetAchievementAndUnlockTime) Export(778, SteamAPI_ISteamUserStats_GetAchievementDisplayAttribute) Export(779, SteamAPI_ISteamUserStats_GetAchievementIcon) Export(780, SteamAPI_ISteamUserStats_GetAchievementName) Export(781, SteamAPI_ISteamUserStats_GetAchievementProgressLimitsFloat) Export(782, SteamAPI_ISteamUserStats_GetAchievementProgressLimitsInt32) Export(783, SteamAPI_ISteamUserStats_GetDownloadedLeaderboardEntry) Export(784, SteamAPI_ISteamUserStats_GetGlobalStatDouble) Export(785, SteamAPI_ISteamUserStats_GetGlobalStatHistoryDouble) Export(786, SteamAPI_ISteamUserStats_GetGlobalStatHistoryInt64) Export(787, SteamAPI_ISteamUserStats_GetGlobalStatInt64) Export(788, SteamAPI_ISteamUserStats_GetLeaderboardDisplayType) Export(789, SteamAPI_ISteamUserStats_GetLeaderboardEntryCount) Export(790, SteamAPI_ISteamUserStats_GetLeaderboardName) Export(791, SteamAPI_ISteamUserStats_GetLeaderboardSortMethod) Export(792, SteamAPI_ISteamUserStats_GetMostAchievedAchievementInfo) Export(793, SteamAPI_ISteamUserStats_GetNextMostAchievedAchievementInfo) Export(794, SteamAPI_ISteamUserStats_GetNumAchievements) Export(795, SteamAPI_ISteamUserStats_GetNumberOfCurrentPlayers) Export(796, SteamAPI_ISteamUserStats_GetStatFloat) Export(797, SteamAPI_ISteamUserStats_GetStatInt32) Export(798, SteamAPI_ISteamUserStats_GetUserAchievement) Export(799, SteamAPI_ISteamUserStats_GetUserAchievementAndUnlockTime)\nExport(800, SteamAPI_ISteamUserStats_GetUserStatFloat) Export(801, SteamAPI_ISteamUserStats_GetUserStatInt32) Export(802, SteamAPI_ISteamUserStats_IndicateAchievementProgress) Export(803, SteamAPI_ISteamUserStats_RequestCurrentStats) Export(804, SteamAPI_ISteamUserStats_RequestGlobalAchievementPercentages) Export(805, SteamAPI_ISteamUserStats_RequestGlobalStats) Export(806, SteamAPI_ISteamUserStats_RequestUserStats) Export(807, SteamAPI_ISteamUserStats_ResetAllStats) Export(808, SteamAPI_ISteamUserStats_SetAchievement) Export(809, SteamAPI_ISteamUserStats_SetStatFloat) Export(810, SteamAPI_ISteamUserStats_SetStatInt32) Export(811, SteamAPI_ISteamUserStats_StoreStats) Export(812, SteamAPI_ISteamUserStats_UpdateAvgRateStat) Export(813, SteamAPI_ISteamUserStats_UploadLeaderboardScore) Export(814, SteamAPI_ISteamUser_AdvertiseGame) Export(815, SteamAPI_ISteamUser_BIsBehindNAT) Export(816, SteamAPI_ISteamUser_BIsPhoneIdentifying) Export(817, SteamAPI_ISteamUser_BIsPhoneRequiringVerification) Export(818, SteamAPI_ISteamUser_BIsPhoneVerified) Export(819, SteamAPI_ISteamUser_BIsTwoFactorEnabled) Export(820, SteamAPI_ISteamUser_BLoggedOn) Export(821, SteamAPI_ISteamUser_BSetDurationControlOnlineState) Export(822, SteamAPI_ISteamUser_BeginAuthSession) Export(823, SteamAPI_ISteamUser_CancelAuthTicket) Export(824, SteamAPI_ISteamUser_DecompressVoice) Export(825, SteamAPI_ISteamUser_EndAuthSession) Export(826, SteamAPI_ISteamUser_GetAuthSessionTicket) Export(827, SteamAPI_ISteamUser_GetAvailableVoice) Export(828, SteamAPI_ISteamUser_GetDurationControl) Export(829, SteamAPI_ISteamUser_GetEncryptedAppTicket) Export(830, SteamAPI_ISteamUser_GetGameBadgeLevel) Export(831, SteamAPI_ISteamUser_GetHSteamUser) Export(832, SteamAPI_ISteamUser_GetMarketEligibility) Export(833, SteamAPI_ISteamUser_GetPlayerSteamLevel) Export(834, SteamAPI_ISteamUser_GetSteamID) Export(835, SteamAPI_ISteamUser_GetUserDataFolder) Export(836, SteamAPI_ISteamUser_GetVoice) Export(837, SteamAPI_ISteamUser_GetVoiceOptimalSampleRate) Export(838, SteamAPI_ISteamUser_InitiateGameConnection) Export(839, SteamAPI_ISteamUser_RequestEncryptedAppTicket) Export(840, SteamAPI_ISteamUser_RequestStoreAuthURL) Export(841, SteamAPI_ISteamUser_StartVoiceRecording) Export(842, SteamAPI_ISteamUser_StopVoiceRecording) Export(843, SteamAPI_ISteamUser_TerminateGameConnection) Export(844, SteamAPI_ISteamUser_TrackAppUsageEvent) Export(845, SteamAPI_ISteamUser_UserHasLicenseForApp) Export(846, SteamAPI_ISteamUtils_BOverlayNeedsPresent) Export(847, SteamAPI_ISteamUtils_CheckFileSignature) Export(848, SteamAPI_ISteamUtils_FilterText) Export(849, SteamAPI_ISteamUtils_GetAPICallFailureReason)\nExport(850, SteamAPI_ISteamUtils_GetAPICallResult) Export(851, SteamAPI_ISteamUtils_GetAppID) Export(852, SteamAPI_ISteamUtils_GetConnectedUniverse) Export(853, SteamAPI_ISteamUtils_GetCurrentBatteryPower) Export(854, SteamAPI_ISteamUtils_GetEnteredGamepadTextInput) Export(855, SteamAPI_ISteamUtils_GetEnteredGamepadTextLength) Export(856, SteamAPI_ISteamUtils_GetIPCCallCount) Export(857, SteamAPI_ISteamUtils_GetIPCountry) Export(858, SteamAPI_ISteamUtils_GetIPv6ConnectivityState) Export(859, SteamAPI_ISteamUtils_GetImageRGBA) Export(860, SteamAPI_ISteamUtils_GetImageSize) Export(861, SteamAPI_ISteamUtils_GetSecondsSinceAppActive) Export(862, SteamAPI_ISteamUtils_GetSecondsSinceComputerActive) Export(863, SteamAPI_ISteamUtils_GetServerRealTime) Export(864, SteamAPI_ISteamUtils_GetSteamUILanguage) Export(865, SteamAPI_ISteamUtils_InitFilterText) Export(866, SteamAPI_ISteamUtils_IsAPICallCompleted) Export(867, SteamAPI_ISteamUtils_IsOverlayEnabled) Export(868, SteamAPI_ISteamUtils_IsSteamChinaLauncher) Export(869, SteamAPI_ISteamUtils_IsSteamInBigPictureMode) Export(870, SteamAPI_ISteamUtils_IsSteamRunningInVR) Export(871, SteamAPI_ISteamUtils_IsVRHeadsetStreamingEnabled) Export(872, SteamAPI_ISteamUtils_SetOverlayNotificationInset) Export(873, SteamAPI_ISteamUtils_SetOverlayNotificationPosition) Export(874, SteamAPI_ISteamUtils_SetVRHeadsetStreamingEnabled) Export(875, SteamAPI_ISteamUtils_SetWarningMessageHook) Export(876, SteamAPI_ISteamUtils_ShowGamepadTextInput) Export(877, SteamAPI_ISteamUtils_StartVRDashboard) Export(878, SteamAPI_ISteamVideo_GetOPFSettings) Export(879, SteamAPI_ISteamVideo_GetOPFStringForApp) Export(880, SteamAPI_ISteamVideo_GetVideoURL) Export(881, SteamAPI_ISteamVideo_IsBroadcasting) Export(882, SteamAPI_Init) Export(883, SteamAPI_InitAnonymousUser) Export(884, SteamAPI_InitSafe) Export(885, SteamAPI_IsSteamRunning) Export(886, SteamAPI_ManualDispatch_FreeLastCallback) Export(887, SteamAPI_ManualDispatch_GetAPICallResult) Export(888, SteamAPI_ManualDispatch_GetNextCallback) Export(889, SteamAPI_ManualDispatch_Init) Export(890, SteamAPI_ManualDispatch_RunFrame) Export(891, SteamAPI_MatchMakingKeyValuePair_t_Construct) Export(892, SteamAPI_RegisterCallResult) Export(893, SteamAPI_RegisterCallback) Export(894, SteamAPI_ReleaseCurrentThreadMemory) Export(895, SteamAPI_RestartAppIfNecessary) Export(896, SteamAPI_RunCallbacks) Export(897, SteamAPI_SetBreakpadAppID) Export(898, SteamAPI_SetMiniDumpComment) Export(899, SteamAPI_SetTryCatchCallbacks)\nExport(900, SteamAPI_Shutdown) Export(901, SteamAPI_SteamAppList_v001) Export(902, SteamAPI_SteamApps_v008) Export(903, SteamAPI_SteamController_v008) Export(904, SteamAPI_SteamDatagramHostedAddress_Clear) Export(905, SteamAPI_SteamDatagramHostedAddress_GetPopID) Export(906, SteamAPI_SteamDatagramHostedAddress_SetDevAddress) Export(907, SteamAPI_SteamFriends_v017) Export(908, SteamAPI_SteamGameSearch_v001) Export(909, SteamAPI_SteamGameServerApps_v008) Export(910, SteamAPI_SteamGameServerHTTP_v003) Export(911, SteamAPI_SteamGameServerInventory_v003) Export(912, SteamAPI_SteamGameServerNetworkingMessages_SteamAPI_v002) Export(913, SteamAPI_SteamGameServerNetworkingSockets_SteamAPI_v009) Export(914, SteamAPI_SteamGameServerNetworking_v006) Export(915, SteamAPI_SteamGameServerStats_v001) Export(916, SteamAPI_SteamGameServerUGC_v015) Export(917, SteamAPI_SteamGameServerUtils_v010) Export(918, SteamAPI_SteamGameServer_v013) Export(919, SteamAPI_SteamHTMLSurface_v005) Export(920, SteamAPI_SteamHTTP_v003) Export(921, SteamAPI_SteamIPAddress_t_IsSet) Export(922, SteamAPI_SteamInput_v002) Export(923, SteamAPI_SteamInventory_v003) Export(924, SteamAPI_SteamMatchmakingServers_v002) Export(925, SteamAPI_SteamMatchmaking_v009) Export(926, SteamAPI_SteamMusicRemote_v001) Export(927, SteamAPI_SteamMusic_v001) Export(928, SteamAPI_SteamNetworkingConfigValue_t_SetFloat) Export(929, SteamAPI_SteamNetworkingConfigValue_t_SetInt32) Export(930, SteamAPI_SteamNetworkingConfigValue_t_SetInt64) Export(931, SteamAPI_SteamNetworkingConfigValue_t_SetPtr) Export(932, SteamAPI_SteamNetworkingConfigValue_t_SetString) Export(933, SteamAPI_SteamNetworkingIPAddrRender_c_str) Export(934, SteamAPI_SteamNetworkingIPAddr_Clear) Export(935, SteamAPI_SteamNetworkingIPAddr_GetIPv4) Export(936, SteamAPI_SteamNetworkingIPAddr_IsEqualTo) Export(937, SteamAPI_SteamNetworkingIPAddr_IsIPv4) Export(938, SteamAPI_SteamNetworkingIPAddr_IsIPv6AllZeros) Export(939, SteamAPI_SteamNetworkingIPAddr_IsLocalHost) Export(940, SteamAPI_SteamNetworkingIPAddr_ParseString) Export(941, SteamAPI_SteamNetworkingIPAddr_SetIPv4) Export(942, SteamAPI_SteamNetworkingIPAddr_SetIPv6) Export(943, SteamAPI_SteamNetworkingIPAddr_SetIPv6LocalHost) Export(944, SteamAPI_SteamNetworkingIPAddr_ToString) Export(945, SteamAPI_SteamNetworkingIdentityRender_c_str) Export(946, SteamAPI_SteamNetworkingIdentity_Clear) Export(947, SteamAPI_SteamNetworkingIdentity_GetGenericBytes) Export(948, SteamAPI_SteamNetworkingIdentity_GetGenericString) Export(949, SteamAPI_SteamNetworkingIdentity_GetIPAddr)\nExport(950, SteamAPI_SteamNetworkingIdentity_GetPSNID) Export(951, SteamAPI_SteamNetworkingIdentity_GetStadiaID) Export(952, SteamAPI_SteamNetworkingIdentity_GetSteamID) Export(953, SteamAPI_SteamNetworkingIdentity_GetSteamID64) Export(954, SteamAPI_SteamNetworkingIdentity_GetXboxPairwiseID) Export(955, SteamAPI_SteamNetworkingIdentity_IsEqualTo) Export(956, SteamAPI_SteamNetworkingIdentity_IsInvalid) Export(957, SteamAPI_SteamNetworkingIdentity_IsLocalHost) Export(958, SteamAPI_SteamNetworkingIdentity_ParseString) Export(959, SteamAPI_SteamNetworkingIdentity_SetGenericBytes) Export(960, SteamAPI_SteamNetworkingIdentity_SetGenericString) Export(961, SteamAPI_SteamNetworkingIdentity_SetIPAddr) Export(962, SteamAPI_SteamNetworkingIdentity_SetLocalHost) Export(963, SteamAPI_SteamNetworkingIdentity_SetPSNID) Export(964, SteamAPI_SteamNetworkingIdentity_SetStadiaID) Export(965, SteamAPI_SteamNetworkingIdentity_SetSteamID) Export(966, SteamAPI_SteamNetworkingIdentity_SetSteamID64) Export(967, SteamAPI_SteamNetworkingIdentity_SetXboxPairwiseID) Export(968, SteamAPI_SteamNetworkingIdentity_ToString) Export(969, SteamAPI_SteamNetworkingMessage_t_Release) Export(970, SteamAPI_SteamNetworkingMessages_SteamAPI_v002) Export(971, SteamAPI_SteamNetworkingPOPIDRender_c_str) Export(972, SteamAPI_SteamNetworkingSockets_SteamAPI_v009) Export(973, SteamAPI_SteamNetworkingUtils_SteamAPI_v003) Export(974, SteamAPI_SteamNetworking_v006) Export(975, SteamAPI_SteamParentalSettings_v001) Export(976, SteamAPI_SteamParties_v002) Export(977, SteamAPI_SteamRemotePlay_v001) Export(978, SteamAPI_SteamRemoteStorage_v014) Export(979, SteamAPI_SteamScreenshots_v003) Export(980, SteamAPI_SteamUGC_v015) Export(981, SteamAPI_SteamUserStats_v012) Export(982, SteamAPI_SteamUser_v021) Export(983, SteamAPI_SteamUtils_v010) Export(984, SteamAPI_SteamVideo_v002) Export(985, SteamAPI_UnregisterCallResult) Export(986, SteamAPI_UnregisterCallback) Export(987, SteamAPI_UseBreakpadCrashHandler) Export(988, SteamAPI_WriteMiniDump) Export(989, SteamAPI_gameserveritem_t_Construct) Export(990, SteamAPI_gameserveritem_t_GetName) Export(991, SteamAPI_gameserveritem_t_SetName) Export(992, SteamAPI_servernetadr_t_Assign) Export(993, SteamAPI_servernetadr_t_Construct) Export(994, SteamAPI_servernetadr_t_GetConnectionAddressString) Export(995, SteamAPI_servernetadr_t_GetConnectionPort) Export(996, SteamAPI_servernetadr_t_GetIP) Export(997, SteamAPI_servernetadr_t_GetQueryAddressString) Export(998, SteamAPI_servernetadr_t_GetQueryPort) Export(999, SteamAPI_servernetadr_t_Init)\nExport(1000, SteamAPI_servernetadr_t_IsLessThan) Export(1001, SteamAPI_servernetadr_t_SetConnectionPort) Export(1002, SteamAPI_servernetadr_t_SetIP) Export(1003, SteamAPI_servernetadr_t_SetQueryPort) Export(1004, SteamClient) Export(1005, SteamGameServer_BSecure) Export(1006, SteamGameServer_GetHSteamPipe) Export(1007, SteamGameServer_GetHSteamUser) Export(1008, SteamGameServer_GetIPCCallCount) Export(1009, SteamGameServer_GetSteamID) Export(1010, SteamGameServer_InitSafe) Export(1011, SteamGameServer_RunCallbacks) Export(1012, SteamGameServer_Shutdown) Export(1013, SteamInternal_ContextInit) Export(1014, SteamInternal_CreateInterface) Export(1015, SteamInternal_FindOrCreateGameServerInterface) Export(1016, SteamInternal_FindOrCreateUserInterface) Export(1017, SteamInternal_GameServer_Init) Export(1018, g_pSteamClientGameServer)\n#else\n// steam_api\nExport(0, GetHSteamPipe) Export(1, GetHSteamUser) Export(2, SteamAPI_GetHSteamPipe) Export(3, SteamAPI_GetHSteamUser) Export(4, SteamAPI_GetSteamInstallPath) Export(5, SteamAPI_Init) Export(6, SteamAPI_InitSafe) Export(7, SteamAPI_IsSteamRunning) Export(8, SteamAPI_RegisterCallResult) Export(9, SteamAPI_RegisterCallback) Export(10, SteamAPI_RestartAppIfNecessary) Export(11, SteamAPI_RunCallbacks) Export(12, SteamAPI_SetBreakpadAppID) Export(13, SteamAPI_SetMiniDumpComment) Export(14, SteamAPI_SetTryCatchCallbacks) Export(15, SteamAPI_Shutdown) Export(16, SteamAPI_UnregisterCallResult) Export(17, SteamAPI_UnregisterCallback) Export(18, SteamAPI_UseBreakpadCrashHandler) Export(19, SteamAPI_WriteMiniDump) Export(20, SteamApps) Export(21, SteamClient) Export(22, SteamContentServer) Export(23, SteamContentServerUtils) Export(24, SteamContentServer_Init) Export(25, SteamContentServer_RunCallbacks) Export(26, SteamContentServer_Shutdown) Export(27, SteamFriends) Export(28, SteamGameServer) Export(29, SteamGameServerApps) Export(30, SteamGameServerHTTP) Export(31, SteamGameServerNetworking) Export(32, SteamGameServerStats) Export(33, SteamGameServerUtils) Export(34, SteamGameServer_BSecure) Export(35, SteamGameServer_GetHSteamPipe) Export(36, SteamGameServer_GetHSteamUser) Export(37, SteamGameServer_GetIPCCallCount) Export(38, SteamGameServer_GetSteamID) Export(39, SteamGameServer_Init) Export(40, SteamGameServer_InitSafe) Export(41, SteamGameServer_RunCallbacks) Export(42, SteamGameServer_Shutdown) Export(43, SteamHTTP) Export(44, SteamMatchmaking) Export(45, SteamMatchmakingServers) Export(46, SteamNetworking) Export(47, SteamRemoteStorage) Export(48, SteamScreenshots) Export(49, SteamUser)\nExport(50, SteamUserStats) Export(51, SteamUtils) Export(52, Steam_GetHSteamUserCurrent) Export(53, Steam_RegisterInterfaceFuncs) Export(54, Steam_RunCallbacks) Export(55, g_pSteamClientGameServer)\n#endif\n\n// opengl32\nExport(0, GlmfBeginGlsBlock) Export(1, GlmfCloseMetaFile) Export(2, GlmfEndGlsBlock) Export(3, GlmfEndPlayback) Export(4, GlmfInitPlayback) Export(5, GlmfPlayGlsRecord) Export(6, glAccum) Export(7, glAlphaFunc) Export(8, glAreTexturesResident) Export(9, glArrayElement) Export(10, glBegin) Export(11, glBindTexture) Export(12, glBitmap) Export(13, glBlendFunc) Export(14, glCallList) Export(15, glCallLists) Export(16, glClear) Export(17, glClearAccum) Export(18, glClearColor) Export(19, glClearDepth) Export(20, glClearIndex) Export(21, glClearStencil) Export(22, glClipPlane) Export(23, glColor3b) Export(24, glColor3bv) Export(25, glColor3d) Export(26, glColor3dv) Export(27, glColor3f) Export(28, glColor3fv) Export(29, glColor3i) Export(30, glColor3iv) Export(31, glColor3s) Export(32, glColor3sv) Export(33, glColor3ub) Export(34, glColor3ubv) Export(35, glColor3ui) Export(36, glColor3uiv) Export(37, glColor3us) Export(38, glColor3usv) Export(39, glColor4b) Export(40, glColor4bv) Export(41, glColor4d) Export(42, glColor4dv) Export(43, glColor4f) Export(44, glColor4fv) Export(45, glColor4i) Export(46, glColor4iv) Export(47, glColor4s) Export(48, glColor4sv) Export(49, glColor4ub)\nExport(50, glColor4ubv) Export(51, glColor4ui) Export(52, glColor4uiv) Export(53, glColor4us) Export(54, glColor4usv) Export(55, glColorMask) Export(56, glColorMaterial) Export(57, glColorPointer) Export(58, glCopyPixels) Export(59, glCopyTexImage1D) Export(60, glCopyTexImage2D) Export(61, glCopyTexSubImage1D) Export(62, glCopyTexSubImage2D) Export(63, glCullFace) Export(64, glDebugEntry) Export(65, glDeleteLists) Export(66, glDeleteTextures) Export(67, glDepthFunc) Export(68, glDepthMask) Export(69, glDepthRange) Export(70, glDisable) Export(71, glDisableClientState) Export(72, glDrawArrays) Export(73, glDrawBuffer) Export(74, glDrawElements) Export(75, glDrawPixels) Export(76, glEdgeFlag) Export(77, glEdgeFlagPointer) Export(78, glEdgeFlagv) Export(79, glEnable) Export(80, glEnableClientState) Export(81, glEnd) Export(82, glEndList) Export(83, glEvalCoord1d) Export(84, glEvalCoord1dv) Export(85, glEvalCoord1f) Export(86, glEvalCoord1fv) Export(87, glEvalCoord2d) Export(88, glEvalCoord2dv) Export(89, glEvalCoord2f) Export(90, glEvalCoord2fv) Export(91, glEvalMesh1) Export(92, glEvalMesh2) Export(93, glEvalPoint1) Export(94, glEvalPoint2) Export(95, glFeedbackBuffer) Export(96, glFinish) Export(97, glFlush) Export(98, glFogf) Export(99, glFogfv)\nExport(100, glFogi) Export(101, glFogiv) Export(102, glFrontFace) Export(103, glFrustum) Export(104, glGenLists) Export(105, glGenTextures) Export(106, glGetBooleanv) Export(107, glGetClipPlane) Export(108, glGetDoublev) Export(109, glGetError) Export(110, glGetFloatv) Export(111, glGetIntegerv) Export(112, glGetLightfv) Export(113, glGetLightiv) Export(114, glGetMapdv) Export(115, glGetMapfv) Export(116, glGetMapiv) Export(117, glGetMaterialfv) Export(118, glGetMaterialiv) Export(119, glGetPixelMapfv) Export(120, glGetPixelMapuiv) Export(121, glGetPixelMapusv) Export(122, glGetPointerv) Export(123, glGetPolygonStipple) Export(124, glGetString) Export(125, glGetTexEnvfv) Export(126, glGetTexEnviv) Export(127, glGetTexGendv) Export(128, glGetTexGenfv) Export(129, glGetTexGeniv) Export(130, glGetTexImage) Export(131, glGetTexLevelParameterfv) Export(132, glGetTexLevelParameteriv) Export(133, glGetTexParameterfv) Export(134, glGetTexParameteriv) Export(135, glHint) Export(136, glIndexMask) Export(137, glIndexPointer) Export(138, glIndexd) Export(139, glIndexdv) Export(140, glIndexf) Export(141, glIndexfv) Export(142, glIndexi) Export(143, glIndexiv) Export(144, glIndexs) Export(145, glIndexsv) Export(146, glIndexub) Export(147, glIndexubv) Export(148, glInitNames) Export(149, glInterleavedArrays)\nExport(150, glIsEnabled) Export(151, glIsList) Export(152, glIsTexture) Export(153, glLightModelf) Export(154, glLightModelfv) Export(155, glLightModeli) Export(156, glLightModeliv) Export(157, glLightf) Export(158, glLightfv) Export(159, glLighti) Export(160, glLightiv) Export(161, glLineStipple) Export(162, glLineWidth) Export(163, glListBase) Export(164, glLoadIdentity) Export(165, glLoadMatrixd) Export(166, glLoadMatrixf) Export(167, glLoadName) Export(168, glLogicOp) Export(169, glMap1d) Export(170, glMap1f) Export(171, glMap2d) Export(172, glMap2f) Export(173, glMapGrid1d) Export(174, glMapGrid1f) Export(175, glMapGrid2d) Export(176, glMapGrid2f) Export(177, glMaterialf) Export(178, glMaterialfv) Export(179, glMateriali) Export(180, glMaterialiv) Export(181, glMatrixMode) Export(182, glMultMatrixd) Export(183, glMultMatrixf) Export(184, glNewList) Export(185, glNormal3b) Export(186, glNormal3bv) Export(187, glNormal3d) Export(188, glNormal3dv) Export(189, glNormal3f) Export(190, glNormal3fv) Export(191, glNormal3i) Export(192, glNormal3iv) Export(193, glNormal3s) Export(194, glNormal3sv) Export(195, glNormalPointer) Export(196, glOrtho) Export(197, glPassThrough) Export(198, glPixelMapfv) Export(199, glPixelMapuiv)\nExport(200, glPixelMapusv) Export(201, glPixelStoref) Export(202, glPixelStorei) Export(203, glPixelTransferf) Export(204, glPixelTransferi) Export(205, glPixelZoom) Export(206, glPointSize) Export(207, glPolygonMode) Export(208, glPolygonOffset) Export(209, glPolygonStipple) Export(210, glPopAttrib) Export(211, glPopClientAttrib) Export(212, glPopMatrix) Export(213, glPopName) Export(214, glPrioritizeTextures) Export(215, glPushAttrib) Export(216, glPushClientAttrib) Export(217, glPushMatrix) Export(218, glPushName) Export(219, glRasterPos2d) Export(220, glRasterPos2dv) Export(221, glRasterPos2f) Export(222, glRasterPos2fv) Export(223, glRasterPos2i) Export(224, glRasterPos2iv) Export(225, glRasterPos2s) Export(226, glRasterPos2sv) Export(227, glRasterPos3d) Export(228, glRasterPos3dv) Export(229, glRasterPos3f) Export(230, glRasterPos3fv) Export(231, glRasterPos3i) Export(232, glRasterPos3iv) Export(233, glRasterPos3s) Export(234, glRasterPos3sv) Export(235, glRasterPos4d) Export(236, glRasterPos4dv) Export(237, glRasterPos4f) Export(238, glRasterPos4fv) Export(239, glRasterPos4i) Export(240, glRasterPos4iv) Export(241, glRasterPos4s) Export(242, glRasterPos4sv) Export(243, glReadBuffer) Export(244, glReadPixels) Export(245, glRectd) Export(246, glRectdv) Export(247, glRectf) Export(248, glRectfv) Export(249, glRecti)\nExport(250, glRectiv) Export(251, glRects) Export(252, glRectsv) Export(253, glRenderMode) Export(254, glRotated) Export(255, glRotatef) Export(256, glScaled) Export(257, glScalef) Export(258, glScissor) Export(259, glSelectBuffer) Export(260, glShadeModel) Export(261, glStencilFunc) Export(262, glStencilMask) Export(263, glStencilOp) Export(264, glTexCoord1d) Export(265, glTexCoord1dv) Export(266, glTexCoord1f) Export(267, glTexCoord1fv) Export(268, glTexCoord1i) Export(269, glTexCoord1iv) Export(270, glTexCoord1s) Export(271, glTexCoord1sv) Export(272, glTexCoord2d) Export(273, glTexCoord2dv) Export(274, glTexCoord2f) Export(275, glTexCoord2fv) Export(276, glTexCoord2i) Export(277, glTexCoord2iv) Export(278, glTexCoord2s) Export(279, glTexCoord2sv) Export(280, glTexCoord3d) Export(281, glTexCoord3dv) Export(282, glTexCoord3f) Export(283, glTexCoord3fv) Export(284, glTexCoord3i) Export(285, glTexCoord3iv) Export(286, glTexCoord3s) Export(287, glTexCoord3sv) Export(288, glTexCoord4d) Export(289, glTexCoord4dv) Export(290, glTexCoord4f) Export(291, glTexCoord4fv) Export(292, glTexCoord4i) Export(293, glTexCoord4iv) Export(294, glTexCoord4s) Export(295, glTexCoord4sv) Export(296, glTexCoordPointer) Export(297, glTexEnvf) Export(298, glTexEnvfv) Export(299, glTexEnvi)\nExport(300, glTexEnviv) Export(301, glTexGend) Export(302, glTexGendv) Export(303, glTexGenf) Export(304, glTexGenfv) Export(305, glTexGeni) Export(306, glTexGeniv) Export(307, glTexImage1D) Export(308, glTexImage2D) Export(309, glTexParameterf) Export(310, glTexParameterfv) Export(311, glTexParameteri) Export(312, glTexParameteriv) Export(313, glTexSubImage1D) Export(314, glTexSubImage2D) Export(315, glTranslated) Export(316, glTranslatef) Export(317, glVertex2d) Export(318, glVertex2dv) Export(319, glVertex2f) Export(320, glVertex2fv) Export(321, glVertex2i) Export(322, glVertex2iv) Export(323, glVertex2s) Export(324, glVertex2sv) Export(325, glVertex3d) Export(326, glVertex3dv) Export(327, glVertex3f) Export(328, glVertex3fv) Export(329, glVertex3i) Export(330, glVertex3iv) Export(331, glVertex3s) Export(332, glVertex3sv) Export(333, glVertex4d) Export(334, glVertex4dv) Export(335, glVertex4f) Export(336, glVertex4fv) Export(337, glVertex4i) Export(338, glVertex4iv) Export(339, glVertex4s) Export(340, glVertex4sv) Export(341, glVertexPointer) Export(342, glViewport) Export(343, wglChoosePixelFormat) Export(344, wglCopyContext) Export(345, wglCreateContext) Export(346, wglCreateLayerContext) Export(347, wglDeleteContext) Export(348, wglDescribeLayerPlane) Export(349, wglDescribePixelFormat)\nExport(350, wglGetCurrentContext) Export(351, wglGetCurrentDC) Export(352, wglGetDefaultProcAddress) Export(353, wglGetLayerPaletteEntries) Export(354, wglGetPixelFormat) Export(355, wglGetProcAddress) Export(356, wglMakeCurrent) Export(357, wglRealizeLayerPalette) Export(358, wglSetLayerPaletteEntries) Export(359, wglSetPixelFormat) Export(360, wglShareLists) Export(361, wglSwapBuffers) Export(362, wglSwapLayerBuffers) Export(363, wglSwapMultipleBuffers) Export(364, wglUseFontBitmapsA) Export(365, wglUseFontBitmapsW) Export(366, wglUseFontOutlinesA) Export(367, wglUseFontOutlinesW)\n\n// winhttp\nExport(0, WinHttpPacJsWorkerMain) Export(1, WinHttpSetSecureLegacyServersAppCompat) Export(2, DllCanUnloadNow) Export(3, DllGetClassObject) Export(4, Private1) Export(5, SvchostPushServiceGlobals) Export(6, WinHttpAddRequestHeaders) Export(7, WinHttpAddRequestHeadersEx) Export(8, WinHttpAutoProxySvcMain) Export(9, WinHttpCheckPlatform) Export(10, WinHttpCloseHandle) Export(11, WinHttpConnect) Export(12, WinHttpConnectionDeletePolicyEntries) Export(13, WinHttpConnectionDeleteProxyInfo) Export(14, WinHttpConnectionFreeNameList) Export(15, WinHttpConnectionFreeProxyInfo) Export(16, WinHttpConnectionFreeProxyList) Export(17, WinHttpConnectionGetNameList) Export(18, WinHttpConnectionGetProxyInfo) Export(19, WinHttpConnectionGetProxyList) Export(20, WinHttpConnectionSetPolicyEntries) Export(21, WinHttpConnectionSetProxyInfo) Export(22, WinHttpConnectionUpdateIfIndexTable) Export(23, WinHttpCrackUrl) Export(24, WinHttpCreateProxyResolver) Export(25, WinHttpCreateUrl) Export(26, WinHttpDetectAutoProxyConfigUrl) Export(27, WinHttpFreeProxyResult) Export(28, WinHttpFreeProxyResultEx) Export(29, WinHttpFreeProxySettings) Export(30, WinHttpGetDefaultProxyConfiguration) Export(31, WinHttpGetIEProxyConfigForCurrentUser) Export(32, WinHttpGetProxyForUrl) Export(33, WinHttpGetProxyForUrlEx) Export(34, WinHttpGetProxyForUrlEx2) Export(35, WinHttpGetProxyForUrlHvsi) Export(36, WinHttpGetProxyResult) Export(37, WinHttpGetProxyResultEx) Export(38, WinHttpGetProxySettingsVersion) Export(39, WinHttpGetTunnelSocket) Export(40, WinHttpOpen) Export(41, WinHttpOpenRequest) Export(42, WinHttpProbeConnectivity) Export(43, WinHttpQueryAuthSchemes) Export(44, WinHttpQueryDataAvailable) Export(45, WinHttpQueryHeaders) Export(46, WinHttpQueryOption) Export(47, WinHttpReadData) Export(48, WinHttpReadProxySettings) Export(49, WinHttpReadProxySettingsHvsi)\nExport(50, WinHttpReceiveResponse) Export(51, WinHttpResetAutoProxy) Export(52, WinHttpSaveProxyCredentials) Export(53, WinHttpSendRequest) Export(54, WinHttpSetCredentials) Export(55, WinHttpSetDefaultProxyConfiguration) Export(56, WinHttpSetOption) Export(57, WinHttpSetProxySettingsPerUser) Export(58, WinHttpSetStatusCallback) Export(59, WinHttpSetTimeouts) Export(60, WinHttpTimeFromSystemTime) Export(61, WinHttpTimeToSystemTime) Export(62, WinHttpWebSocketClose) Export(63, WinHttpWebSocketCompleteUpgrade) Export(64, WinHttpWebSocketQueryCloseStatus) Export(65, WinHttpWebSocketReceive) Export(66, WinHttpWebSocketSend) Export(67, WinHttpWebSocketShutdown) Export(68, WinHttpWriteData) Export(69, WinHttpWriteProxySettings)\n\n// bink2w64\nExport(0, BinkAllocateFrameBuffers) Export(1, BinkClose) Export(2, BinkCloseTrack) Export(3, BinkControlBackgroundIO) Export(4, BinkCopyToBuffer) Export(5, BinkCopyToBufferRect) Export(6, BinkDoFrame) Export(7, BinkDoFrameAsync) Export(8, BinkDoFrameAsyncMulti) Export(9, BinkDoFrameAsyncWait) Export(10, BinkDoFramePlane) Export(11, BinkFindXAudio2WinDevice) Export(12, BinkFreeGlobals) Export(13, BinkGetError) Export(14, BinkGetFrameBuffersInfo) Export(15, BinkGetGPUDataBuffersInfo) Export(16, BinkGetKeyFrame) Export(17, BinkGetPlatformInfo) Export(18, BinkGetRealtime) Export(19, BinkGetRects) Export(20, BinkGetSummary) Export(21, BinkGetTrackData) Export(22, BinkGetTrackID) Export(23, BinkGetTrackMaxSize) Export(24, BinkGetTrackType) Export(25, BinkGoto) Export(26, BinkLogoAddress) Export(27, BinkNextFrame) Export(28, BinkOpen) Export(29, BinkOpenDirectSound) Export(30, BinkOpenTrack) Export(31, BinkOpenWaveOut) Export(32, BinkOpenWithOptions) Export(33, BinkOpenXAudio2) Export(34, BinkOpenXAudio27) Export(35, BinkOpenXAudio28) Export(36, BinkOpenXAudio29) Export(37, BinkPause) Export(38, BinkRegisterFrameBuffers) Export(39, BinkRegisterGPUDataBuffers) Export(40, BinkRequestStopAsyncThread) Export(41, BinkRequestStopAsyncThreadsMulti) Export(42, BinkService) Export(43, BinkSetError) Export(44, BinkSetFileOffset) Export(45, BinkSetFrameRate) Export(46, BinkSetIO) Export(47, BinkSetIOSize) Export(48, BinkSetMemory) Export(49, BinkSetOSFileCallbacks)\nExport(50, BinkSetPan) Export(51, BinkSetSimulate) Export(52, BinkSetSoundOnOff) Export(53, BinkSetSoundSystem) Export(54, BinkSetSoundSystem2) Export(55, BinkSetSoundTrack) Export(56, BinkSetSpeakerVolumes) Export(57, BinkSetVideoOnOff) Export(58, BinkSetVolume) Export(59, BinkSetWillLoop) Export(60, BinkShouldSkip) Export(61, BinkStartAsyncThread) Export(62, BinkUtilCPUs) Export(63, BinkUtilFree) Export(64, BinkUtilMalloc) Export(65, BinkUtilMutexCreate) Export(66, BinkUtilMutexDestroy) Export(67, BinkUtilMutexLock) Export(68, BinkUtilMutexLockTimeOut) Export(69, BinkUtilMutexUnlock) Export(70, BinkUtilSoundGlobalLock) Export(71, BinkUtilSoundGlobalUnlock) Export(72, BinkWait) Export(73, BinkWaitStopAsyncThread) Export(74, BinkWaitStopAsyncThreadsMulti) Export(75, RADTimerRead)\n"
  },
  {
    "path": "include/nmd_assembly.h",
    "content": "/* This is a platform independent C89 x86 assembler and disassembler library.\n\nFeatures:\n - Support for x86(16/32/64). Intel and AT&T syntax.\n - No libc, dynamic memory allocation, static/global variables/state/context or runtime initialization.\n - Thread-safe by design.\n - No header files need to be included.\n\nSetup:\nDefine the 'NMD_ASSEMBLY_IMPLEMENTATION' macro in one source file before the include statement to instantiate the implementation.\n#define NMD_ASSEMBLY_IMPLEMENTATION\n#include \"nmd_assembly.h\"\n\nInterfaces(i.e the functions you call from your application):\n - The assembler is implemented by the following function:\n    Assembles an instruction from a string. Returns the number of bytes written to the buffer on success, zero otherwise. Instructions can be separated using the '\\n'(new line) character.\n    Parameters:\n     - string          [in]         A pointer to a string that represents one or more instructions in assembly language.\n     - buffer          [out]        A pointer to a buffer that receives the encoded instructions.\n     - buffer_size     [in]         The size of the buffer in bytes.\n     - runtime_address [in]         The instruction's runtime address. You may use 'NMD_X86_INVALID_RUNTIME_ADDRESS'.\n     - mode            [in]         The architecture mode. 'NMD_X86_MODE_32', 'NMD_X86_MODE_64' or 'NMD_X86_MODE_16'.\n     - count           [in/out/opt] A pointer to a variable that on input is the maximum number of instructions that can be parsed(or zero for unlimited instructions), and on output is the number of instructions parsed. This parameter may be zero.\n    size_t nmd_x86_assemble(const char* string, void* buffer, size_t buffer_size, uint64_t runtime_address, NMD_X86_MODE mode, size_t* const count);\n\n - The disassembler is composed of a decoder and a formatter implemented by these two functions respectively:\n\t- Decodes an instruction. Returns true if the instruction is valid, false otherwise.\n      Parameters:\n       - buffer      [in]  A pointer to a buffer containing an encoded instruction.\n       - buffer_size [in]  The size of the buffer in bytes.\n       - instruction [out] A pointer to a variable of type 'nmd_x86_instruction' that receives information about the instruction.\n       - mode        [in]  The architecture mode. 'NMD_X86_MODE_32', 'NMD_X86_MODE_64' or 'NMD_X86_MODE_16'.\n       - flags       [in]  A mask of 'NMD_X86_DECODER_FLAGS_XXX' that specifies which features the decoder is allowed to use. If uncertain, use 'NMD_X86_DECODER_FLAGS_MINIMAL'.\n      bool nmd_x86_decode(const void* buffer, size_t buffer_size, nmd_x86_instruction* instruction, NMD_X86_MODE mode, uint32_t flags);\n\n    - Formats an instruction. This function may access invalid memory(thus causing a crash) if you modify 'instruction' manually.\n      Parameters:\n       - instruction     [in]  A pointer to a variable of type 'nmd_x86_instruction' describing the instruction to be formatted.\n       - buffer          [out] A pointer to buffer that receives the string. The buffer's recommended size is 128 bytes.\n       - runtime_address [in]  The instruction's runtime address. You may use 'NMD_X86_INVALID_RUNTIME_ADDRESS'.\n       - flags           [in]  A mask of 'NMD_X86_FORMAT_FLAGS_XXX' that specifies how the function should format the instruction. If uncertain, use 'NMD_X86_FORMAT_FLAGS_DEFAULT'.\n      void nmd_x86_format(const nmd_x86_instruction* instruction, char buffer[], uint64_t runtime_address, uint32_t flags);\n\n - The length disassembler is implemented by the following function:\n    Returns the length of the instruction if it is valid, zero otherwise.\n    Parameters:\n     - buffer      [in] A pointer to a buffer containing an encoded instruction.\n     - buffer_size [in] The size of the buffer in bytes.\n     - mode        [in] The architecture mode. 'NMD_X86_MODE_32', 'NMD_X86_MODE_64' or 'NMD_X86_MODE_16'.\n    size_t nmd_x86_ldisasm(const void* buffer, size_t buffer_size, NMD_X86_MODE mode);\n\nEnabling and disabling features of the decoder at compile-time:\nTo dynamically choose which features are used by the decoder, use the 'flags' parameter of nmd_x86_decode(). The less features specified in the mask, the\nfaster the decoder runs. By default all features are available, some can be completely disabled at compile time(thus reducing code size and increasing code speed) by defining\nthe following macros:\n - 'NMD_ASSEMBLY_DISABLE_DECODER_VALIDITY_CHECK': the decoder does not check if the instruction is invalid.\n - 'NMD_ASSEMBLY_DISABLE_DECODER_INSTRUCTION_ID': the decoder does not fill the 'id' variable.\n - 'NMD_ASSEMBLY_DISABLE_DECODER_CPU_FLAGS': the decoder does not fill the variables related to cpu fags.\n - 'NMD_ASSEMBLY_DISABLE_DECODER_OPERANDS': the decoder does not fill the 'num_operands' and 'operands' variable.\n - 'NMD_ASSEMBLY_DISABLE_DECODER_GROUP': the decoder does not fill the 'group' variable.\n - 'NMD_ASSEMBLY_DISABLE_DECODER_VEX': the decoder does not support VEX instructions.\n - 'NMD_ASSEMBLY_DISABLE_DECODER_EVEX': the decoder does not support EVEX instructions.\n - 'NMD_ASSEMBLY_DISABLE_DECODER_3DNOW': the decoder does not support 3DNow! instructions.\n\nEnabling and disabling features of the formatter at compile-time:\nTo dynamically choose which features are used by the formatter, use the 'flags' parameter of nmd_x86_format(). The less features specified in the mask, the\nfaster the function runs. By default all features are available, some can be completely disabled at compile time(thus reducing code size and increasing code speed) by defining\nthe following macros:\n - 'NMD_ASSEMBLY_DISABLE_FORMATTER_POINTER_SIZE': the formatter does not support pointer size.\n - 'NMD_ASSEMBLY_DISABLE_FORMATTER_BYTES: the formatter does not support instruction bytes. You may define the 'NMD_X86_FORMATTER_NUM_PADDING_BYTES' macro to be the number of bytes used as space padding.\n - 'NMD_ASSEMBLY_DISABLE_FORMATTER_ATT_SYNTAX: the formatter does not support AT&T syntax.\n - 'NMD_ASSEMBLY_DISABLE_FORMATTER_UPPERCASE: the formatter does not support uppercase.\n - 'NMD_ASSEMBLY_DISABLE_FORMATTER_COMMA_SPACES: the formatter does not support comma spaces.\n - 'NMD_ASSEMBLY_DISABLE_FORMATTER_OPERATOR_SPACES: the formatter does not support operator spaces.\n - 'NMD_ASSEMBLY_DISABLE_FORMATTER_VEX': the formatter does not support VEX instructions.\n - 'NMD_ASSEMBLY_DISABLE_FORMATTER_EVEX': the formatter does not support EVEX instructions.\n - 'NMD_ASSEMBLY_DISABLE_FORMATTER_3DNOW': the formatter does not support 3DNow! instructions.\n\nEnabling and disabling features of the length disassembler at compile-time:\nUse the following macros to disable features at compile-time:\n - 'NMD_ASSEMBLY_DISABLE_LENGTH_DISASSEMBLER_VALIDITY_CHECK': the length disassembler does not check if the instruction is invalid.\n - 'NMD_ASSEMBLY_DISABLE_LENGTH_DISASSEMBLER_VEX': the length disassembler does not support VEX instructions.\n - 'NMD_ASSEMBLY_DISABLE_LENGTH_DISASSEMBLER_3DNOW': the length disassembler does not support 3DNow! instructions.\n\nFixed width integer types:\nBy default the library includes <stdint.h> and <stddef.h> to include int types.\nIf these header-files are not available in your environment you may define the 'NMD_DEFINE_INT_TYPES' macro so the library will define them.\nBy defining the 'NMD_IGNORE_INT_TYPES' macro, the library will neither include nor define int types.\n\nYou may define the 'NMD_ASSEMBLY_PRIVATE' macro to mark all functions as static so that they're not visible to other translation units.\n\nCommon helper functions:\nSome 'nmd' libraries utilize the same functions such as '_nmd_assembly_get_num_digits' and '_nmd_assembly_get_num_digits_hex'.\nAll libraries include the same implementation which internally are defined as '_nmd_[LIBRARY_NAME]_[FUNCTION_NAME]' to avoid name conflits between them.\nWhen the function is called a macro is used in the form '_NMD_FUNCTION_NAME', this allows another function to override the default implementation, so in\nthe case that two 'nmd' libraries need the same function, only one implementation will be used by both libraries. You may also provide your implemetation:\nExample:\nsize_t my_get_num_digits(int x);\n#define _NMD_GET_NUM_DIGITS my_get_num_digits\n\nShared helper functions used by this library:\n - _NMD_GET_NUM_DIGITS()\n - _NMD_GET_NUM_DIGITS_HEX()\n\nConventions:\n - Every identifier uses snake case.\n - Enums and macros are uppercase, every other identifier is lowercase.\n - Non-internal identifiers start with the 'NMD_' prefix.\n - Internal identifiers start with the '_NMD_' prefix.\n\nTODO:\n Short-Term\n  - Implement instruction set extensions to the decoder : VEX, EVEX, MVEX, 3DNOW, XOP.\n  - Implement x86 assembler\n Long-Term\n  - Add support for other architectures(ARM, MIPS and PowerPC ?).\n\nReferences:\n - Intel 64 and IA-32 Architectures. Software Developer's Manual Volume 2 (2A, 2B, 2C & 2D): Instruction Set Reference, A-Z.\n   - Chapter 2 Instruction Format.\n   - Chapter 3-5 Instruction set reference.\n   - Appendix A Opcode Map.\n   - Appendix B.16 Instruction and Formats and Encoding.\n - 3DNow! Technology Manual.\n - AMD Extensions to the 3DNow! and MMX Instruction Sets Manual.\n - Intel Architecture Instruction Set Extensions and Future Features Programming Reference.\n - Capstone Engine.\n - Zydis Disassembler.\n - VIA PadLock Programming Guide.\n - Control registers - Wikipedia.\n\nContributors(This may not be a complete list):\n - Nomade: Founder and maintainer.\n - Darkratos: Bug reporting and feature suggesting.\n*/\n\n#ifndef NMD_ASSEMBLY_H\n#define NMD_ASSEMBLY_H\n\n#ifndef _NMD_DEFINE_INT_TYPES\n #ifdef NMD_DEFINE_INT_TYPES\n  #define _NMD_DEFINE_INT_TYPES\n  #ifndef __cplusplus\n   #define bool  _Bool\n   #define false 0\n   #define true  1\n  #endif /* __cplusplus */\n  typedef signed char        int8_t;\n  typedef unsigned char      uint8_t;\n  typedef signed short       int16_t;\n  typedef unsigned short     uint16_t;\n  typedef signed int         int32_t;\n  typedef unsigned int       uint32_t;\n  typedef signed long long   int64_t;\n  typedef unsigned long long uint64_t;\n  #if defined(_WIN64) && defined(_MSC_VER)\n   typedef unsigned __int64 size_t;\n   typedef __int64          ptrdiff_t;\n  #elif (defined(_WIN32) || defined(WIN32)) && defined(_MSC_VER)\n   typedef unsigned __int32 size_t\n   typedef __int32          ptrdiff_t;\n  #elif defined(__GNUC__) || defined(__clang__)\n   #if defined(__x86_64__) || defined(__ppc64__)\n    typedef unsigned long size_t\n    typedef long          ptrdiff_t\n   #else\n    typedef unsigned int size_t\n    typedef int          ptrdiff_t\n   #endif\n  #else\n   typedef unsigned long size_t\n   typedef long          ptrdiff_t\n  #endif\n  \n #else /* NMD_DEFINE_INT_TYPES */\n  #ifndef NMD_IGNORE_INT_TYPES\n    #include <stdbool.h>\n    #include <stdint.h>\n    #include <stddef.h>\n  #endif /* NMD_IGNORE_INT_TYPES */\n #endif /* NMD_DEFINE_INT_TYPES */\n#endif /* _NMD_DEFINE_INT_TYPES */\n\n#ifndef _NMD_GET_NUM_DIGITS\n#define _NMD_GET_NUM_DIGITS _nmd_assembly_get_num_digits\n#endif /* _NMD_GET_NUM_DIGITS */\n\n#ifndef _NMD_GET_NUM_DIGITS_HEX\n#define _NMD_GET_NUM_DIGITS_HEX _nmd_assembly_get_num_digits_hex\n#endif /* _NMD_GET_NUM_DIGITS_HEX */\n\n#ifndef NMD_X86_FORMATTER_NUM_PADDING_BYTES\n#define NMD_X86_FORMATTER_NUM_PADDING_BYTES 10\n#endif /* NMD_X86_FORMATTER_NUM_PADDING_BYTES */\n\n#define NMD_X86_INVALID_RUNTIME_ADDRESS ((uint64_t)(-1))\n#define NMD_X86_MAXIMUM_INSTRUCTION_LENGTH 15\n#define NMD_X86_MAXIMUM_NUM_OPERANDS 10\n\n/* Define the api macro to potentially change functions's attributes. */\n#ifndef NMD_ASSEMBLY_API\n#ifdef NMD_ASSEMBLY_PRIVATE\n\t#define NMD_ASSEMBLY_API static\n#else\n\t#define NMD_ASSEMBLY_API\n#endif /* NMD_ASSEMBLY_PRIVATE */\n#endif /* NMD_ASSEMBLY_API */\n\n/* These flags specify how the formatter should work. */\nenum NMD_X86_FORMATTER_FLAGS\n{\n\tNMD_X86_FORMAT_FLAGS_HEX                       = (1 << 0),  /* If set, numbers are displayed in hex base, otherwise they are displayed in decimal base. */\n\tNMD_X86_FORMAT_FLAGS_POINTER_SIZE              = (1 << 1),  /* Pointer sizes(e.g. 'dword ptr', 'byte ptr') are displayed. */\n\tNMD_X86_FORMAT_FLAGS_ONLY_SEGMENT_OVERRIDE     = (1 << 2),  /* If set, only segment overrides using prefixes(e.g. '2EH', '64H') are displayed, otherwise a segment is always present before a memory operand. */\n\tNMD_X86_FORMAT_FLAGS_COMMA_SPACES              = (1 << 3),  /* A space is placed after a comma. */\n\tNMD_X86_FORMAT_FLAGS_OPERATOR_SPACES           = (1 << 4),  /* A space is placed before and after the '+' and '-' characters. */\n\tNMD_X86_FORMAT_FLAGS_UPPERCASE                 = (1 << 5),  /* The string is uppercase. */\n\tNMD_X86_FORMAT_FLAGS_0X_PREFIX                 = (1 << 6),  /* Hexadecimal numbers have the '0x'('0X' if uppercase) prefix. */\n\tNMD_X86_FORMAT_FLAGS_H_SUFFIX                  = (1 << 7),  /* Hexadecimal numbers have the 'h'('H' if uppercase') suffix. */\n\tNMD_X86_FORMAT_FLAGS_ENFORCE_HEX_ID            = (1 << 8),  /* If the HEX flag is set and either the prefix or suffix flag is also set, numbers less than 10 are displayed with preffix or suffix. */\n\tNMD_X86_FORMAT_FLAGS_HEX_LOWERCASE             = (1 << 9),  /* If the HEX flag is set and the UPPERCASE flag is not set, hexadecimal numbers are displayed in lowercase. */\n\tNMD_X86_FORMAT_FLAGS_SIGNED_NUMBER_MEMORY_VIEW = (1 << 10), /* If set, signed numbers are displayed as they are represented in memory(e.g. -1 = 0xFFFFFFFF). */\n\tNMD_X86_FORMAT_FLAGS_SIGNED_NUMBER_HINT_HEX    = (1 << 11), /* If set and NMD_X86_FORMAT_FLAGS_SIGNED_NUMBER_MEMORY_VIEW is also set, the number's hexadecimal representation is displayed in parenthesis. */\n\tNMD_X86_FORMAT_FLAGS_SIGNED_NUMBER_HINT_DEC    = (1 << 12), /* Same as NMD_X86_FORMAT_FLAGS_SIGNED_NUMBER_HINT_HEX, but the number is displayed in decimal base. */\n\tNMD_X86_FORMAT_FLAGS_SCALE_ONE                 = (1 << 13), /* If set, scale one is displayed. E.g. add byte ptr [eax+eax*1], al. */\n\tNMD_X86_FORMAT_FLAGS_BYTES                     = (1 << 14), /* The instruction's bytes are displayed before the instructions. */\n\tNMD_X86_FORMAT_FLAGS_ATT_SYNTAX                = (1 << 15), /* AT&T syntax is used instead of Intel's. */\n\n\t/* The formatter's default formatting style. */\n\tNMD_X86_FORMAT_FLAGS_DEFAULT  = (NMD_X86_FORMAT_FLAGS_HEX | NMD_X86_FORMAT_FLAGS_H_SUFFIX | NMD_X86_FORMAT_FLAGS_ONLY_SEGMENT_OVERRIDE | NMD_X86_FORMAT_FLAGS_SIGNED_NUMBER_MEMORY_VIEW | NMD_X86_FORMAT_FLAGS_SIGNED_NUMBER_HINT_DEC),\n};\n\nenum NMD_X86_DECODER_FLAGS\n{\n\tNMD_X86_DECODER_FLAGS_VALIDITY_CHECK = (1 << 0), /* The decoder checks if the instruction is valid. */\n\tNMD_X86_DECODER_FLAGS_INSTRUCTION_ID = (1 << 1), /* The decoder fills the 'id' variable. */\n\tNMD_X86_DECODER_FLAGS_CPU_FLAGS      = (1 << 2), /* The decoder fills the variables related to cpu flags. */\n\tNMD_X86_DECODER_FLAGS_OPERANDS       = (1 << 3), /* The decoder fills the 'num_operands' and 'operands' variable. */\n\tNMD_X86_DECODER_FLAGS_GROUP          = (1 << 4), /* The decoder fills 'group' variable. */\n\tNMD_X86_DECODER_FLAGS_VEX            = (1 << 5), /* The decoder parses VEX instructions. */\n\tNMD_X86_DECODER_FLAGS_EVEX           = (1 << 6), /* The decoder parses EVEX instructions. */\n\tNMD_X86_DECODER_FLAGS_3DNOW          = (1 << 7), /* The decoder parses 3DNow! instructions. */\n\n\t/* These are not actual features, but rather masks of features. */\n\tNMD_X86_DECODER_FLAGS_NONE    = 0,\n\tNMD_X86_DECODER_FLAGS_MINIMAL = (NMD_X86_DECODER_FLAGS_VALIDITY_CHECK | NMD_X86_DECODER_FLAGS_VEX | NMD_X86_DECODER_FLAGS_EVEX), /* Mask that specifies minimal features to provide acurate results in any environment. */\n\tNMD_X86_DECODER_FLAGS_ALL     = (1 << 8) - 1, /* Mask that specifies all features. */\n};\n\nenum NMD_X86_PREFIXES\n{\n\tNMD_X86_PREFIXES_NONE                  = 0,\n\tNMD_X86_PREFIXES_ES_SEGMENT_OVERRIDE   = (1 << 0),\n\tNMD_X86_PREFIXES_CS_SEGMENT_OVERRIDE   = (1 << 1),\n\tNMD_X86_PREFIXES_SS_SEGMENT_OVERRIDE   = (1 << 2),\n\tNMD_X86_PREFIXES_DS_SEGMENT_OVERRIDE   = (1 << 3),\n\tNMD_X86_PREFIXES_FS_SEGMENT_OVERRIDE   = (1 << 4),\n\tNMD_X86_PREFIXES_GS_SEGMENT_OVERRIDE   = (1 << 5),\n\tNMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE = (1 << 6),\n\tNMD_X86_PREFIXES_ADDRESS_SIZE_OVERRIDE = (1 << 7),\n\tNMD_X86_PREFIXES_LOCK                  = (1 << 8),\n\tNMD_X86_PREFIXES_REPEAT_NOT_ZERO       = (1 << 9),\n\tNMD_X86_PREFIXES_REPEAT                = (1 << 10),\n\tNMD_X86_PREFIXES_REX_W                 = (1 << 11),\n\tNMD_X86_PREFIXES_REX_R                 = (1 << 12),\n\tNMD_X86_PREFIXES_REX_X                 = (1 << 13),\n\tNMD_X86_PREFIXES_REX_B                 = (1 << 14)\n};\n\nenum NMD_X86_IMM\n{\n\tNMD_X86_IMM_NONE = 0,\n\tNMD_X86_IMM8     = 1,\n\tNMD_X86_IMM16    = 2,\n\tNMD_X86_IMM32    = 4,\n\tNMD_X86_IMM48    = 6,\n\tNMD_X86_IMM64    = 8,\n\tNMD_X86_IMM_ANY  = (NMD_X86_IMM8 | NMD_X86_IMM16 | NMD_X86_IMM32 | NMD_X86_IMM64)\n};\n\nenum NMD_X86_DISP\n{\n\tNMD_X86_DISP_NONE        = 0,\n\tNMD_X86_DISP8            = 1,\n\tNMD_X86_DISP16           = 2,\n\tNMD_X86_DISP32           = 4,\n\tNMD_X86_DISP64           = 8,\n\tNMD_X86_DISP_ANY         = (NMD_X86_DISP8 | NMD_X86_DISP16 | NMD_X86_DISP32)\n};\n\ntypedef union nmd_x86_modrm\n{\n\tstruct\n\t{\n\t\tuint8_t rm  : 3;\n\t\tuint8_t reg : 3;\n\t\tuint8_t mod : 2;\n\t} fields;\n\tuint8_t modrm;\n} nmd_x86_modrm;\n\ntypedef union nmd_x86_sib\n{\n\tstruct\n\t{\n\t\tuint8_t base  : 3;\n\t\tuint8_t index : 3;\n\t\tuint8_t scale : 2;\n\t} fields;\n\tuint8_t sib;\n} nmd_x86_sib;\n\ntypedef enum NMD_X86_MODE\n{\n\tNMD_X86_MODE_NONE = 0, /* Invalid mode. */\n\tNMD_X86_MODE_16   = 2,\n\tNMD_X86_MODE_32   = 4,\n\tNMD_X86_MODE_64   = 8,\n} NMD_X86_MODE;\n\nenum NMD_X86_OPCODE_MAP\n{\n\tNMD_X86_OPCODE_MAP_NONE = 0,\n\tNMD_X86_OPCODE_MAP_DEFAULT,\n\tNMD_X86_OPCODE_MAP_0F,\n\tNMD_X86_OPCODE_MAP_0F38,\n\tNMD_X86_OPCODE_MAP_0F3A,\n\tNMD_X86_OPCODE_MAP_0F0F\n};\n\nenum NMD_X86_ENCODING\n{\n\tNMD_X86_ENCODING_NONE = 0,\n\tNMD_X86_ENCODING_LEGACY,  /* Legacy encoding. */\n\tNMD_X86_ENCODING_VEX,     /* Intel's VEX(vector extensions) coding scheme. */\n\tNMD_X86_ENCODING_EVEX,    /* Intel's EVEX(Enhanced vector extension) coding scheme. */\n\tNMD_X86_ENCODING_3DNOW,   /* AMD's 3DNow! extension. */\n\tNMD_X86_ENCODING_XOP,     /* AMD's XOP(eXtended Operations) instruction set. */\n\t/* NMD_X86_ENCODING_MVEX,    MVEX used by Intel's \"Xeon Phi\" ISA. */\n};\n\ntypedef struct nmd_x86_vex\n{\n\tbool R : 1;\n\tbool X : 1;\n\tbool B : 1;\n\tbool L : 1;\n\tbool W : 1;\n\tuint8_t pp : 2;\n\tuint8_t m_mmmm : 5;\n\tuint8_t vvvv : 4;\n\tuint8_t vex[3]; /* The full vex prefix. vex[0] is either C4h(3-byte VEX) or C5h(2-byte VEX).*/\n} nmd_x86_vex;\n\nenum NMD_GROUP\n{\n\tNMD_GROUP_NONE                 = 0, /* The instruction is not part of any group. */\n\n\tNMD_GROUP_JUMP                 = (1 << 0), /* All jump instructions. */\n\tNMD_GROUP_CALL                 = (1 << 1), /* Call instruction. */\n\tNMD_GROUP_RET                  = (1 << 2), /* Return instruction. */\n\tNMD_GROUP_INT                  = (1 << 3), /* Interrupt instruction. */\n\tNMD_GROUP_PRIVILEGE            = (1 << 4), /* Privileged instruction. */\n\tNMD_GROUP_CONDITIONAL_BRANCH   = (1 << 5), /* Conditional branch instruction. */\n\tNMD_GROUP_UNCONDITIONAL_BRANCH = (1 << 6), /* Unconditional branch instruction. */\n\tNMD_GROUP_RELATIVE_ADDRESSING  = (1 << 7), /* Relative addressing instruction. */\n\n\t/* These are not actual groups, but rather masks of groups. */\n\tNMD_GROUP_BRANCH = (NMD_GROUP_CONDITIONAL_BRANCH | NMD_GROUP_UNCONDITIONAL_BRANCH), /* Mask used to check if the instruction is a branch instruction. */\n\tNMD_GROUP_ANY    = (1 << 8) - 1, /* Mask used to check if the instruction is part of any group. */\n};\n\n/* The enums for a some classes of registers always start at a multiple of eight */\ntypedef enum NMD_X86_REG\n{\n\tNMD_X86_REG_NONE  = 0,\n    \n\tNMD_X86_REG_IP    = 8,\n\tNMD_X86_REG_EIP   = 9,\n\tNMD_X86_REG_RIP   = 10,\n    \n\tNMD_X86_REG_AL    = 16,\n\tNMD_X86_REG_CL    = 17,\n\tNMD_X86_REG_DL    = 18,\n\tNMD_X86_REG_BL    = 19,\n\tNMD_X86_REG_AH    = 20,\n\tNMD_X86_REG_CH    = 21,\n\tNMD_X86_REG_DH    = 22,\n\tNMD_X86_REG_BH    = 23,\n    \n\tNMD_X86_REG_AX    = 24,\n\tNMD_X86_REG_CX    = 25,\n\tNMD_X86_REG_DX    = 26,\n\tNMD_X86_REG_BX    = 27,\n\tNMD_X86_REG_SP    = 28,\n\tNMD_X86_REG_BP    = 29,\n\tNMD_X86_REG_SI    = 30,\n\tNMD_X86_REG_DI    = 31,\n    \n\tNMD_X86_REG_EAX   = 32,\n\tNMD_X86_REG_ECX   = 33,\n\tNMD_X86_REG_EDX   = 34,\n\tNMD_X86_REG_EBX   = 35,\n\tNMD_X86_REG_ESP   = 36,\n\tNMD_X86_REG_EBP   = 37,\n\tNMD_X86_REG_ESI   = 38,\n\tNMD_X86_REG_EDI   = 39,\n    \n\tNMD_X86_REG_RAX   = 40,\n\tNMD_X86_REG_RCX   = 41,\n\tNMD_X86_REG_RDX   = 42,\n\tNMD_X86_REG_RBX   = 43,\n\tNMD_X86_REG_RSP   = 44,\n\tNMD_X86_REG_RBP   = 45,\n\tNMD_X86_REG_RSI   = 46,\n\tNMD_X86_REG_RDI   = 47,\n    \n\tNMD_X86_REG_R8    = 48,\n\tNMD_X86_REG_R9    = 49,\n\tNMD_X86_REG_R10   = 50,\n\tNMD_X86_REG_R11   = 51,\n\tNMD_X86_REG_R12   = 52,\n\tNMD_X86_REG_R13   = 53,\n\tNMD_X86_REG_R14   = 54,\n\tNMD_X86_REG_R15   = 55,\n    \n\tNMD_X86_REG_R8B   = 56,\n\tNMD_X86_REG_R9B   = 57,\n\tNMD_X86_REG_R10B  = 58,\n\tNMD_X86_REG_R11B  = 59,\n\tNMD_X86_REG_R12B  = 60,\n\tNMD_X86_REG_R13B  = 61,\n\tNMD_X86_REG_R14B  = 62,\n\tNMD_X86_REG_R15B  = 63,\n    \n\tNMD_X86_REG_R8W   = 64,\n\tNMD_X86_REG_R9W   = 65,\n\tNMD_X86_REG_R10W  = 66,\n\tNMD_X86_REG_R11W  = 67,\n\tNMD_X86_REG_R12W  = 68,\n\tNMD_X86_REG_R13W  = 69,\n\tNMD_X86_REG_R14W  = 70,\n\tNMD_X86_REG_R15W  = 71,\n    \n\tNMD_X86_REG_R8D   = 72,\n\tNMD_X86_REG_R9D   = 73,\n\tNMD_X86_REG_R10D  = 74,\n\tNMD_X86_REG_R11D  = 75,\n\tNMD_X86_REG_R12D  = 76,\n\tNMD_X86_REG_R13D  = 77,\n\tNMD_X86_REG_R14D  = 78,\n\tNMD_X86_REG_R15D  = 79,\n    \n\tNMD_X86_REG_ES    = 80,\n\tNMD_X86_REG_CS    = 81,\n\tNMD_X86_REG_SS    = 82,\n\tNMD_X86_REG_DS    = 83,\n\tNMD_X86_REG_FS    = 84,\n\tNMD_X86_REG_GS    = 85,\n    \n\tNMD_X86_REG_CR0   = 88,\n\tNMD_X86_REG_CR1   = 89,\n\tNMD_X86_REG_CR2   = 90,\n\tNMD_X86_REG_CR3   = 91,\n\tNMD_X86_REG_CR4   = 92,\n\tNMD_X86_REG_CR5   = 93,\n\tNMD_X86_REG_CR6   = 94,\n\tNMD_X86_REG_CR7   = 95,\n\tNMD_X86_REG_CR8   = 96,\n\tNMD_X86_REG_CR9   = 97,\n\tNMD_X86_REG_CR10  = 98,\n\tNMD_X86_REG_CR11  = 99,\n\tNMD_X86_REG_CR12  = 100,\n\tNMD_X86_REG_CR13  = 101,\n\tNMD_X86_REG_CR14  = 102,\n\tNMD_X86_REG_CR15  = 103,\n    \n\tNMD_X86_REG_DR0   = 104,\n\tNMD_X86_REG_DR1   = 105,\n\tNMD_X86_REG_DR2   = 106,\n\tNMD_X86_REG_DR3   = 107,\n\tNMD_X86_REG_DR4   = 108,\n\tNMD_X86_REG_DR5   = 109,\n\tNMD_X86_REG_DR6   = 110,\n\tNMD_X86_REG_DR7   = 111,\n\tNMD_X86_REG_DR8   = 112,\n\tNMD_X86_REG_DR9   = 113,\n\tNMD_X86_REG_DR10  = 114,\n\tNMD_X86_REG_DR11  = 115,\n\tNMD_X86_REG_DR12  = 116,\n\tNMD_X86_REG_DR13  = 117,\n\tNMD_X86_REG_DR14  = 118,\n\tNMD_X86_REG_DR15  = 119,\n    \n\tNMD_X86_REG_MM0   = 120,\n\tNMD_X86_REG_MM1   = 121,\n\tNMD_X86_REG_MM2   = 122,\n\tNMD_X86_REG_MM3   = 123,\n\tNMD_X86_REG_MM4   = 124,\n\tNMD_X86_REG_MM5   = 125,\n\tNMD_X86_REG_MM6   = 126,\n\tNMD_X86_REG_MM7   = 127,\n    \n\tNMD_X86_REG_XMM0  = 128,\n\tNMD_X86_REG_XMM1  = 129,\n\tNMD_X86_REG_XMM2  = 130,\n\tNMD_X86_REG_XMM3  = 131,\n\tNMD_X86_REG_XMM4  = 132,\n\tNMD_X86_REG_XMM5  = 133,\n\tNMD_X86_REG_XMM6  = 134,\n\tNMD_X86_REG_XMM7  = 135,\n\tNMD_X86_REG_XMM8  = 136,\n\tNMD_X86_REG_XMM9  = 137,\n\tNMD_X86_REG_XMM10 = 138,\n\tNMD_X86_REG_XMM11 = 139,\n\tNMD_X86_REG_XMM12 = 140,\n\tNMD_X86_REG_XMM13 = 141,\n\tNMD_X86_REG_XMM14 = 142,\n\tNMD_X86_REG_XMM15 = 143,\n\tNMD_X86_REG_XMM16 = 144,\n\tNMD_X86_REG_XMM17 = 145,\n\tNMD_X86_REG_XMM18 = 146,\n\tNMD_X86_REG_XMM19 = 147,\n\tNMD_X86_REG_XMM20 = 148,\n\tNMD_X86_REG_XMM21 = 149,\n\tNMD_X86_REG_XMM22 = 150,\n\tNMD_X86_REG_XMM23 = 151,\n\tNMD_X86_REG_XMM24 = 152,\n\tNMD_X86_REG_XMM25 = 153,\n\tNMD_X86_REG_XMM26 = 154,\n\tNMD_X86_REG_XMM27 = 155,\n\tNMD_X86_REG_XMM28 = 156,\n\tNMD_X86_REG_XMM29 = 157,\n\tNMD_X86_REG_XMM30 = 158,\n\tNMD_X86_REG_XMM31 = 159,\n    \n\tNMD_X86_REG_YMM0  = 160,\n\tNMD_X86_REG_YMM1  = 161,\n\tNMD_X86_REG_YMM2  = 162,\n\tNMD_X86_REG_YMM3  = 163,\n\tNMD_X86_REG_YMM4  = 164,\n\tNMD_X86_REG_YMM5  = 165,\n\tNMD_X86_REG_YMM6  = 166,\n\tNMD_X86_REG_YMM7  = 167,\n\tNMD_X86_REG_YMM8  = 168,\n\tNMD_X86_REG_YMM9  = 169,\n\tNMD_X86_REG_YMM10 = 170,\n\tNMD_X86_REG_YMM11 = 171,\n\tNMD_X86_REG_YMM12 = 172,\n\tNMD_X86_REG_YMM13 = 173,\n\tNMD_X86_REG_YMM14 = 174,\n\tNMD_X86_REG_YMM15 = 175,\n\tNMD_X86_REG_YMM16 = 176,\n\tNMD_X86_REG_YMM17 = 177,\n\tNMD_X86_REG_YMM18 = 178,\n\tNMD_X86_REG_YMM19 = 179,\n\tNMD_X86_REG_YMM20 = 180,\n\tNMD_X86_REG_YMM21 = 181,\n\tNMD_X86_REG_YMM22 = 182,\n\tNMD_X86_REG_YMM23 = 183,\n\tNMD_X86_REG_YMM24 = 184,\n\tNMD_X86_REG_YMM25 = 185,\n\tNMD_X86_REG_YMM26 = 186,\n\tNMD_X86_REG_YMM27 = 187,\n\tNMD_X86_REG_YMM28 = 188,\n\tNMD_X86_REG_YMM29 = 189,\n\tNMD_X86_REG_YMM30 = 190,\n\tNMD_X86_REG_YMM31 = 191,\n    \n\tNMD_X86_REG_ZMM0  = 192,\n\tNMD_X86_REG_ZMM1  = 193,\n\tNMD_X86_REG_ZMM2  = 194,\n\tNMD_X86_REG_ZMM3  = 195,\n\tNMD_X86_REG_ZMM4  = 196,\n\tNMD_X86_REG_ZMM5  = 197,\n\tNMD_X86_REG_ZMM6  = 198,\n\tNMD_X86_REG_ZMM7  = 199,\n\tNMD_X86_REG_ZMM8  = 200,\n\tNMD_X86_REG_ZMM9  = 201,\n\tNMD_X86_REG_ZMM10 = 202,\n\tNMD_X86_REG_ZMM11 = 203,\n\tNMD_X86_REG_ZMM12 = 204,\n\tNMD_X86_REG_ZMM13 = 205,\n\tNMD_X86_REG_ZMM14 = 206,\n\tNMD_X86_REG_ZMM15 = 207,\n\tNMD_X86_REG_ZMM16 = 208,\n\tNMD_X86_REG_ZMM17 = 209,\n\tNMD_X86_REG_ZMM18 = 210,\n\tNMD_X86_REG_ZMM19 = 211,\n\tNMD_X86_REG_ZMM20 = 212,\n\tNMD_X86_REG_ZMM21 = 213,\n\tNMD_X86_REG_ZMM22 = 214,\n\tNMD_X86_REG_ZMM23 = 215,\n\tNMD_X86_REG_ZMM24 = 216,\n\tNMD_X86_REG_ZMM25 = 217,\n\tNMD_X86_REG_ZMM26 = 218,\n\tNMD_X86_REG_ZMM27 = 219,\n\tNMD_X86_REG_ZMM28 = 220,\n\tNMD_X86_REG_ZMM29 = 221,\n\tNMD_X86_REG_ZMM30 = 222,\n\tNMD_X86_REG_ZMM31 = 223,\n    \n    NMD_X86_REG_K0    = 224,\n\tNMD_X86_REG_K1    = 225,\n\tNMD_X86_REG_K2    = 226,\n\tNMD_X86_REG_K3    = 227,\n\tNMD_X86_REG_K4    = 228,\n\tNMD_X86_REG_K5    = 229,\n\tNMD_X86_REG_K6    = 230,\n\tNMD_X86_REG_K7    = 231,\n    \n\tNMD_X86_REG_ST0   = 232,\n\tNMD_X86_REG_ST1   = 233,\n\tNMD_X86_REG_ST2   = 234,\n\tNMD_X86_REG_ST3   = 235,\n\tNMD_X86_REG_ST4   = 236,\n\tNMD_X86_REG_ST5   = 237,\n\tNMD_X86_REG_ST6   = 238,\n\tNMD_X86_REG_ST7   = 239,\n} NMD_X86_REG;\n\n/*\nCredits to the capstone engine:\nSome members of the enum are organized in such a way because the instruction's id parsing component of the decoder can take advantage of it.\nIf an instruction as marked as 'padding', it means that it's being used to fill holes between instructions organized in a special way for optimization reasons.\n*/\nenum NMD_X86_INSTRUCTION\n{\n\tNMD_X86_INSTRUCTION_INVALID = 0,\n\n\t/* Optimized for opcode extension group 1. */\n\tNMD_X86_INSTRUCTION_ADD,\n\tNMD_X86_INSTRUCTION_OR,\n\tNMD_X86_INSTRUCTION_ADC,\n\tNMD_X86_INSTRUCTION_SBB,\n\tNMD_X86_INSTRUCTION_AND,\n\tNMD_X86_INSTRUCTION_SUB,\n\tNMD_X86_INSTRUCTION_XOR,\n\tNMD_X86_INSTRUCTION_CMP,\n\n\t/* Optimized for opcode extension group 2. */\n\tNMD_X86_INSTRUCTION_ROL,\n\tNMD_X86_INSTRUCTION_ROR,\n\tNMD_X86_INSTRUCTION_RCL,\n\tNMD_X86_INSTRUCTION_RCR,\n\tNMD_X86_INSTRUCTION_SHL,\n\tNMD_X86_INSTRUCTION_SHR,\n\tNMD_X86_INSTRUCTION_AAA, /* padding */\n\tNMD_X86_INSTRUCTION_SAR,\n\n\t/* Optimized for opcode extension group 3. */\n\tNMD_X86_INSTRUCTION_TEST,\n\tNMD_X86_INSTRUCTION_BLSFILL, /* pading */\n\tNMD_X86_INSTRUCTION_NOT,\n\tNMD_X86_INSTRUCTION_NEG,\n\tNMD_X86_INSTRUCTION_MUL,\n\tNMD_X86_INSTRUCTION_IMUL,\n\tNMD_X86_INSTRUCTION_DIV,\n\tNMD_X86_INSTRUCTION_IDIV,\n\n\t/* Optimized for opcode extension group 5. */\n\tNMD_X86_INSTRUCTION_INC,\n\tNMD_X86_INSTRUCTION_DEC,\n\tNMD_X86_INSTRUCTION_CALL,\n\tNMD_X86_INSTRUCTION_LCALL,\n\tNMD_X86_INSTRUCTION_JMP,\n\tNMD_X86_INSTRUCTION_LJMP,\n\tNMD_X86_INSTRUCTION_PUSH,\n\n\t/* Optimized for the 7th row of the 1 byte opcode map and the 8th row of the 2 byte opcode map. */\n\tNMD_X86_INSTRUCTION_JO,\n\tNMD_X86_INSTRUCTION_JNO,\n\tNMD_X86_INSTRUCTION_JB,\n\tNMD_X86_INSTRUCTION_JNB,\n\tNMD_X86_INSTRUCTION_JZ,\n\tNMD_X86_INSTRUCTION_JNZ,\n\tNMD_X86_INSTRUCTION_JBE,\n\tNMD_X86_INSTRUCTION_JA,\n\tNMD_X86_INSTRUCTION_JS,\n\tNMD_X86_INSTRUCTION_JNS,\n\tNMD_X86_INSTRUCTION_JP,\n\tNMD_X86_INSTRUCTION_JNP,\n\tNMD_X86_INSTRUCTION_JL,\n\tNMD_X86_INSTRUCTION_JGE,\n\tNMD_X86_INSTRUCTION_JLE,\n\tNMD_X86_INSTRUCTION_JG,\n\n\t/* Optimized for escape opcodes with D8 as first byte. */\n\tNMD_X86_INSTRUCTION_FADD,\n\tNMD_X86_INSTRUCTION_FMUL,\n\tNMD_X86_INSTRUCTION_FCOM,\n\tNMD_X86_INSTRUCTION_FCOMP,\n\tNMD_X86_INSTRUCTION_FSUB,\n\tNMD_X86_INSTRUCTION_FSUBR,\n\tNMD_X86_INSTRUCTION_FDIV,\n\tNMD_X86_INSTRUCTION_FDIVR,\n\n\t/* Optimized for escape opcodes with D9 as first byte. */\n\tNMD_X86_INSTRUCTION_FLD,\n\tNMD_X86_INSTRUCTION_ADOX, /* padding */\n\tNMD_X86_INSTRUCTION_FST,\n\tNMD_X86_INSTRUCTION_FSTP,\n\tNMD_X86_INSTRUCTION_FLDENV,\n\tNMD_X86_INSTRUCTION_FLDCW,\n\tNMD_X86_INSTRUCTION_FNSTENV,\n\tNMD_X86_INSTRUCTION_FNSTCW,\n\n\tNMD_X86_INSTRUCTION_FCHS,\n\tNMD_X86_INSTRUCTION_FABS,\n\tNMD_X86_INSTRUCTION_AAS, /* padding */\n\tNMD_X86_INSTRUCTION_ADCX, /* padding */\n\tNMD_X86_INSTRUCTION_FTST,\n\tNMD_X86_INSTRUCTION_FXAM,\n\tNMD_X86_INSTRUCTION_RET, /* padding */\n\tNMD_X86_INSTRUCTION_ENTER, /* padding */\n\tNMD_X86_INSTRUCTION_FLD1,\n\tNMD_X86_INSTRUCTION_FLDL2T,\n\tNMD_X86_INSTRUCTION_FLDL2E,\n\tNMD_X86_INSTRUCTION_FLDPI,\n\tNMD_X86_INSTRUCTION_FLDLG2,\n\tNMD_X86_INSTRUCTION_FLDLN2,\n\tNMD_X86_INSTRUCTION_FLDZ,\n\tNMD_X86_INSTRUCTION_FNOP, /* padding */\n\tNMD_X86_INSTRUCTION_F2XM1,\n\tNMD_X86_INSTRUCTION_FYL2X,\n\tNMD_X86_INSTRUCTION_FPTAN,\n\tNMD_X86_INSTRUCTION_FPATAN,\n\tNMD_X86_INSTRUCTION_FXTRACT,\n\tNMD_X86_INSTRUCTION_FPREM1,\n\tNMD_X86_INSTRUCTION_FDECSTP,\n\tNMD_X86_INSTRUCTION_FINCSTP,\n\tNMD_X86_INSTRUCTION_FPREM,\n\tNMD_X86_INSTRUCTION_FYL2XP1,\n\tNMD_X86_INSTRUCTION_FSQRT,\n\tNMD_X86_INSTRUCTION_FSINCOS,\n\tNMD_X86_INSTRUCTION_FRNDINT,\n\tNMD_X86_INSTRUCTION_FSCALE,\n\tNMD_X86_INSTRUCTION_FSIN,\n\tNMD_X86_INSTRUCTION_FCOS,\n\n\t/* Optimized for escape opcodes with DA as first byte. */\n\tNMD_X86_INSTRUCTION_FIADD,\n\tNMD_X86_INSTRUCTION_FIMUL,\n\tNMD_X86_INSTRUCTION_FICOM,\n\tNMD_X86_INSTRUCTION_FICOMP,\n\tNMD_X86_INSTRUCTION_FISUB,\n\tNMD_X86_INSTRUCTION_FISUBR,\n\tNMD_X86_INSTRUCTION_FIDIV,\n\tNMD_X86_INSTRUCTION_FIDIVR,\n\n\tNMD_X86_INSTRUCTION_FCMOVB,\n\tNMD_X86_INSTRUCTION_FCMOVE,\n\tNMD_X86_INSTRUCTION_FCMOVBE,\n\tNMD_X86_INSTRUCTION_FCMOVU,\n\n\t/* Optimized for escape opcodes with DB/DF as first byte. */\n\tNMD_X86_INSTRUCTION_FILD,\n\tNMD_X86_INSTRUCTION_FISTTP,\n\tNMD_X86_INSTRUCTION_FIST,\n\tNMD_X86_INSTRUCTION_FISTP,\n\tNMD_X86_INSTRUCTION_FBLD,\n\tNMD_X86_INSTRUCTION_AESKEYGENASSIST, /* padding */\n\tNMD_X86_INSTRUCTION_FBSTP,\n\tNMD_X86_INSTRUCTION_ANDN, /* padding */\n\n\tNMD_X86_INSTRUCTION_FCMOVNB,\n\tNMD_X86_INSTRUCTION_FCMOVNE,\n\tNMD_X86_INSTRUCTION_FCMOVNBE,\n\tNMD_X86_INSTRUCTION_FCMOVNU,\n\tNMD_X86_INSTRUCTION_FNCLEX,\n\tNMD_X86_INSTRUCTION_FUCOMI,\n\tNMD_X86_INSTRUCTION_FCOMI,\n\n\t/* Optimized for escape opcodes with DE as first byte. */\n\tNMD_X86_INSTRUCTION_FADDP,\n\tNMD_X86_INSTRUCTION_FMULP,\n\tNMD_X86_INSTRUCTION_MOVAPD, /* padding */\n\tNMD_X86_INSTRUCTION_BNDCN, /* padding */\n\tNMD_X86_INSTRUCTION_FSUBRP,\n\tNMD_X86_INSTRUCTION_FSUBP,\n\tNMD_X86_INSTRUCTION_FDIVRP,\n\tNMD_X86_INSTRUCTION_FDIVP,\n\n\t/* Optimized for the 15th row of the 1 byte opcode map. */\n\tNMD_X86_INSTRUCTION_INT1,\n\tNMD_X86_INSTRUCTION_BSR, /* padding */\n\tNMD_X86_INSTRUCTION_ADDSUBPD, /* padding */\n\tNMD_X86_INSTRUCTION_HLT,\n\tNMD_X86_INSTRUCTION_CMC,\n\tNMD_X86_INSTRUCTION_ADDSUBPS, /* padding */\n\tNMD_X86_INSTRUCTION_BLENDVPD, /* padding*/\n\tNMD_X86_INSTRUCTION_CLC,\n\tNMD_X86_INSTRUCTION_STC,\n\tNMD_X86_INSTRUCTION_CLI,\n\tNMD_X86_INSTRUCTION_STI,\n\tNMD_X86_INSTRUCTION_CLD,\n\tNMD_X86_INSTRUCTION_STD,\n\n\t/* Optimized for the 13th row of the 1 byte opcode map. */\n\tNMD_X86_INSTRUCTION_AAM,\n\tNMD_X86_INSTRUCTION_AAD,\n\tNMD_X86_INSTRUCTION_SALC,\n\tNMD_X86_INSTRUCTION_XLAT,\n\n\t/* Optimized for the 14th row of the 1 byte opcode map. */\n\tNMD_X86_INSTRUCTION_LOOPNE,\n\tNMD_X86_INSTRUCTION_LOOPE,\n\tNMD_X86_INSTRUCTION_LOOP,\n\tNMD_X86_INSTRUCTION_JRCXZ,\n\n\t/* Optimized for opcode extension group 6. */\n\tNMD_X86_INSTRUCTION_SLDT,\n\tNMD_X86_INSTRUCTION_STR,\n\tNMD_X86_INSTRUCTION_LLDT,\n\tNMD_X86_INSTRUCTION_LTR,\n\tNMD_X86_INSTRUCTION_VERR,\n\tNMD_X86_INSTRUCTION_VERW,\n\n\t/* Optimized for opcode extension group 7. */\n\tNMD_X86_INSTRUCTION_SGDT,\n\tNMD_X86_INSTRUCTION_SIDT,\n\tNMD_X86_INSTRUCTION_LGDT,\n\tNMD_X86_INSTRUCTION_LIDT,\n\tNMD_X86_INSTRUCTION_SMSW,\n\tNMD_X86_INSTRUCTION_CLWB, /* padding */\n\tNMD_X86_INSTRUCTION_LMSW,\n\tNMD_X86_INSTRUCTION_INVLPG,\n\n\tNMD_X86_INSTRUCTION_VMCALL,\n\tNMD_X86_INSTRUCTION_VMLAUNCH,\n\tNMD_X86_INSTRUCTION_VMRESUME,\n\tNMD_X86_INSTRUCTION_VMXOFF,\n\n\tNMD_X86_INSTRUCTION_MONITOR,\n\tNMD_X86_INSTRUCTION_MWAIT,\n\tNMD_X86_INSTRUCTION_CLAC,\n\tNMD_X86_INSTRUCTION_STAC,\n\tNMD_X86_INSTRUCTION_CBW, /* padding */\n\tNMD_X86_INSTRUCTION_CMPSB, /* padding */\n\tNMD_X86_INSTRUCTION_CMPSQ, /* padding */\n\tNMD_X86_INSTRUCTION_ENCLS,\n\n\tNMD_X86_INSTRUCTION_XGETBV,\n\tNMD_X86_INSTRUCTION_XSETBV,\n\tNMD_X86_INSTRUCTION_ARPL, /* padding */\n\tNMD_X86_INSTRUCTION_BEXTR, /* padding */\n\tNMD_X86_INSTRUCTION_VMFUNC,\n\tNMD_X86_INSTRUCTION_XEND,\n\tNMD_X86_INSTRUCTION_XTEST,\n\tNMD_X86_INSTRUCTION_ENCLU,\n\n\tNMD_X86_INSTRUCTION_VMRUN,\n\tNMD_X86_INSTRUCTION_VMMCALL,\n\tNMD_X86_INSTRUCTION_VMLOAD,\n\tNMD_X86_INSTRUCTION_VMSAVE,\n\tNMD_X86_INSTRUCTION_STGI,\n\tNMD_X86_INSTRUCTION_CLGI,\n\tNMD_X86_INSTRUCTION_SKINIT,\n\tNMD_X86_INSTRUCTION_INVLPGA,\n\n\t/* Optimized for the row 0x0 of the 2 byte opcode map. */\n\tNMD_X86_INSTRUCTION_LAR,\n\tNMD_X86_INSTRUCTION_LSL,\n\tNMD_X86_INSTRUCTION_BLCFILL, /* padding */\n\tNMD_X86_INSTRUCTION_SYSCALL,\n\tNMD_X86_INSTRUCTION_CLTS,\n\tNMD_X86_INSTRUCTION_SYSRET,\n\tNMD_X86_INSTRUCTION_INVD,\n\tNMD_X86_INSTRUCTION_WBINVD,\n\tNMD_X86_INSTRUCTION_BLCI, /* padding */\n\tNMD_X86_INSTRUCTION_UD2,\n\tNMD_X86_INSTRUCTION_PREFETCHW,\n\tNMD_X86_INSTRUCTION_FEMMS,\n\n\t/* Optimized for the row 0x3 of the 2 byte opcode map. */\n\tNMD_X86_INSTRUCTION_WRMSR,\n\tNMD_X86_INSTRUCTION_RDTSC,\n\tNMD_X86_INSTRUCTION_RDMSR,\n\tNMD_X86_INSTRUCTION_RDPMC,\n\tNMD_X86_INSTRUCTION_SYSENTER,\n\tNMD_X86_INSTRUCTION_SYSEXIT,\n\tNMD_X86_INSTRUCTION_BLCIC, /* padding */\n\tNMD_X86_INSTRUCTION_GETSEC,\n\n\t/* Optimized for the row 0x4 of the 2 byte opcode map. */\n\tNMD_X86_INSTRUCTION_CMOVO,\n\tNMD_X86_INSTRUCTION_CMOVNO,\n\tNMD_X86_INSTRUCTION_CMOVB,\n\tNMD_X86_INSTRUCTION_CMOVAE,\n\tNMD_X86_INSTRUCTION_CMOVE,\n\tNMD_X86_INSTRUCTION_CMOVNE,\n\tNMD_X86_INSTRUCTION_CMOVBE,\n\tNMD_X86_INSTRUCTION_CMOVA,\n\tNMD_X86_INSTRUCTION_CMOVS,\n\tNMD_X86_INSTRUCTION_CMOVNS,\n\tNMD_X86_INSTRUCTION_CMOVP,\n\tNMD_X86_INSTRUCTION_CMOVNP,\n\tNMD_X86_INSTRUCTION_CMOVL,\n\tNMD_X86_INSTRUCTION_CMOVGE,\n\tNMD_X86_INSTRUCTION_CMOVLE,\n\tNMD_X86_INSTRUCTION_CMOVG,\n\n\t/* Optimized for the row 0x9 of the 2 byte opcode map. */\n\tNMD_X86_INSTRUCTION_SETO,\n\tNMD_X86_INSTRUCTION_SETNO,\n\tNMD_X86_INSTRUCTION_SETB,\n\tNMD_X86_INSTRUCTION_SETAE,\n\tNMD_X86_INSTRUCTION_SETE,\n\tNMD_X86_INSTRUCTION_SETNE,\n\tNMD_X86_INSTRUCTION_SETBE,\n\tNMD_X86_INSTRUCTION_SETA,\n\tNMD_X86_INSTRUCTION_SETS,\n\tNMD_X86_INSTRUCTION_SETNS,\n\tNMD_X86_INSTRUCTION_SETP,\n\tNMD_X86_INSTRUCTION_SETNP,\n\tNMD_X86_INSTRUCTION_SETL,\n\tNMD_X86_INSTRUCTION_SETGE,\n\tNMD_X86_INSTRUCTION_SETLE,\n\tNMD_X86_INSTRUCTION_SETG,\n\n\t/* Optimized for the row 0xb of the 2 byte opcode map. */\n\tNMD_X86_INSTRUCTION_LSS,\n\tNMD_X86_INSTRUCTION_BTR,\n\tNMD_X86_INSTRUCTION_LFS,\n\tNMD_X86_INSTRUCTION_LGS,\n\n\tNMD_X86_INSTRUCTION_BT,\n\tNMD_X86_INSTRUCTION_BTC,\n\tNMD_X86_INSTRUCTION_BTS,\n\n\t/* Optimized for the row 0x0 of the 3 byte opcode map(38h). */\n\tNMD_X86_INSTRUCTION_PSHUFB,\n\tNMD_X86_INSTRUCTION_PHADDW,\n\tNMD_X86_INSTRUCTION_PHADDD,\n\tNMD_X86_INSTRUCTION_PHADDSW,\n\tNMD_X86_INSTRUCTION_PMADDUBSW,\n\tNMD_X86_INSTRUCTION_PHSUBW,\n\tNMD_X86_INSTRUCTION_PHSUBD,\n\tNMD_X86_INSTRUCTION_PHSUBSW,\n\tNMD_X86_INSTRUCTION_PSIGNB,\n\tNMD_X86_INSTRUCTION_PSIGNW,\n\tNMD_X86_INSTRUCTION_PSIGND,\n\tNMD_X86_INSTRUCTION_PMULHRSW,\n\n\t/* Optimized for the row 0x1 of the 3 byte opcode map(38h). */\n\tNMD_X86_INSTRUCTION_PABSB,\n\tNMD_X86_INSTRUCTION_PABSW,\n\tNMD_X86_INSTRUCTION_PABSD,\n\n\t/* Optimized for the row 0x2 of the 3 byte opcode map(38). */\n\tNMD_X86_INSTRUCTION_PMOVSXBW,\n\tNMD_X86_INSTRUCTION_PMOVSXBD,\n\tNMD_X86_INSTRUCTION_PMOVSXBQ,\n\tNMD_X86_INSTRUCTION_PMOVSXWD,\n\tNMD_X86_INSTRUCTION_PMOVSXWQ,\n\tNMD_X86_INSTRUCTION_PMOVZXDQ,\n\tNMD_X86_INSTRUCTION_CPUID, /* padding */\n\tNMD_X86_INSTRUCTION_BLCMSK, /* padding */\n\tNMD_X86_INSTRUCTION_PMULDQ,\n\tNMD_X86_INSTRUCTION_PCMPEQQ,\n\tNMD_X86_INSTRUCTION_MOVNTDQA,\n\tNMD_X86_INSTRUCTION_PACKUSDW,\n\n\t/* Optimized for the row 0x3 of the 3 byte opcode map(38h). */\n\tNMD_X86_INSTRUCTION_PMOVZXBW,\n\tNMD_X86_INSTRUCTION_PMOVZXBD,\n\tNMD_X86_INSTRUCTION_PMOVZXBQ,\n\tNMD_X86_INSTRUCTION_PMOVZXWD,\n\tNMD_X86_INSTRUCTION_PMOVZXWQ,\n\tNMD_X86_INSTRUCTION_PMOVSXDQ,\n\tNMD_X86_INSTRUCTION_BLCS, /* padding */\n\tNMD_X86_INSTRUCTION_PCMPGTQ,\n\tNMD_X86_INSTRUCTION_PMINSB,\n\tNMD_X86_INSTRUCTION_PMINSD,\n\tNMD_X86_INSTRUCTION_PMINUW,\n\tNMD_X86_INSTRUCTION_PMINUD,\n\tNMD_X86_INSTRUCTION_PMAXSB,\n\tNMD_X86_INSTRUCTION_PMAXSD,\n\tNMD_X86_INSTRUCTION_PMAXUW,\n\tNMD_X86_INSTRUCTION_PMAXUD,\n\n\t/* Optimized for the row 0x8 of the 3 byte opcode map(38h). */\n\tNMD_X86_INSTRUCTION_INVEPT,\n\tNMD_X86_INSTRUCTION_INVVPID,\n\tNMD_X86_INSTRUCTION_INVPCID,\n\n\t/* Optimized for the row 0xc of the 3 byte opcode map(38h). */\n\tNMD_X86_INSTRUCTION_SHA1NEXTE,\n\tNMD_X86_INSTRUCTION_SHA1MSG1,\n\tNMD_X86_INSTRUCTION_SHA1MSG2,\n\tNMD_X86_INSTRUCTION_SHA256RNDS2,\n\tNMD_X86_INSTRUCTION_SHA256MSG1,\n\tNMD_X86_INSTRUCTION_SHA256MSG2,\n\n\t/* Optimized for the row 0xd of the 3 byte opcode map(38h). */\n\tNMD_X86_INSTRUCTION_AESIMC,\n\tNMD_X86_INSTRUCTION_AESENC,\n\tNMD_X86_INSTRUCTION_AESENCLAST,\n\tNMD_X86_INSTRUCTION_AESDEC,\n\tNMD_X86_INSTRUCTION_AESDECLAST,\n\n\t/* Optimized for the row 0x0 of the 3 byte opcode map(3Ah). */\n\tNMD_X86_INSTRUCTION_ROUNDPS,\n\tNMD_X86_INSTRUCTION_ROUNDPD,\n\tNMD_X86_INSTRUCTION_ROUNDSS,\n\tNMD_X86_INSTRUCTION_ROUNDSD,\n\tNMD_X86_INSTRUCTION_BLENDPS,\n\tNMD_X86_INSTRUCTION_BLENDPD,\n\tNMD_X86_INSTRUCTION_PBLENDW,\n\tNMD_X86_INSTRUCTION_PALIGNR,\n\n\t/* Optimized for the row 0x4 of the 3 byte opcode map(3A). */\n\tNMD_X86_INSTRUCTION_DPPS,\n\tNMD_X86_INSTRUCTION_DPPD,\n\tNMD_X86_INSTRUCTION_MPSADBW,\n\tNMD_X86_INSTRUCTION_VPCMPGTQ, /* padding */\n\tNMD_X86_INSTRUCTION_PCLMULQDQ,\n\n\t/* Optimized for the row 0x6 of the 3 byte opcode map(3A). */\n\tNMD_X86_INSTRUCTION_PCMPESTRM,\n\tNMD_X86_INSTRUCTION_PCMPESTRI,\n\tNMD_X86_INSTRUCTION_PCMPISTRM,\n\tNMD_X86_INSTRUCTION_PCMPISTRI,\n\n\t/* Optimized for the rows 0xd, 0xe and 0xf of the 2 byte opcode map. */\n\tNMD_X86_INSTRUCTION_PSRLW,\n\tNMD_X86_INSTRUCTION_PSRLD,\n\tNMD_X86_INSTRUCTION_PSRLQ,\n\tNMD_X86_INSTRUCTION_PADDQ,\n\tNMD_X86_INSTRUCTION_PMULLW,\n\tNMD_X86_INSTRUCTION_BOUND, /* padding */\n\tNMD_X86_INSTRUCTION_PMOVMSKB,\n\tNMD_X86_INSTRUCTION_PSUBUSB,\n\tNMD_X86_INSTRUCTION_PSUBUSW,\n\tNMD_X86_INSTRUCTION_PMINUB,\n\tNMD_X86_INSTRUCTION_PAND,\n\tNMD_X86_INSTRUCTION_PADDUSB,\n\tNMD_X86_INSTRUCTION_PADDUSW,\n\tNMD_X86_INSTRUCTION_PMAXUB,\n\tNMD_X86_INSTRUCTION_PANDN,\n\tNMD_X86_INSTRUCTION_PAVGB,\n\tNMD_X86_INSTRUCTION_PSRAW,\n\tNMD_X86_INSTRUCTION_PSRAD,\n\tNMD_X86_INSTRUCTION_PAVGW,\n\tNMD_X86_INSTRUCTION_PMULHUW,\n\tNMD_X86_INSTRUCTION_PMULHW,\n\tNMD_X86_INSTRUCTION_CQO, /* padding */\n\tNMD_X86_INSTRUCTION_CRC32, /* padding */\n\tNMD_X86_INSTRUCTION_PSUBSB,\n\tNMD_X86_INSTRUCTION_PSUBSW,\n\tNMD_X86_INSTRUCTION_PMINSW,\n\tNMD_X86_INSTRUCTION_POR,\n\tNMD_X86_INSTRUCTION_PADDSB,\n\tNMD_X86_INSTRUCTION_PADDSW,\n\tNMD_X86_INSTRUCTION_PMAXSW,\n\tNMD_X86_INSTRUCTION_PXOR,\n\tNMD_X86_INSTRUCTION_LDDQU,\n\tNMD_X86_INSTRUCTION_PSLLW,\n\tNMD_X86_INSTRUCTION_PSLLD,\n\tNMD_X86_INSTRUCTION_PSLLQ,\n\tNMD_X86_INSTRUCTION_PMULUDQ,\n\tNMD_X86_INSTRUCTION_PMADDWD,\n\tNMD_X86_INSTRUCTION_PSADBW,\n\tNMD_X86_INSTRUCTION_BSWAP, /* padding */\n\tNMD_X86_INSTRUCTION_PSUBB,\n\tNMD_X86_INSTRUCTION_PSUBW,\n\tNMD_X86_INSTRUCTION_PSUBD,\n\tNMD_X86_INSTRUCTION_PSUBQ,\n\tNMD_X86_INSTRUCTION_PADDB,\n\tNMD_X86_INSTRUCTION_PADDW,\n\tNMD_X86_INSTRUCTION_PADDD,\n\n\t/* Optimized for the row 0xc of the 2 byte opcode map. */\n\tNMD_X86_INSTRUCTION_MOVNTI,\n\tNMD_X86_INSTRUCTION_PINSRW,\n\tNMD_X86_INSTRUCTION_PEXTRW,\n\n\t/* Optimized for opcode extension group 15. */\n\tNMD_X86_INSTRUCTION_FXSAVE,\n\tNMD_X86_INSTRUCTION_FXRSTOR,\n\tNMD_X86_INSTRUCTION_LDMXCSR,\n\tNMD_X86_INSTRUCTION_STMXCSR,\n\tNMD_X86_INSTRUCTION_XSAVE,\n\tNMD_X86_INSTRUCTION_XRSTOR,\n\tNMD_X86_INSTRUCTION_XSAVEOPT,\n\tNMD_X86_INSTRUCTION_CLFLUSH,\n\n\tNMD_X86_INSTRUCTION_RDFSBASE,\n\tNMD_X86_INSTRUCTION_RDGSBASE,\n\tNMD_X86_INSTRUCTION_WRFSBASE,\n\tNMD_X86_INSTRUCTION_WRGSBASE,\n\tNMD_X86_INSTRUCTION_CMPXCHG, /* padding */\n\tNMD_X86_INSTRUCTION_LFENCE,\n\tNMD_X86_INSTRUCTION_MFENCE,\n\tNMD_X86_INSTRUCTION_SFENCE,\n\t\n\tNMD_X86_INSTRUCTION_PCMPEQB,\n\tNMD_X86_INSTRUCTION_PCMPEQW,\n\tNMD_X86_INSTRUCTION_PCMPEQD,\n\t\n\t/* Optimized for the row 0x5 of the 2 byte opcode map. */\n\tNMD_X86_INSTRUCTION_MOVMSKPS,\n\tNMD_X86_INSTRUCTION_SQRTPS,\n\tNMD_X86_INSTRUCTION_RSQRTPS,\n\tNMD_X86_INSTRUCTION_RCPPS,\n\tNMD_X86_INSTRUCTION_ANDPS,\n\tNMD_X86_INSTRUCTION_ANDNPS,\n\tNMD_X86_INSTRUCTION_ORPS,\n\tNMD_X86_INSTRUCTION_XORPS,\n\tNMD_X86_INSTRUCTION_ADDPS,\n\tNMD_X86_INSTRUCTION_MULPS,\n\tNMD_X86_INSTRUCTION_CVTPS2PD,\n\tNMD_X86_INSTRUCTION_CVTDQ2PS,\n\tNMD_X86_INSTRUCTION_SUBPS,\n\tNMD_X86_INSTRUCTION_MINPS,\n\tNMD_X86_INSTRUCTION_DIVPS,\n\tNMD_X86_INSTRUCTION_MAXPS,\n\t\n\tNMD_X86_INSTRUCTION_MOVMSKPD,\n\tNMD_X86_INSTRUCTION_SQRTPD,\n\tNMD_X86_INSTRUCTION_BNDLDX, /* padding */\n\tNMD_X86_INSTRUCTION_BNDSTX, /* padding */\n\tNMD_X86_INSTRUCTION_ANDPD,\n\tNMD_X86_INSTRUCTION_ANDNPD,\n\tNMD_X86_INSTRUCTION_ORPD,\n\tNMD_X86_INSTRUCTION_XORPD,\n\tNMD_X86_INSTRUCTION_ADDPD,\n\tNMD_X86_INSTRUCTION_MULPD,\n\tNMD_X86_INSTRUCTION_CVTPD2PS,\n\tNMD_X86_INSTRUCTION_CVTPS2DQ,\n\tNMD_X86_INSTRUCTION_SUBPD,\n\tNMD_X86_INSTRUCTION_MINPD,\n\tNMD_X86_INSTRUCTION_DIVPD,\n\tNMD_X86_INSTRUCTION_MAXPD,\n\t\n\tNMD_X86_INSTRUCTION_BNDMOV,  /* padding */\n\tNMD_X86_INSTRUCTION_SQRTSS,\n\tNMD_X86_INSTRUCTION_RSQRTSS,\n\tNMD_X86_INSTRUCTION_RCPSS,\n\tNMD_X86_INSTRUCTION_CMPXCHG16B, /* padding */\n\tNMD_X86_INSTRUCTION_DAA, /* padding */\n\tNMD_X86_INSTRUCTION_CWD, /* padding */\n\tNMD_X86_INSTRUCTION_INSD, /* padding */\n\tNMD_X86_INSTRUCTION_ADDSS,\n\tNMD_X86_INSTRUCTION_MULSS,\n\tNMD_X86_INSTRUCTION_CVTSS2SD,\n\tNMD_X86_INSTRUCTION_CVTTPS2DQ,\n\tNMD_X86_INSTRUCTION_SUBSS,\n\tNMD_X86_INSTRUCTION_MINSS,\n\tNMD_X86_INSTRUCTION_DIVSS,\n\tNMD_X86_INSTRUCTION_MAXSS,\n\t\n\tNMD_X86_INSTRUCTION_BNDCL, /* padding */\n\tNMD_X86_INSTRUCTION_SQRTSD,\n\tNMD_X86_INSTRUCTION_BNDCU, /* padding */\n\tNMD_X86_INSTRUCTION_BNDMK, /* padding */\n\tNMD_X86_INSTRUCTION_CMPXCHG8B, /* padding */\n\tNMD_X86_INSTRUCTION_DAS, /* padding */\n\tNMD_X86_INSTRUCTION_CWDE, /* padding */\n\tNMD_X86_INSTRUCTION_INSW, /* padding */\n\tNMD_X86_INSTRUCTION_ADDSD,\n\tNMD_X86_INSTRUCTION_MULSD,\n\tNMD_X86_INSTRUCTION_CVTSD2SS,\n\tNMD_X86_INSTRUCTION_FCOMIP, /* padding */\n\tNMD_X86_INSTRUCTION_SUBSD,\n\tNMD_X86_INSTRUCTION_MINSD,\n\tNMD_X86_INSTRUCTION_DIVSD,\n\tNMD_X86_INSTRUCTION_MAXSD,\n\t\n\t/* Optimized for the row 0x6 of the 2 byte opcode map. */\n\tNMD_X86_INSTRUCTION_PUNPCKLBW,\n\tNMD_X86_INSTRUCTION_PUNPCKLWD,\n\tNMD_X86_INSTRUCTION_PUNPCKLDQ,\n\tNMD_X86_INSTRUCTION_PACKSSWB,\n\tNMD_X86_INSTRUCTION_PCMPGTB,\n\tNMD_X86_INSTRUCTION_PCMPGTW,\n\tNMD_X86_INSTRUCTION_PCMPGTD,\n\tNMD_X86_INSTRUCTION_PACKUSWB,\n\tNMD_X86_INSTRUCTION_PUNPCKHBW,\n\tNMD_X86_INSTRUCTION_PUNPCKHWD,\n\tNMD_X86_INSTRUCTION_PUNPCKHDQ,\n\tNMD_X86_INSTRUCTION_PACKSSDW,\n\tNMD_X86_INSTRUCTION_PUNPCKLQDQ,\n\tNMD_X86_INSTRUCTION_PUNPCKHQDQ,\n\t\n\t/* Optimized for AVX instructions. */\n\tNMD_X86_INSTRUCTION_VPSHUFB,    /* 00 */\n\tNMD_X86_INSTRUCTION_VPHADDW,    /* 01 */\n\tNMD_X86_INSTRUCTION_VPHADDD,    /* 02 */\n\tNMD_X86_INSTRUCTION_VPHADDSW,   /* 03 */\n\tNMD_X86_INSTRUCTION_VPMADDUBSW, /* 04 */\n\tNMD_X86_INSTRUCTION_VPHSUBW,    /* 05 */\n\tNMD_X86_INSTRUCTION_VPHSUBD,    /* 06 */\n\tNMD_X86_INSTRUCTION_VPHSUBSW,   /* 07 */\n\tNMD_X86_INSTRUCTION_VPSIGNB,    /* 08 */\n\tNMD_X86_INSTRUCTION_VPSIGNW,    /* 09 */\n\tNMD_X86_INSTRUCTION_VPSIGND,    /* 0A dup */\n\tNMD_X86_INSTRUCTION_VPMULHRSW,  /* 0B dup */\n\n\tNMD_X86_INSTRUCTION_VPHADDWQ,\n\tNMD_X86_INSTRUCTION_VPHADDDQ,\n\tNMD_X86_INSTRUCTION_BLSI,\n\tNMD_X86_INSTRUCTION_BLSIC,\n\tNMD_X86_INSTRUCTION_BLSMSK,\n\tNMD_X86_INSTRUCTION_BLSR,\n\tNMD_X86_INSTRUCTION_BSF,\n\tNMD_X86_INSTRUCTION_BZHI,\n\tNMD_X86_INSTRUCTION_CDQ,\n\tNMD_X86_INSTRUCTION_CDQE,\n\tNMD_X86_INSTRUCTION_CLFLUSHOPT,\n\tNMD_X86_INSTRUCTION_CMPSW,\n\tNMD_X86_INSTRUCTION_COMISD,\n\tNMD_X86_INSTRUCTION_COMISS,\n\tNMD_X86_INSTRUCTION_CVTDQ2PD,\n\tNMD_X86_INSTRUCTION_CVTPD2DQ,\n\tNMD_X86_INSTRUCTION_CVTSD2SI,\n\tNMD_X86_INSTRUCTION_CVTSI2SD,\n\tNMD_X86_INSTRUCTION_CVTSI2SS,\n\tNMD_X86_INSTRUCTION_CVTSS2SI,\n\tNMD_X86_INSTRUCTION_CVTTPD2DQ,\n\tNMD_X86_INSTRUCTION_CVTTSD2SI,\n\tNMD_X86_INSTRUCTION_CVTTSS2SI,\n\tNMD_X86_INSTRUCTION_DATA16,\n\tNMD_X86_INSTRUCTION_EXTRACTPS,\n\tNMD_X86_INSTRUCTION_EXTRQ,\n\tNMD_X86_INSTRUCTION_FCOMPP,\n\tNMD_X86_INSTRUCTION_FFREE,\n\tNMD_X86_INSTRUCTION_FNINIT,\n\tNMD_X86_INSTRUCTION_FNSTSW,\n\tNMD_X86_INSTRUCTION_FFREEP,\n\tNMD_X86_INSTRUCTION_FRSTOR,\n\tNMD_X86_INSTRUCTION_FNSAVE,\n\tNMD_X86_INSTRUCTION_FSETPM,\n\tNMD_X86_INSTRUCTION_FXRSTOR64,\n\tNMD_X86_INSTRUCTION_FXSAVE64,\n\tNMD_X86_INSTRUCTION_MOVAPS,\n\tNMD_X86_INSTRUCTION_VMOVAPD,\n\tNMD_X86_INSTRUCTION_VMOVAPS,\n\tNMD_X86_INSTRUCTION_HADDPD,\n\tNMD_X86_INSTRUCTION_HADDPS,\n\tNMD_X86_INSTRUCTION_HSUBPD,\n\tNMD_X86_INSTRUCTION_HSUBPS,\n\tNMD_X86_INSTRUCTION_IN,\n\tNMD_X86_INSTRUCTION_INSB,\n\tNMD_X86_INSTRUCTION_INSERTPS,\n\tNMD_X86_INSTRUCTION_INSERTQ,\n\tNMD_X86_INSTRUCTION_INT,\n\tNMD_X86_INSTRUCTION_INT3,\n\tNMD_X86_INSTRUCTION_INTO,\n\tNMD_X86_INSTRUCTION_IRET,\n\tNMD_X86_INSTRUCTION_IRETD,\n\tNMD_X86_INSTRUCTION_IRETQ,\n\tNMD_X86_INSTRUCTION_UCOMISD,\n\tNMD_X86_INSTRUCTION_UCOMISS,\n\tNMD_X86_INSTRUCTION_VCOMISD,\n\tNMD_X86_INSTRUCTION_VCOMISS,\n\tNMD_X86_INSTRUCTION_VCVTSD2SS,\n\tNMD_X86_INSTRUCTION_VCVTSI2SD,\n\tNMD_X86_INSTRUCTION_VCVTSI2SS,\n\tNMD_X86_INSTRUCTION_VCVTSS2SD,\n\tNMD_X86_INSTRUCTION_VCVTTSD2SI,\n\tNMD_X86_INSTRUCTION_VCVTTSD2USI,\n\tNMD_X86_INSTRUCTION_VCVTTSS2SI,\n\tNMD_X86_INSTRUCTION_VCVTTSS2USI,\n\tNMD_X86_INSTRUCTION_VCVTUSI2SD,\n\tNMD_X86_INSTRUCTION_VCVTUSI2SS,\n\tNMD_X86_INSTRUCTION_VUCOMISD,\n\tNMD_X86_INSTRUCTION_VUCOMISS,\n\tNMD_X86_INSTRUCTION_JCXZ,\n\tNMD_X86_INSTRUCTION_JECXZ,\n\tNMD_X86_INSTRUCTION_KANDB,\n\tNMD_X86_INSTRUCTION_KANDD,\n\tNMD_X86_INSTRUCTION_KANDNB,\n\tNMD_X86_INSTRUCTION_KANDND,\n\tNMD_X86_INSTRUCTION_KANDNQ,\n\tNMD_X86_INSTRUCTION_KANDNW,\n\tNMD_X86_INSTRUCTION_KANDQ,\n\tNMD_X86_INSTRUCTION_KANDW,\n\tNMD_X86_INSTRUCTION_KMOVB,\n\tNMD_X86_INSTRUCTION_KMOVD,\n\tNMD_X86_INSTRUCTION_KMOVQ,\n\tNMD_X86_INSTRUCTION_KMOVW,\n\tNMD_X86_INSTRUCTION_KNOTB,\n\tNMD_X86_INSTRUCTION_KNOTD,\n\tNMD_X86_INSTRUCTION_KNOTQ,\n\tNMD_X86_INSTRUCTION_KNOTW,\n\tNMD_X86_INSTRUCTION_KORB,\n\tNMD_X86_INSTRUCTION_KORD,\n\tNMD_X86_INSTRUCTION_KORQ,\n\tNMD_X86_INSTRUCTION_KORTESTB,\n\tNMD_X86_INSTRUCTION_KORTESTD,\n\tNMD_X86_INSTRUCTION_KORTESTQ,\n\tNMD_X86_INSTRUCTION_KORTESTW,\n\tNMD_X86_INSTRUCTION_KORW,\n\tNMD_X86_INSTRUCTION_KSHIFTLB,\n\tNMD_X86_INSTRUCTION_KSHIFTLD,\n\tNMD_X86_INSTRUCTION_KSHIFTLQ,\n\tNMD_X86_INSTRUCTION_KSHIFTLW,\n\tNMD_X86_INSTRUCTION_KSHIFTRB,\n\tNMD_X86_INSTRUCTION_KSHIFTRD,\n\tNMD_X86_INSTRUCTION_KSHIFTRQ,\n\tNMD_X86_INSTRUCTION_KSHIFTRW,\n\tNMD_X86_INSTRUCTION_KUNPCKBW,\n\tNMD_X86_INSTRUCTION_KXNORB,\n\tNMD_X86_INSTRUCTION_KXNORD,\n\tNMD_X86_INSTRUCTION_KXNORQ,\n\tNMD_X86_INSTRUCTION_KXNORW,\n\tNMD_X86_INSTRUCTION_KXORB,\n\tNMD_X86_INSTRUCTION_KXORD,\n\tNMD_X86_INSTRUCTION_KXORQ,\n\tNMD_X86_INSTRUCTION_KXORW,\n\tNMD_X86_INSTRUCTION_LAHF,\n\tNMD_X86_INSTRUCTION_LDS,\n\tNMD_X86_INSTRUCTION_LEA,\n\tNMD_X86_INSTRUCTION_LEAVE,\n\tNMD_X86_INSTRUCTION_LES,\n\tNMD_X86_INSTRUCTION_LODSB,\n\tNMD_X86_INSTRUCTION_LODSD,\n\tNMD_X86_INSTRUCTION_LODSQ,\n\tNMD_X86_INSTRUCTION_LODSW,\n\tNMD_X86_INSTRUCTION_RETF,\n\tNMD_X86_INSTRUCTION_XADD,\n\tNMD_X86_INSTRUCTION_LZCNT,\n\tNMD_X86_INSTRUCTION_MASKMOVDQU,\n\tNMD_X86_INSTRUCTION_CVTPD2PI,\n\tNMD_X86_INSTRUCTION_CVTPI2PD,\n\tNMD_X86_INSTRUCTION_CVTPI2PS,\n\tNMD_X86_INSTRUCTION_CVTPS2PI,\n\tNMD_X86_INSTRUCTION_CVTTPD2PI,\n\tNMD_X86_INSTRUCTION_CVTTPS2PI,\n\tNMD_X86_INSTRUCTION_EMMS,\n\tNMD_X86_INSTRUCTION_MASKMOVQ,\n\tNMD_X86_INSTRUCTION_MOVD,\n\tNMD_X86_INSTRUCTION_MOVDQ2Q,\n\tNMD_X86_INSTRUCTION_MOVNTQ,\n\tNMD_X86_INSTRUCTION_MOVQ2DQ,\n\tNMD_X86_INSTRUCTION_MOVQ,\n\tNMD_X86_INSTRUCTION_PSHUFW,\n\tNMD_X86_INSTRUCTION_MONTMUL,\n\tNMD_X86_INSTRUCTION_MOV,\n\tNMD_X86_INSTRUCTION_MOVABS,\n\tNMD_X86_INSTRUCTION_MOVBE,\n\tNMD_X86_INSTRUCTION_MOVDDUP,\n\tNMD_X86_INSTRUCTION_MOVDQA,\n\tNMD_X86_INSTRUCTION_MOVDQU,\n\tNMD_X86_INSTRUCTION_MOVHLPS,\n\tNMD_X86_INSTRUCTION_MOVHPD,\n\tNMD_X86_INSTRUCTION_MOVHPS,\n\tNMD_X86_INSTRUCTION_MOVLHPS,\n\tNMD_X86_INSTRUCTION_MOVLPD,\n\tNMD_X86_INSTRUCTION_MOVLPS,\n\tNMD_X86_INSTRUCTION_MOVNTDQ,\n\tNMD_X86_INSTRUCTION_MOVNTPD,\n\tNMD_X86_INSTRUCTION_MOVNTPS,\n\tNMD_X86_INSTRUCTION_MOVNTSD,\n\tNMD_X86_INSTRUCTION_MOVNTSS,\n\tNMD_X86_INSTRUCTION_MOVSB,\n\tNMD_X86_INSTRUCTION_MOVSD,\n\tNMD_X86_INSTRUCTION_MOVSHDUP,\n\tNMD_X86_INSTRUCTION_MOVSLDUP,\n\tNMD_X86_INSTRUCTION_MOVSQ,\n\tNMD_X86_INSTRUCTION_MOVSS,\n\tNMD_X86_INSTRUCTION_MOVSW,\n\tNMD_X86_INSTRUCTION_MOVSX,\n\tNMD_X86_INSTRUCTION_MOVSXD,\n\tNMD_X86_INSTRUCTION_MOVUPD,\n\tNMD_X86_INSTRUCTION_MOVUPS,\n\tNMD_X86_INSTRUCTION_MOVZX,\n\tNMD_X86_INSTRUCTION_MULX,\n\tNMD_X86_INSTRUCTION_NOP,\n\tNMD_X86_INSTRUCTION_OUT,\n\tNMD_X86_INSTRUCTION_OUTSB,\n\tNMD_X86_INSTRUCTION_OUTSD,\n\tNMD_X86_INSTRUCTION_OUTSW,\n\tNMD_X86_INSTRUCTION_PAUSE,\n\tNMD_X86_INSTRUCTION_PAVGUSB,\n\tNMD_X86_INSTRUCTION_PBLENDVB,\n\tNMD_X86_INSTRUCTION_PCOMMIT,\n\tNMD_X86_INSTRUCTION_PDEP,\n\tNMD_X86_INSTRUCTION_PEXT,\n\tNMD_X86_INSTRUCTION_PEXTRB,\n\tNMD_X86_INSTRUCTION_PEXTRD,\n\tNMD_X86_INSTRUCTION_PEXTRQ,\n\tNMD_X86_INSTRUCTION_PF2ID,\n\tNMD_X86_INSTRUCTION_PF2IW,\n\tNMD_X86_INSTRUCTION_PFACC,\n\tNMD_X86_INSTRUCTION_PFADD,\n\tNMD_X86_INSTRUCTION_BLENDVPS, /* padding*/\n\tNMD_X86_INSTRUCTION_PFCMPEQ,\n\tNMD_X86_INSTRUCTION_PFCMPGE,\n\tNMD_X86_INSTRUCTION_PFCMPGT,\n\tNMD_X86_INSTRUCTION_PFMAX,\n\tNMD_X86_INSTRUCTION_PFMIN,\n\tNMD_X86_INSTRUCTION_PFMUL,\n\tNMD_X86_INSTRUCTION_PFNACC,\n\tNMD_X86_INSTRUCTION_PFPNACC,\n\tNMD_X86_INSTRUCTION_PFRCPIT1,\n\tNMD_X86_INSTRUCTION_PFRCPIT2,\n\tNMD_X86_INSTRUCTION_PFRCP,\n\tNMD_X86_INSTRUCTION_PFRSQIT1,\n\tNMD_X86_INSTRUCTION_PFRSQRT,\n\tNMD_X86_INSTRUCTION_PFSUBR,\n\tNMD_X86_INSTRUCTION_PFSUB,\n\tNMD_X86_INSTRUCTION_PHMINPOSUW,\n\tNMD_X86_INSTRUCTION_PI2FD,\n\tNMD_X86_INSTRUCTION_PI2FW,\n\tNMD_X86_INSTRUCTION_PINSRB,\n\tNMD_X86_INSTRUCTION_PINSRD,\n\tNMD_X86_INSTRUCTION_PINSRQ,\n\tNMD_X86_INSTRUCTION_PMULHRW,\n\tNMD_X86_INSTRUCTION_PMULLD,\n\tNMD_X86_INSTRUCTION_POP,\n\tNMD_X86_INSTRUCTION_POPA,\n\tNMD_X86_INSTRUCTION_POPAD,\n\tNMD_X86_INSTRUCTION_POPCNT,\n\tNMD_X86_INSTRUCTION_POPF,\n\tNMD_X86_INSTRUCTION_POPFD,\n\tNMD_X86_INSTRUCTION_POPFQ,\n\tNMD_X86_INSTRUCTION_PREFETCH,\n\tNMD_X86_INSTRUCTION_PREFETCHNTA,\n\tNMD_X86_INSTRUCTION_PREFETCHT0,\n\tNMD_X86_INSTRUCTION_PREFETCHT1,\n\tNMD_X86_INSTRUCTION_PREFETCHT2,\n\tNMD_X86_INSTRUCTION_PSHUFD,\n\tNMD_X86_INSTRUCTION_PSHUFHW,\n\tNMD_X86_INSTRUCTION_PSHUFLW,\n\tNMD_X86_INSTRUCTION_PSLLDQ,\n\tNMD_X86_INSTRUCTION_PSRLDQ,\n\tNMD_X86_INSTRUCTION_PSWAPD,\n\tNMD_X86_INSTRUCTION_PTEST,\n\tNMD_X86_INSTRUCTION_PUSHA,\n\tNMD_X86_INSTRUCTION_PUSHAD,\n\tNMD_X86_INSTRUCTION_PUSHF,\n\tNMD_X86_INSTRUCTION_PUSHFD,\n\tNMD_X86_INSTRUCTION_PUSHFQ,\n\tNMD_X86_INSTRUCTION_RDRAND,\n\tNMD_X86_INSTRUCTION_RDPID,\n\tNMD_X86_INSTRUCTION_RDSEED,\n\tNMD_X86_INSTRUCTION_RDTSCP,\n\tNMD_X86_INSTRUCTION_RORX,\n\tNMD_X86_INSTRUCTION_RSM,\n\tNMD_X86_INSTRUCTION_SAHF,\n\tNMD_X86_INSTRUCTION_SAL,\n\tNMD_X86_INSTRUCTION_SARX,\n\tNMD_X86_INSTRUCTION_SCASB,\n\tNMD_X86_INSTRUCTION_SCASD,\n\tNMD_X86_INSTRUCTION_SCASQ,\n\tNMD_X86_INSTRUCTION_SCASW,\n\tNMD_X86_INSTRUCTION_SHA1RNDS4,\n\tNMD_X86_INSTRUCTION_SHLD,\n\tNMD_X86_INSTRUCTION_SHLX,\n\tNMD_X86_INSTRUCTION_SHRD,\n\tNMD_X86_INSTRUCTION_SHRX,\n\tNMD_X86_INSTRUCTION_SHUFPD,\n\tNMD_X86_INSTRUCTION_SHUFPS,\n\tNMD_X86_INSTRUCTION_STOSB,\n\tNMD_X86_INSTRUCTION_STOSD,\n\tNMD_X86_INSTRUCTION_STOSQ,\n\tNMD_X86_INSTRUCTION_STOSW,\n\tNMD_X86_INSTRUCTION_FSTPNCE,\n\tNMD_X86_INSTRUCTION_FXCH,\n\tNMD_X86_INSTRUCTION_SWAPGS,\n\tNMD_X86_INSTRUCTION_T1MSKC,\n\tNMD_X86_INSTRUCTION_TZCNT,\n\tNMD_X86_INSTRUCTION_TZMSK,\n\tNMD_X86_INSTRUCTION_FUCOMIP,\n\tNMD_X86_INSTRUCTION_FUCOMPP,\n\tNMD_X86_INSTRUCTION_FUCOMP,\n\tNMD_X86_INSTRUCTION_FUCOM,\n\tNMD_X86_INSTRUCTION_UD1,\n\tNMD_X86_INSTRUCTION_UNPCKHPD,\n\tNMD_X86_INSTRUCTION_UNPCKHPS,\n\tNMD_X86_INSTRUCTION_UNPCKLPD,\n\tNMD_X86_INSTRUCTION_UNPCKLPS,\n\tNMD_X86_INSTRUCTION_VADDPD,\n\tNMD_X86_INSTRUCTION_VADDPS,\n\tNMD_X86_INSTRUCTION_VADDSD,\n\tNMD_X86_INSTRUCTION_VADDSS,\n\tNMD_X86_INSTRUCTION_VADDSUBPD,\n\tNMD_X86_INSTRUCTION_VADDSUBPS,\n\tNMD_X86_INSTRUCTION_VAESDECLAST,\n\tNMD_X86_INSTRUCTION_VAESDEC,\n\tNMD_X86_INSTRUCTION_VAESENCLAST,\n\tNMD_X86_INSTRUCTION_VAESENC,\n\tNMD_X86_INSTRUCTION_VAESIMC,\n\tNMD_X86_INSTRUCTION_VAESKEYGENASSIST,\n\tNMD_X86_INSTRUCTION_VALIGND,\n\tNMD_X86_INSTRUCTION_VALIGNQ,\n\tNMD_X86_INSTRUCTION_VANDNPD,\n\tNMD_X86_INSTRUCTION_VANDNPS,\n\tNMD_X86_INSTRUCTION_VANDPD,\n\tNMD_X86_INSTRUCTION_VANDPS,\n\tNMD_X86_INSTRUCTION_VBLENDMPD,\n\tNMD_X86_INSTRUCTION_VBLENDMPS,\n\tNMD_X86_INSTRUCTION_VBLENDPD,\n\tNMD_X86_INSTRUCTION_VBLENDPS,\n\tNMD_X86_INSTRUCTION_VBLENDVPD,\n\tNMD_X86_INSTRUCTION_VBLENDVPS,\n\tNMD_X86_INSTRUCTION_VBROADCASTF128,\n\tNMD_X86_INSTRUCTION_VBROADCASTI32X4,\n\tNMD_X86_INSTRUCTION_VBROADCASTI64X4,\n\tNMD_X86_INSTRUCTION_VBROADCASTSD,\n\tNMD_X86_INSTRUCTION_VBROADCASTSS,\n\tNMD_X86_INSTRUCTION_VCOMPRESSPD,\n\tNMD_X86_INSTRUCTION_VCOMPRESSPS,\n\tNMD_X86_INSTRUCTION_VCVTDQ2PD,\n\tNMD_X86_INSTRUCTION_VCVTDQ2PS,\n\tNMD_X86_INSTRUCTION_VCVTPD2DQX,\n\tNMD_X86_INSTRUCTION_VCVTPD2DQ,\n\tNMD_X86_INSTRUCTION_VCVTPD2PSX,\n\tNMD_X86_INSTRUCTION_VCVTPD2PS,\n\tNMD_X86_INSTRUCTION_VCVTPD2UDQ,\n\tNMD_X86_INSTRUCTION_VCVTPH2PS,\n\tNMD_X86_INSTRUCTION_VCVTPS2DQ,\n\tNMD_X86_INSTRUCTION_VCVTPS2PD,\n\tNMD_X86_INSTRUCTION_VCVTPS2PH,\n\tNMD_X86_INSTRUCTION_VCVTPS2UDQ,\n\tNMD_X86_INSTRUCTION_VCVTSD2SI,\n\tNMD_X86_INSTRUCTION_VCVTSD2USI,\n\tNMD_X86_INSTRUCTION_VCVTSS2SI,\n\tNMD_X86_INSTRUCTION_VCVTSS2USI,\n\tNMD_X86_INSTRUCTION_VCVTTPD2DQX,\n\tNMD_X86_INSTRUCTION_VCVTTPD2DQ,\n\tNMD_X86_INSTRUCTION_VCVTTPD2UDQ,\n\tNMD_X86_INSTRUCTION_VCVTTPS2DQ,\n\tNMD_X86_INSTRUCTION_VCVTTPS2UDQ,\n\tNMD_X86_INSTRUCTION_VCVTUDQ2PD,\n\tNMD_X86_INSTRUCTION_VCVTUDQ2PS,\n\tNMD_X86_INSTRUCTION_VDIVPD,\n\tNMD_X86_INSTRUCTION_VDIVPS,\n\tNMD_X86_INSTRUCTION_VDIVSD,\n\tNMD_X86_INSTRUCTION_VDIVSS,\n\tNMD_X86_INSTRUCTION_VDPPD,\n\tNMD_X86_INSTRUCTION_VDPPS,\n\tNMD_X86_INSTRUCTION_VEXP2PD,\n\tNMD_X86_INSTRUCTION_VEXP2PS,\n\tNMD_X86_INSTRUCTION_VEXPANDPD,\n\tNMD_X86_INSTRUCTION_VEXPANDPS,\n\tNMD_X86_INSTRUCTION_VEXTRACTF128,\n\tNMD_X86_INSTRUCTION_VEXTRACTF32X4,\n\tNMD_X86_INSTRUCTION_VEXTRACTF64X4,\n\tNMD_X86_INSTRUCTION_VEXTRACTI128,\n\tNMD_X86_INSTRUCTION_VEXTRACTI32X4,\n\tNMD_X86_INSTRUCTION_VEXTRACTI64X4,\n\tNMD_X86_INSTRUCTION_VEXTRACTPS,\n\tNMD_X86_INSTRUCTION_VFMADD132PD,\n\tNMD_X86_INSTRUCTION_VFMADD132PS,\n\tNMD_X86_INSTRUCTION_VFMADDPD,\n\tNMD_X86_INSTRUCTION_VFMADD213PD,\n\tNMD_X86_INSTRUCTION_VFMADD231PD,\n\tNMD_X86_INSTRUCTION_VFMADDPS,\n\tNMD_X86_INSTRUCTION_VFMADD213PS,\n\tNMD_X86_INSTRUCTION_VFMADD231PS,\n\tNMD_X86_INSTRUCTION_VFMADDSD,\n\tNMD_X86_INSTRUCTION_VFMADD213SD,\n\tNMD_X86_INSTRUCTION_VFMADD132SD,\n\tNMD_X86_INSTRUCTION_VFMADD231SD,\n\tNMD_X86_INSTRUCTION_VFMADDSS,\n\tNMD_X86_INSTRUCTION_VFMADD213SS,\n\tNMD_X86_INSTRUCTION_VFMADD132SS,\n\tNMD_X86_INSTRUCTION_VFMADD231SS,\n\tNMD_X86_INSTRUCTION_VFMADDSUB132PD,\n\tNMD_X86_INSTRUCTION_VFMADDSUB132PS,\n\tNMD_X86_INSTRUCTION_VFMADDSUBPD,\n\tNMD_X86_INSTRUCTION_VFMADDSUB213PD,\n\tNMD_X86_INSTRUCTION_VFMADDSUB231PD,\n\tNMD_X86_INSTRUCTION_VFMADDSUBPS,\n\tNMD_X86_INSTRUCTION_VFMADDSUB213PS,\n\tNMD_X86_INSTRUCTION_VFMADDSUB231PS,\n\tNMD_X86_INSTRUCTION_VFMSUB132PD,\n\tNMD_X86_INSTRUCTION_VFMSUB132PS,\n\tNMD_X86_INSTRUCTION_VFMSUBADD132PD,\n\tNMD_X86_INSTRUCTION_VFMSUBADD132PS,\n\tNMD_X86_INSTRUCTION_VFMSUBADDPD,\n\tNMD_X86_INSTRUCTION_VFMSUBADD213PD,\n\tNMD_X86_INSTRUCTION_VFMSUBADD231PD,\n\tNMD_X86_INSTRUCTION_VFMSUBADDPS,\n\tNMD_X86_INSTRUCTION_VFMSUBADD213PS,\n\tNMD_X86_INSTRUCTION_VFMSUBADD231PS,\n\tNMD_X86_INSTRUCTION_VFMSUBPD,\n\tNMD_X86_INSTRUCTION_VFMSUB213PD,\n\tNMD_X86_INSTRUCTION_VFMSUB231PD,\n\tNMD_X86_INSTRUCTION_VFMSUBPS,\n\tNMD_X86_INSTRUCTION_VFMSUB213PS,\n\tNMD_X86_INSTRUCTION_VFMSUB231PS,\n\tNMD_X86_INSTRUCTION_VFMSUBSD,\n\tNMD_X86_INSTRUCTION_VFMSUB213SD,\n\tNMD_X86_INSTRUCTION_VFMSUB132SD,\n\tNMD_X86_INSTRUCTION_VFMSUB231SD,\n\tNMD_X86_INSTRUCTION_VFMSUBSS,\n\tNMD_X86_INSTRUCTION_VFMSUB213SS,\n\tNMD_X86_INSTRUCTION_VFMSUB132SS,\n\tNMD_X86_INSTRUCTION_VFMSUB231SS,\n\tNMD_X86_INSTRUCTION_VFNMADD132PD,\n\tNMD_X86_INSTRUCTION_VFNMADD132PS,\n\tNMD_X86_INSTRUCTION_VFNMADDPD,\n\tNMD_X86_INSTRUCTION_VFNMADD213PD,\n\tNMD_X86_INSTRUCTION_VFNMADD231PD,\n\tNMD_X86_INSTRUCTION_VFNMADDPS,\n\tNMD_X86_INSTRUCTION_VFNMADD213PS,\n\tNMD_X86_INSTRUCTION_VFNMADD231PS,\n\tNMD_X86_INSTRUCTION_VFNMADDSD,\n\tNMD_X86_INSTRUCTION_VFNMADD213SD,\n\tNMD_X86_INSTRUCTION_VFNMADD132SD,\n\tNMD_X86_INSTRUCTION_VFNMADD231SD,\n\tNMD_X86_INSTRUCTION_VFNMADDSS,\n\tNMD_X86_INSTRUCTION_VFNMADD213SS,\n\tNMD_X86_INSTRUCTION_VFNMADD132SS,\n\tNMD_X86_INSTRUCTION_VFNMADD231SS,\n\tNMD_X86_INSTRUCTION_VFNMSUB132PD,\n\tNMD_X86_INSTRUCTION_VFNMSUB132PS,\n\tNMD_X86_INSTRUCTION_VFNMSUBPD,\n\tNMD_X86_INSTRUCTION_VFNMSUB213PD,\n\tNMD_X86_INSTRUCTION_VFNMSUB231PD,\n\tNMD_X86_INSTRUCTION_VFNMSUBPS,\n\tNMD_X86_INSTRUCTION_VFNMSUB213PS,\n\tNMD_X86_INSTRUCTION_VFNMSUB231PS,\n\tNMD_X86_INSTRUCTION_VFNMSUBSD,\n\tNMD_X86_INSTRUCTION_VFNMSUB213SD,\n\tNMD_X86_INSTRUCTION_VFNMSUB132SD,\n\tNMD_X86_INSTRUCTION_VFNMSUB231SD,\n\tNMD_X86_INSTRUCTION_VFNMSUBSS,\n\tNMD_X86_INSTRUCTION_VFNMSUB213SS,\n\tNMD_X86_INSTRUCTION_VFNMSUB132SS,\n\tNMD_X86_INSTRUCTION_VFNMSUB231SS,\n\tNMD_X86_INSTRUCTION_VFRCZPD,\n\tNMD_X86_INSTRUCTION_VFRCZPS,\n\tNMD_X86_INSTRUCTION_VFRCZSD,\n\tNMD_X86_INSTRUCTION_VFRCZSS,\n\tNMD_X86_INSTRUCTION_VORPD,\n\tNMD_X86_INSTRUCTION_VORPS,\n\tNMD_X86_INSTRUCTION_VXORPD,\n\tNMD_X86_INSTRUCTION_VXORPS,\n\tNMD_X86_INSTRUCTION_VGATHERDPD,\n\tNMD_X86_INSTRUCTION_VGATHERDPS,\n\tNMD_X86_INSTRUCTION_VGATHERPF0DPD,\n\tNMD_X86_INSTRUCTION_VGATHERPF0DPS,\n\tNMD_X86_INSTRUCTION_VGATHERPF0QPD,\n\tNMD_X86_INSTRUCTION_VGATHERPF0QPS,\n\tNMD_X86_INSTRUCTION_VGATHERPF1DPD,\n\tNMD_X86_INSTRUCTION_VGATHERPF1DPS,\n\tNMD_X86_INSTRUCTION_VGATHERPF1QPD,\n\tNMD_X86_INSTRUCTION_VGATHERPF1QPS,\n\tNMD_X86_INSTRUCTION_VGATHERQPD,\n\tNMD_X86_INSTRUCTION_VGATHERQPS,\n\tNMD_X86_INSTRUCTION_VHADDPD,\n\tNMD_X86_INSTRUCTION_VHADDPS,\n\tNMD_X86_INSTRUCTION_VHSUBPD,\n\tNMD_X86_INSTRUCTION_VHSUBPS,\n\tNMD_X86_INSTRUCTION_VINSERTF128,\n\tNMD_X86_INSTRUCTION_VINSERTF32X4,\n\tNMD_X86_INSTRUCTION_VINSERTF32X8,\n\tNMD_X86_INSTRUCTION_VINSERTF64X2,\n\tNMD_X86_INSTRUCTION_VINSERTF64X4,\n\tNMD_X86_INSTRUCTION_VINSERTI128,\n\tNMD_X86_INSTRUCTION_VINSERTI32X4,\n\tNMD_X86_INSTRUCTION_VINSERTI32X8,\n\tNMD_X86_INSTRUCTION_VINSERTI64X2,\n\tNMD_X86_INSTRUCTION_VINSERTI64X4,\n\tNMD_X86_INSTRUCTION_VINSERTPS,\n\tNMD_X86_INSTRUCTION_VLDDQU,\n\tNMD_X86_INSTRUCTION_VLDMXCSR,\n\tNMD_X86_INSTRUCTION_VMASKMOVDQU,\n\tNMD_X86_INSTRUCTION_VMASKMOVPD,\n\tNMD_X86_INSTRUCTION_VMASKMOVPS,\n\tNMD_X86_INSTRUCTION_VMAXPD,\n\tNMD_X86_INSTRUCTION_VMAXPS,\n\tNMD_X86_INSTRUCTION_VMAXSD,\n\tNMD_X86_INSTRUCTION_VMAXSS,\n\tNMD_X86_INSTRUCTION_VMCLEAR,\n\tNMD_X86_INSTRUCTION_VMINPD,\n\tNMD_X86_INSTRUCTION_VMINPS,\n\tNMD_X86_INSTRUCTION_VMINSD,\n\tNMD_X86_INSTRUCTION_VMINSS,\n\tNMD_X86_INSTRUCTION_VMOVQ,\n\tNMD_X86_INSTRUCTION_VMOVDDUP,\n\tNMD_X86_INSTRUCTION_VMOVD,\n\tNMD_X86_INSTRUCTION_VMOVDQA32,\n\tNMD_X86_INSTRUCTION_VMOVDQA64,\n\tNMD_X86_INSTRUCTION_VMOVDQA,\n\tNMD_X86_INSTRUCTION_VMOVDQU16,\n\tNMD_X86_INSTRUCTION_VMOVDQU32,\n\tNMD_X86_INSTRUCTION_VMOVDQU64,\n\tNMD_X86_INSTRUCTION_VMOVDQU8,\n\tNMD_X86_INSTRUCTION_VMOVDQU,\n\tNMD_X86_INSTRUCTION_VMOVHLPS,\n\tNMD_X86_INSTRUCTION_VMOVHPD,\n\tNMD_X86_INSTRUCTION_VMOVHPS,\n\tNMD_X86_INSTRUCTION_VMOVLHPS,\n\tNMD_X86_INSTRUCTION_VMOVLPD,\n\tNMD_X86_INSTRUCTION_VMOVLPS,\n\tNMD_X86_INSTRUCTION_VMOVMSKPD,\n\tNMD_X86_INSTRUCTION_VMOVMSKPS,\n\tNMD_X86_INSTRUCTION_VMOVNTDQA,\n\tNMD_X86_INSTRUCTION_VMOVNTDQ,\n\tNMD_X86_INSTRUCTION_VMOVNTPD,\n\tNMD_X86_INSTRUCTION_VMOVNTPS,\n\tNMD_X86_INSTRUCTION_VMOVSD,\n\tNMD_X86_INSTRUCTION_VMOVSHDUP,\n\tNMD_X86_INSTRUCTION_VMOVSLDUP,\n\tNMD_X86_INSTRUCTION_VMOVSS,\n\tNMD_X86_INSTRUCTION_VMOVUPD,\n\tNMD_X86_INSTRUCTION_VMOVUPS,\n\tNMD_X86_INSTRUCTION_VMPSADBW,\n\tNMD_X86_INSTRUCTION_VMPTRLD,\n\tNMD_X86_INSTRUCTION_VMPTRST,\n\tNMD_X86_INSTRUCTION_VMREAD,\n\tNMD_X86_INSTRUCTION_VMULPD,\n\tNMD_X86_INSTRUCTION_VMULPS,\n\tNMD_X86_INSTRUCTION_VMULSD,\n\tNMD_X86_INSTRUCTION_VMULSS,\n\tNMD_X86_INSTRUCTION_VMWRITE,\n\tNMD_X86_INSTRUCTION_VMXON,\n\tNMD_X86_INSTRUCTION_VPABSB,\n\tNMD_X86_INSTRUCTION_VPABSD,\n\tNMD_X86_INSTRUCTION_VPABSQ,\n\tNMD_X86_INSTRUCTION_VPABSW,\n\tNMD_X86_INSTRUCTION_VPACKSSDW,\n\tNMD_X86_INSTRUCTION_VPACKSSWB,\n\tNMD_X86_INSTRUCTION_VPACKUSDW,\n\tNMD_X86_INSTRUCTION_VPACKUSWB,\n\tNMD_X86_INSTRUCTION_VPADDB,\n\tNMD_X86_INSTRUCTION_VPADDD,\n\tNMD_X86_INSTRUCTION_VPADDQ,\n\tNMD_X86_INSTRUCTION_VPADDSB,\n\tNMD_X86_INSTRUCTION_VPADDSW,\n\tNMD_X86_INSTRUCTION_VPADDUSB,\n\tNMD_X86_INSTRUCTION_VPADDUSW,\n\tNMD_X86_INSTRUCTION_VPADDW,\n\tNMD_X86_INSTRUCTION_VPALIGNR,\n\tNMD_X86_INSTRUCTION_VPANDD,\n\tNMD_X86_INSTRUCTION_VPANDND,\n\tNMD_X86_INSTRUCTION_VPANDNQ,\n\tNMD_X86_INSTRUCTION_VPANDN,\n\tNMD_X86_INSTRUCTION_VPANDQ,\n\tNMD_X86_INSTRUCTION_VPAND,\n\tNMD_X86_INSTRUCTION_VPAVGB,\n\tNMD_X86_INSTRUCTION_VPAVGW,\n\tNMD_X86_INSTRUCTION_VPBLENDD,\n\tNMD_X86_INSTRUCTION_VPBLENDMB,\n\tNMD_X86_INSTRUCTION_VPBLENDMD,\n\tNMD_X86_INSTRUCTION_VPBLENDMQ,\n\tNMD_X86_INSTRUCTION_VPBLENDMW,\n\tNMD_X86_INSTRUCTION_VPBLENDVB,\n\tNMD_X86_INSTRUCTION_VPBLENDW,\n\tNMD_X86_INSTRUCTION_VPBROADCASTB,\n\tNMD_X86_INSTRUCTION_VPBROADCASTD,\n\tNMD_X86_INSTRUCTION_VPBROADCASTMB2Q,\n\tNMD_X86_INSTRUCTION_VPBROADCASTMW2D,\n\tNMD_X86_INSTRUCTION_VPBROADCASTQ,\n\tNMD_X86_INSTRUCTION_VPBROADCASTW,\n\tNMD_X86_INSTRUCTION_VPCLMULQDQ,\n\tNMD_X86_INSTRUCTION_VPCMOV,\n\tNMD_X86_INSTRUCTION_VPCMPB,\n\tNMD_X86_INSTRUCTION_VPCMPD,\n\tNMD_X86_INSTRUCTION_VPCMPEQB,\n\tNMD_X86_INSTRUCTION_VPCMPEQD,\n\tNMD_X86_INSTRUCTION_VPCMPEQQ,\n\tNMD_X86_INSTRUCTION_VPCMPEQW,\n\tNMD_X86_INSTRUCTION_VPCMPESTRI,\n\tNMD_X86_INSTRUCTION_VPCMPESTRM,\n\tNMD_X86_INSTRUCTION_VPCMPGTB,\n\tNMD_X86_INSTRUCTION_VPCMPGTD,\n\tNMD_X86_INSTRUCTION_VPCMPGTW,\n\tNMD_X86_INSTRUCTION_VPCMPISTRI,\n\tNMD_X86_INSTRUCTION_VPCMPISTRM,\n\tNMD_X86_INSTRUCTION_VPCMPQ,\n\tNMD_X86_INSTRUCTION_VPCMPUB,\n\tNMD_X86_INSTRUCTION_VPCMPUD,\n\tNMD_X86_INSTRUCTION_VPCMPUQ,\n\tNMD_X86_INSTRUCTION_VPCMPUW,\n\tNMD_X86_INSTRUCTION_VPCMPW,\n\tNMD_X86_INSTRUCTION_VPCOMB,\n\tNMD_X86_INSTRUCTION_VPCOMD,\n\tNMD_X86_INSTRUCTION_VPCOMPRESSD,\n\tNMD_X86_INSTRUCTION_VPCOMPRESSQ,\n\tNMD_X86_INSTRUCTION_VPCOMQ,\n\tNMD_X86_INSTRUCTION_VPCOMUB,\n\tNMD_X86_INSTRUCTION_VPCOMUD,\n\tNMD_X86_INSTRUCTION_VPCOMUQ,\n\tNMD_X86_INSTRUCTION_VPCOMUW,\n\tNMD_X86_INSTRUCTION_VPCOMW,\n\tNMD_X86_INSTRUCTION_VPCONFLICTD,\n\tNMD_X86_INSTRUCTION_VPCONFLICTQ,\n\tNMD_X86_INSTRUCTION_VPERM2F128,\n\tNMD_X86_INSTRUCTION_VPERM2I128,\n\tNMD_X86_INSTRUCTION_VPERMD,\n\tNMD_X86_INSTRUCTION_VPERMI2D,\n\tNMD_X86_INSTRUCTION_VPERMI2PD,\n\tNMD_X86_INSTRUCTION_VPERMI2PS,\n\tNMD_X86_INSTRUCTION_VPERMI2Q,\n\tNMD_X86_INSTRUCTION_VPERMIL2PD,\n\tNMD_X86_INSTRUCTION_VPERMIL2PS,\n\tNMD_X86_INSTRUCTION_VPERMILPD,\n\tNMD_X86_INSTRUCTION_VPERMILPS,\n\tNMD_X86_INSTRUCTION_VPERMPD,\n\tNMD_X86_INSTRUCTION_VPERMPS,\n\tNMD_X86_INSTRUCTION_VPERMQ,\n\tNMD_X86_INSTRUCTION_VPERMT2D,\n\tNMD_X86_INSTRUCTION_VPERMT2PD,\n\tNMD_X86_INSTRUCTION_VPERMT2PS,\n\tNMD_X86_INSTRUCTION_VPERMT2Q,\n\tNMD_X86_INSTRUCTION_VPEXPANDD,\n\tNMD_X86_INSTRUCTION_VPEXPANDQ,\n\tNMD_X86_INSTRUCTION_VPEXTRB,\n\tNMD_X86_INSTRUCTION_VPEXTRD,\n\tNMD_X86_INSTRUCTION_VPEXTRQ,\n\tNMD_X86_INSTRUCTION_VPEXTRW,\n\tNMD_X86_INSTRUCTION_VPGATHERDD,\n\tNMD_X86_INSTRUCTION_VPGATHERDQ,\n\tNMD_X86_INSTRUCTION_VPGATHERQD,\n\tNMD_X86_INSTRUCTION_VPGATHERQQ,\n\tNMD_X86_INSTRUCTION_VPHADDBD,\n\tNMD_X86_INSTRUCTION_VPHADDBQ,\n\tNMD_X86_INSTRUCTION_VPHADDBW,\n\tNMD_X86_INSTRUCTION_VPHADDUBD,\n\tNMD_X86_INSTRUCTION_VPHADDUBQ,\n\tNMD_X86_INSTRUCTION_VPHADDUBW,\n\tNMD_X86_INSTRUCTION_VPHADDUDQ,\n\tNMD_X86_INSTRUCTION_VPHADDUWD,\n\tNMD_X86_INSTRUCTION_VPHADDUWQ,\n\tNMD_X86_INSTRUCTION_VPHADDWD,\n\tNMD_X86_INSTRUCTION_VPHMINPOSUW,\n\tNMD_X86_INSTRUCTION_VPHSUBBW,\n\tNMD_X86_INSTRUCTION_VPHSUBDQ,\n\t\n\tNMD_X86_INSTRUCTION_VPHSUBWD,\n\t\n\tNMD_X86_INSTRUCTION_VPINSRB,\n\tNMD_X86_INSTRUCTION_VPINSRD,\n\tNMD_X86_INSTRUCTION_VPINSRQ,\n\tNMD_X86_INSTRUCTION_VPINSRW,\n\tNMD_X86_INSTRUCTION_VPLZCNTD,\n\tNMD_X86_INSTRUCTION_VPLZCNTQ,\n\tNMD_X86_INSTRUCTION_VPMACSDD,\n\tNMD_X86_INSTRUCTION_VPMACSDQH,\n\tNMD_X86_INSTRUCTION_VPMACSDQL,\n\tNMD_X86_INSTRUCTION_VPMACSSDD,\n\tNMD_X86_INSTRUCTION_VPMACSSDQH,\n\tNMD_X86_INSTRUCTION_VPMACSSDQL,\n\tNMD_X86_INSTRUCTION_VPMACSSWD,\n\tNMD_X86_INSTRUCTION_VPMACSSWW,\n\tNMD_X86_INSTRUCTION_VPMACSWD,\n\tNMD_X86_INSTRUCTION_VPMACSWW,\n\tNMD_X86_INSTRUCTION_VPMADCSSWD,\n\tNMD_X86_INSTRUCTION_VPMADCSWD,\n\tNMD_X86_INSTRUCTION_VPMADDWD,\n\tNMD_X86_INSTRUCTION_VPMASKMOVD,\n\tNMD_X86_INSTRUCTION_VPMASKMOVQ,\n\tNMD_X86_INSTRUCTION_VPMAXSB,\n\tNMD_X86_INSTRUCTION_VPMAXSD,\n\tNMD_X86_INSTRUCTION_VPMAXSQ,\n\tNMD_X86_INSTRUCTION_VPMAXSW,\n\tNMD_X86_INSTRUCTION_VPMAXUB,\n\tNMD_X86_INSTRUCTION_VPMAXUD,\n\tNMD_X86_INSTRUCTION_VPMAXUQ,\n\tNMD_X86_INSTRUCTION_VPMAXUW,\n\tNMD_X86_INSTRUCTION_VPMINSB,\n\tNMD_X86_INSTRUCTION_VPMINSD,\n\tNMD_X86_INSTRUCTION_VPMINSQ,\n\tNMD_X86_INSTRUCTION_VPMINSW,\n\tNMD_X86_INSTRUCTION_VPMINUB,\n\tNMD_X86_INSTRUCTION_VPMINUD,\n\tNMD_X86_INSTRUCTION_VPMINUQ,\n\tNMD_X86_INSTRUCTION_VPMINUW,\n\tNMD_X86_INSTRUCTION_VPMOVDB,\n\tNMD_X86_INSTRUCTION_VPMOVDW,\n\tNMD_X86_INSTRUCTION_VPMOVM2B,\n\tNMD_X86_INSTRUCTION_VPMOVM2D,\n\tNMD_X86_INSTRUCTION_VPMOVM2Q,\n\tNMD_X86_INSTRUCTION_VPMOVM2W,\n\tNMD_X86_INSTRUCTION_VPMOVMSKB,\n\tNMD_X86_INSTRUCTION_VPMOVQB,\n\tNMD_X86_INSTRUCTION_VPMOVQD,\n\tNMD_X86_INSTRUCTION_VPMOVQW,\n\tNMD_X86_INSTRUCTION_VPMOVSDB,\n\tNMD_X86_INSTRUCTION_VPMOVSDW,\n\tNMD_X86_INSTRUCTION_VPMOVSQB,\n\tNMD_X86_INSTRUCTION_VPMOVSQD,\n\tNMD_X86_INSTRUCTION_VPMOVSQW,\n\tNMD_X86_INSTRUCTION_VPMOVSXBD,\n\tNMD_X86_INSTRUCTION_VPMOVSXBQ,\n\tNMD_X86_INSTRUCTION_VPMOVSXBW,\n\tNMD_X86_INSTRUCTION_VPMOVSXDQ,\n\tNMD_X86_INSTRUCTION_VPMOVSXWD,\n\tNMD_X86_INSTRUCTION_VPMOVSXWQ,\n\tNMD_X86_INSTRUCTION_VPMOVUSDB,\n\tNMD_X86_INSTRUCTION_VPMOVUSDW,\n\tNMD_X86_INSTRUCTION_VPMOVUSQB,\n\tNMD_X86_INSTRUCTION_VPMOVUSQD,\n\tNMD_X86_INSTRUCTION_VPMOVUSQW,\n\tNMD_X86_INSTRUCTION_VPMOVZXBD,\n\tNMD_X86_INSTRUCTION_VPMOVZXBQ,\n\tNMD_X86_INSTRUCTION_VPMOVZXBW,\n\tNMD_X86_INSTRUCTION_VPMOVZXDQ,\n\tNMD_X86_INSTRUCTION_VPMOVZXWD,\n\tNMD_X86_INSTRUCTION_VPMOVZXWQ,\n\tNMD_X86_INSTRUCTION_VPMULDQ,\n\tNMD_X86_INSTRUCTION_VPMULHUW,\n\tNMD_X86_INSTRUCTION_VPMULHW,\n\tNMD_X86_INSTRUCTION_VPMULLD,\n\tNMD_X86_INSTRUCTION_VPMULLQ,\n\tNMD_X86_INSTRUCTION_VPMULLW,\n\tNMD_X86_INSTRUCTION_VPMULUDQ,\n\tNMD_X86_INSTRUCTION_VPORD,\n\tNMD_X86_INSTRUCTION_VPORQ,\n\tNMD_X86_INSTRUCTION_VPOR,\n\tNMD_X86_INSTRUCTION_VPPERM,\n\tNMD_X86_INSTRUCTION_VPROTB,\n\tNMD_X86_INSTRUCTION_VPROTD,\n\tNMD_X86_INSTRUCTION_VPROTQ,\n\tNMD_X86_INSTRUCTION_VPROTW,\n\tNMD_X86_INSTRUCTION_VPSADBW,\n\tNMD_X86_INSTRUCTION_VPSCATTERDD,\n\tNMD_X86_INSTRUCTION_VPSCATTERDQ,\n\tNMD_X86_INSTRUCTION_VPSCATTERQD,\n\tNMD_X86_INSTRUCTION_VPSCATTERQQ,\n\tNMD_X86_INSTRUCTION_VPSHAB,\n\tNMD_X86_INSTRUCTION_VPSHAD,\n\tNMD_X86_INSTRUCTION_VPSHAQ,\n\tNMD_X86_INSTRUCTION_VPSHAW,\n\tNMD_X86_INSTRUCTION_VPSHLB,\n\tNMD_X86_INSTRUCTION_VPSHLD,\n\tNMD_X86_INSTRUCTION_VPSHLQ,\n\tNMD_X86_INSTRUCTION_VPSHLW,\n\tNMD_X86_INSTRUCTION_VPSHUFD,\n\tNMD_X86_INSTRUCTION_VPSHUFHW,\n\tNMD_X86_INSTRUCTION_VPSHUFLW,\n\tNMD_X86_INSTRUCTION_VPSLLDQ,\n\tNMD_X86_INSTRUCTION_VPSLLD,\n\tNMD_X86_INSTRUCTION_VPSLLQ,\n\tNMD_X86_INSTRUCTION_VPSLLVD,\n\tNMD_X86_INSTRUCTION_VPSLLVQ,\n\tNMD_X86_INSTRUCTION_VPSLLW,\n\tNMD_X86_INSTRUCTION_VPSRAD,\n\tNMD_X86_INSTRUCTION_VPSRAQ,\n\tNMD_X86_INSTRUCTION_VPSRAVD,\n\tNMD_X86_INSTRUCTION_VPSRAVQ,\n\tNMD_X86_INSTRUCTION_VPSRAW,\n\tNMD_X86_INSTRUCTION_VPSRLDQ,\n\tNMD_X86_INSTRUCTION_VPSRLD,\n\tNMD_X86_INSTRUCTION_VPSRLQ,\n\tNMD_X86_INSTRUCTION_VPSRLVD,\n\tNMD_X86_INSTRUCTION_VPSRLVQ,\n\tNMD_X86_INSTRUCTION_VPSRLW,\n\tNMD_X86_INSTRUCTION_VPSUBB,\n\tNMD_X86_INSTRUCTION_VPSUBD,\n\tNMD_X86_INSTRUCTION_VPSUBQ,\n\tNMD_X86_INSTRUCTION_VPSUBSB,\n\tNMD_X86_INSTRUCTION_VPSUBSW,\n\tNMD_X86_INSTRUCTION_VPSUBUSB,\n\tNMD_X86_INSTRUCTION_VPSUBUSW,\n\tNMD_X86_INSTRUCTION_VPSUBW,\n\tNMD_X86_INSTRUCTION_VPTESTMD,\n\tNMD_X86_INSTRUCTION_VPTESTMQ,\n\tNMD_X86_INSTRUCTION_VPTESTNMD,\n\tNMD_X86_INSTRUCTION_VPTESTNMQ,\n\tNMD_X86_INSTRUCTION_VPTEST,\n\tNMD_X86_INSTRUCTION_VPUNPCKHBW,\n\tNMD_X86_INSTRUCTION_VPUNPCKHDQ,\n\tNMD_X86_INSTRUCTION_VPUNPCKHQDQ,\n\tNMD_X86_INSTRUCTION_VPUNPCKHWD,\n\tNMD_X86_INSTRUCTION_VPUNPCKLBW,\n\tNMD_X86_INSTRUCTION_VPUNPCKLDQ,\n\tNMD_X86_INSTRUCTION_VPUNPCKLQDQ,\n\tNMD_X86_INSTRUCTION_VPUNPCKLWD,\n\tNMD_X86_INSTRUCTION_VPXORD,\n\tNMD_X86_INSTRUCTION_VPXORQ,\n\tNMD_X86_INSTRUCTION_VPXOR,\n\tNMD_X86_INSTRUCTION_VRCP14PD,\n\tNMD_X86_INSTRUCTION_VRCP14PS,\n\tNMD_X86_INSTRUCTION_VRCP14SD,\n\tNMD_X86_INSTRUCTION_VRCP14SS,\n\tNMD_X86_INSTRUCTION_VRCP28PD,\n\tNMD_X86_INSTRUCTION_VRCP28PS,\n\tNMD_X86_INSTRUCTION_VRCP28SD,\n\tNMD_X86_INSTRUCTION_VRCP28SS,\n\tNMD_X86_INSTRUCTION_VRCPPS,\n\tNMD_X86_INSTRUCTION_VRCPSS,\n\tNMD_X86_INSTRUCTION_VRNDSCALEPD,\n\tNMD_X86_INSTRUCTION_VRNDSCALEPS,\n\tNMD_X86_INSTRUCTION_VRNDSCALESD,\n\tNMD_X86_INSTRUCTION_VRNDSCALESS,\n\tNMD_X86_INSTRUCTION_VROUNDPD,\n\tNMD_X86_INSTRUCTION_VROUNDPS,\n\tNMD_X86_INSTRUCTION_VROUNDSD,\n\tNMD_X86_INSTRUCTION_VROUNDSS,\n\tNMD_X86_INSTRUCTION_VRSQRT14PD,\n\tNMD_X86_INSTRUCTION_VRSQRT14PS,\n\tNMD_X86_INSTRUCTION_VRSQRT14SD,\n\tNMD_X86_INSTRUCTION_VRSQRT14SS,\n\tNMD_X86_INSTRUCTION_VRSQRT28PD,\n\tNMD_X86_INSTRUCTION_VRSQRT28PS,\n\tNMD_X86_INSTRUCTION_VRSQRT28SD,\n\tNMD_X86_INSTRUCTION_VRSQRT28SS,\n\tNMD_X86_INSTRUCTION_VRSQRTPS,\n\tNMD_X86_INSTRUCTION_VRSQRTSS,\n\tNMD_X86_INSTRUCTION_VSCATTERDPD,\n\tNMD_X86_INSTRUCTION_VSCATTERDPS,\n\tNMD_X86_INSTRUCTION_VSCATTERPF0DPD,\n\tNMD_X86_INSTRUCTION_VSCATTERPF0DPS,\n\tNMD_X86_INSTRUCTION_VSCATTERPF0QPD,\n\tNMD_X86_INSTRUCTION_VSCATTERPF0QPS,\n\tNMD_X86_INSTRUCTION_VSCATTERPF1DPD,\n\tNMD_X86_INSTRUCTION_VSCATTERPF1DPS,\n\tNMD_X86_INSTRUCTION_VSCATTERPF1QPD,\n\tNMD_X86_INSTRUCTION_VSCATTERPF1QPS,\n\tNMD_X86_INSTRUCTION_VSCATTERQPD,\n\tNMD_X86_INSTRUCTION_VSCATTERQPS,\n\tNMD_X86_INSTRUCTION_VSHUFPD,\n\tNMD_X86_INSTRUCTION_VSHUFPS,\n\tNMD_X86_INSTRUCTION_VSQRTPD,\n\tNMD_X86_INSTRUCTION_VSQRTPS,\n\tNMD_X86_INSTRUCTION_VSQRTSD,\n\tNMD_X86_INSTRUCTION_VSQRTSS,\n\tNMD_X86_INSTRUCTION_VSTMXCSR,\n\tNMD_X86_INSTRUCTION_VSUBPD,\n\tNMD_X86_INSTRUCTION_VSUBPS,\n\tNMD_X86_INSTRUCTION_VSUBSD,\n\tNMD_X86_INSTRUCTION_VSUBSS,\n\tNMD_X86_INSTRUCTION_VTESTPD,\n\tNMD_X86_INSTRUCTION_VTESTPS,\n\tNMD_X86_INSTRUCTION_VUNPCKHPD,\n\tNMD_X86_INSTRUCTION_VUNPCKHPS,\n\tNMD_X86_INSTRUCTION_VUNPCKLPD,\n\tNMD_X86_INSTRUCTION_VUNPCKLPS,\n\tNMD_X86_INSTRUCTION_VZEROALL,\n\tNMD_X86_INSTRUCTION_VZEROUPPER,\n\tNMD_X86_INSTRUCTION_FWAIT,\n\tNMD_X86_INSTRUCTION_XABORT,\n\tNMD_X86_INSTRUCTION_XACQUIRE,\n\tNMD_X86_INSTRUCTION_XBEGIN,\n\tNMD_X86_INSTRUCTION_XCHG,\n\tNMD_X86_INSTRUCTION_XCRYPTCBC,\n\tNMD_X86_INSTRUCTION_XCRYPTCFB,\n\tNMD_X86_INSTRUCTION_XCRYPTCTR,\n\tNMD_X86_INSTRUCTION_XCRYPTECB,\n\tNMD_X86_INSTRUCTION_XCRYPTOFB,\n\tNMD_X86_INSTRUCTION_XRELEASE,\n\tNMD_X86_INSTRUCTION_XRSTOR64,\n\tNMD_X86_INSTRUCTION_XRSTORS,\n\tNMD_X86_INSTRUCTION_XRSTORS64,\n\tNMD_X86_INSTRUCTION_XSAVE64,\n\tNMD_X86_INSTRUCTION_XSAVEC,\n\tNMD_X86_INSTRUCTION_XSAVEC64,\n\tNMD_X86_INSTRUCTION_XSAVEOPT64,\n\tNMD_X86_INSTRUCTION_XSAVES,\n\tNMD_X86_INSTRUCTION_XSAVES64,\n\tNMD_X86_INSTRUCTION_XSHA1,\n\tNMD_X86_INSTRUCTION_XSHA256,\n\tNMD_X86_INSTRUCTION_XSTORE,\n\tNMD_X86_INSTRUCTION_FDISI8087_NOP,\n\tNMD_X86_INSTRUCTION_FENI8087_NOP,\n\n\t/* pseudo instructions */\n\tNMD_X86_INSTRUCTION_CMPSS,\n\tNMD_X86_INSTRUCTION_CMPEQSS,\n\tNMD_X86_INSTRUCTION_CMPLTSS,\n\tNMD_X86_INSTRUCTION_CMPLESS,\n\tNMD_X86_INSTRUCTION_CMPUNORDSS,\n\tNMD_X86_INSTRUCTION_CMPNEQSS,\n\tNMD_X86_INSTRUCTION_CMPNLTSS,\n\tNMD_X86_INSTRUCTION_CMPNLESS,\n\tNMD_X86_INSTRUCTION_CMPORDSS,\n\n\tNMD_X86_INSTRUCTION_CMPSD,\n\tNMD_X86_INSTRUCTION_CMPEQSD,\n\tNMD_X86_INSTRUCTION_CMPLTSD,\n\tNMD_X86_INSTRUCTION_CMPLESD,\n\tNMD_X86_INSTRUCTION_CMPUNORDSD,\n\tNMD_X86_INSTRUCTION_CMPNEQSD,\n\tNMD_X86_INSTRUCTION_CMPNLTSD,\n\tNMD_X86_INSTRUCTION_CMPNLESD,\n\tNMD_X86_INSTRUCTION_CMPORDSD,\n\n\tNMD_X86_INSTRUCTION_CMPPS,\n\tNMD_X86_INSTRUCTION_CMPEQPS,\n\tNMD_X86_INSTRUCTION_CMPLTPS,\n\tNMD_X86_INSTRUCTION_CMPLEPS,\n\tNMD_X86_INSTRUCTION_CMPUNORDPS,\n\tNMD_X86_INSTRUCTION_CMPNEQPS,\n\tNMD_X86_INSTRUCTION_CMPNLTPS,\n\tNMD_X86_INSTRUCTION_CMPNLEPS,\n\tNMD_X86_INSTRUCTION_CMPORDPS,\n\n\tNMD_X86_INSTRUCTION_CMPPD,\n\tNMD_X86_INSTRUCTION_CMPEQPD,\n\tNMD_X86_INSTRUCTION_CMPLTPD,\n\tNMD_X86_INSTRUCTION_CMPLEPD,\n\tNMD_X86_INSTRUCTION_CMPUNORDPD,\n\tNMD_X86_INSTRUCTION_CMPNEQPD,\n\tNMD_X86_INSTRUCTION_CMPNLTPD,\n\tNMD_X86_INSTRUCTION_CMPNLEPD,\n\tNMD_X86_INSTRUCTION_CMPORDPD,\n\n\tNMD_X86_INSTRUCTION_VCMPSS,\n\tNMD_X86_INSTRUCTION_VCMPEQSS,\n\tNMD_X86_INSTRUCTION_VCMPLTSS,\n\tNMD_X86_INSTRUCTION_VCMPLESS,\n\tNMD_X86_INSTRUCTION_VCMPUNORDSS,\n\tNMD_X86_INSTRUCTION_VCMPNEQSS,\n\tNMD_X86_INSTRUCTION_VCMPNLTSS,\n\tNMD_X86_INSTRUCTION_VCMPNLESS,\n\tNMD_X86_INSTRUCTION_VCMPORDSS,\n\tNMD_X86_INSTRUCTION_VCMPEQ_UQSS,\n\tNMD_X86_INSTRUCTION_VCMPNGESS,\n\tNMD_X86_INSTRUCTION_VCMPNGTSS,\n\tNMD_X86_INSTRUCTION_VCMPFALSESS,\n\tNMD_X86_INSTRUCTION_VCMPNEQ_OQSS,\n\tNMD_X86_INSTRUCTION_VCMPGESS,\n\tNMD_X86_INSTRUCTION_VCMPGTSS,\n\tNMD_X86_INSTRUCTION_VCMPTRUESS,\n\tNMD_X86_INSTRUCTION_VCMPEQ_OSSS,\n\tNMD_X86_INSTRUCTION_VCMPLT_OQSS,\n\tNMD_X86_INSTRUCTION_VCMPLE_OQSS,\n\tNMD_X86_INSTRUCTION_VCMPUNORD_SSS,\n\tNMD_X86_INSTRUCTION_VCMPNEQ_USSS,\n\tNMD_X86_INSTRUCTION_VCMPNLT_UQSS,\n\tNMD_X86_INSTRUCTION_VCMPNLE_UQSS,\n\tNMD_X86_INSTRUCTION_VCMPORD_SSS,\n\tNMD_X86_INSTRUCTION_VCMPEQ_USSS,\n\tNMD_X86_INSTRUCTION_VCMPNGE_UQSS,\n\tNMD_X86_INSTRUCTION_VCMPNGT_UQSS,\n\tNMD_X86_INSTRUCTION_VCMPFALSE_OSSS,\n\tNMD_X86_INSTRUCTION_VCMPNEQ_OSSS,\n\tNMD_X86_INSTRUCTION_VCMPGE_OQSS,\n\tNMD_X86_INSTRUCTION_VCMPGT_OQSS,\n\tNMD_X86_INSTRUCTION_VCMPTRUE_USSS,\n\n\tNMD_X86_INSTRUCTION_VCMPSD,\n\tNMD_X86_INSTRUCTION_VCMPEQSD,\n\tNMD_X86_INSTRUCTION_VCMPLTSD,\n\tNMD_X86_INSTRUCTION_VCMPLESD,\n\tNMD_X86_INSTRUCTION_VCMPUNORDSD,\n\tNMD_X86_INSTRUCTION_VCMPNEQSD,\n\tNMD_X86_INSTRUCTION_VCMPNLTSD,\n\tNMD_X86_INSTRUCTION_VCMPNLESD,\n\tNMD_X86_INSTRUCTION_VCMPORDSD,\n\tNMD_X86_INSTRUCTION_VCMPEQ_UQSD,\n\tNMD_X86_INSTRUCTION_VCMPNGESD,\n\tNMD_X86_INSTRUCTION_VCMPNGTSD,\n\tNMD_X86_INSTRUCTION_VCMPFALSESD,\n\tNMD_X86_INSTRUCTION_VCMPNEQ_OQSD,\n\tNMD_X86_INSTRUCTION_VCMPGESD,\n\tNMD_X86_INSTRUCTION_VCMPGTSD,\n\tNMD_X86_INSTRUCTION_VCMPTRUESD,\n\tNMD_X86_INSTRUCTION_VCMPEQ_OSSD,\n\tNMD_X86_INSTRUCTION_VCMPLT_OQSD,\n\tNMD_X86_INSTRUCTION_VCMPLE_OQSD,\n\tNMD_X86_INSTRUCTION_VCMPUNORD_SSD,\n\tNMD_X86_INSTRUCTION_VCMPNEQ_USSD,\n\tNMD_X86_INSTRUCTION_VCMPNLT_UQSD,\n\tNMD_X86_INSTRUCTION_VCMPNLE_UQSD,\n\tNMD_X86_INSTRUCTION_VCMPORD_SSD,\n\tNMD_X86_INSTRUCTION_VCMPEQ_USSD,\n\tNMD_X86_INSTRUCTION_VCMPNGE_UQSD,\n\tNMD_X86_INSTRUCTION_VCMPNGT_UQSD,\n\tNMD_X86_INSTRUCTION_VCMPFALSE_OSSD,\n\tNMD_X86_INSTRUCTION_VCMPNEQ_OSSD,\n\tNMD_X86_INSTRUCTION_VCMPGE_OQSD,\n\tNMD_X86_INSTRUCTION_VCMPGT_OQSD,\n\tNMD_X86_INSTRUCTION_VCMPTRUE_USSD,\n\n\tNMD_X86_INSTRUCTION_VCMPPS,\n\tNMD_X86_INSTRUCTION_VCMPEQPS,\n\tNMD_X86_INSTRUCTION_VCMPLTPS,\n\tNMD_X86_INSTRUCTION_VCMPLEPS,\n\tNMD_X86_INSTRUCTION_VCMPUNORDPS,\n\tNMD_X86_INSTRUCTION_VCMPNEQPS,\n\tNMD_X86_INSTRUCTION_VCMPNLTPS,\n\tNMD_X86_INSTRUCTION_VCMPNLEPS,\n\tNMD_X86_INSTRUCTION_VCMPORDPS,\n\tNMD_X86_INSTRUCTION_VCMPEQ_UQPS,\n\tNMD_X86_INSTRUCTION_VCMPNGEPS,\n\tNMD_X86_INSTRUCTION_VCMPNGTPS,\n\tNMD_X86_INSTRUCTION_VCMPFALSEPS,\n\tNMD_X86_INSTRUCTION_VCMPNEQ_OQPS,\n\tNMD_X86_INSTRUCTION_VCMPGEPS,\n\tNMD_X86_INSTRUCTION_VCMPGTPS,\n\tNMD_X86_INSTRUCTION_VCMPTRUEPS,\n\tNMD_X86_INSTRUCTION_VCMPEQ_OSPS,\n\tNMD_X86_INSTRUCTION_VCMPLT_OQPS,\n\tNMD_X86_INSTRUCTION_VCMPLE_OQPS,\n\tNMD_X86_INSTRUCTION_VCMPUNORD_SPS,\n\tNMD_X86_INSTRUCTION_VCMPNEQ_USPS,\n\tNMD_X86_INSTRUCTION_VCMPNLT_UQPS,\n\tNMD_X86_INSTRUCTION_VCMPNLE_UQPS,\n\tNMD_X86_INSTRUCTION_VCMPORD_SPS,\n\tNMD_X86_INSTRUCTION_VCMPEQ_USPS,\n\tNMD_X86_INSTRUCTION_VCMPNGE_UQPS,\n\tNMD_X86_INSTRUCTION_VCMPNGT_UQPS,\n\tNMD_X86_INSTRUCTION_VCMPFALSE_OSPS,\n\tNMD_X86_INSTRUCTION_VCMPNEQ_OSPS,\n\tNMD_X86_INSTRUCTION_VCMPGE_OQPS,\n\tNMD_X86_INSTRUCTION_VCMPGT_OQPS,\n\tNMD_X86_INSTRUCTION_VCMPTRUE_USPS,\n\n\tNMD_X86_INSTRUCTION_VCMPPD,\n\tNMD_X86_INSTRUCTION_VCMPEQPD,\n\tNMD_X86_INSTRUCTION_VCMPLTPD,\n\tNMD_X86_INSTRUCTION_VCMPLEPD,\n\tNMD_X86_INSTRUCTION_VCMPUNORDPD,\n\tNMD_X86_INSTRUCTION_VCMPNEQPD,\n\tNMD_X86_INSTRUCTION_VCMPNLTPD,\n\tNMD_X86_INSTRUCTION_VCMPNLEPD,\n\tNMD_X86_INSTRUCTION_VCMPORDPD,\n\tNMD_X86_INSTRUCTION_VCMPEQ_UQPD,\n\tNMD_X86_INSTRUCTION_VCMPNGEPD,\n\tNMD_X86_INSTRUCTION_VCMPNGTPD,\n\tNMD_X86_INSTRUCTION_VCMPFALSEPD,\n\tNMD_X86_INSTRUCTION_VCMPNEQ_OQPD,\n\tNMD_X86_INSTRUCTION_VCMPGEPD,\n\tNMD_X86_INSTRUCTION_VCMPGTPD,\n\tNMD_X86_INSTRUCTION_VCMPTRUEPD,\n\tNMD_X86_INSTRUCTION_VCMPEQ_OSPD,\n\tNMD_X86_INSTRUCTION_VCMPLT_OQPD,\n\tNMD_X86_INSTRUCTION_VCMPLE_OQPD,\n\tNMD_X86_INSTRUCTION_VCMPUNORD_SPD,\n\tNMD_X86_INSTRUCTION_VCMPNEQ_USPD,\n\tNMD_X86_INSTRUCTION_VCMPNLT_UQPD,\n\tNMD_X86_INSTRUCTION_VCMPNLE_UQPD,\n\tNMD_X86_INSTRUCTION_VCMPORD_SPD,\n\tNMD_X86_INSTRUCTION_VCMPEQ_USPD,\n\tNMD_X86_INSTRUCTION_VCMPNGE_UQPD,\n\tNMD_X86_INSTRUCTION_VCMPNGT_UQPD,\n\tNMD_X86_INSTRUCTION_VCMPFALSE_OSPD,\n\tNMD_X86_INSTRUCTION_VCMPNEQ_OSPD,\n\tNMD_X86_INSTRUCTION_VCMPGE_OQPD,\n\tNMD_X86_INSTRUCTION_VCMPGT_OQPD,\n\tNMD_X86_INSTRUCTION_VCMPTRUE_USPD,\n\n\tNMD_X86_INSTRUCTION_UD0,\n\tNMD_X86_INSTRUCTION_ENDBR32,\n\tNMD_X86_INSTRUCTION_ENDBR64,\n};\n\nenum NMD_X86_OPERAND_TYPE\n{\n\tNMD_X86_OPERAND_TYPE_NONE = 0,\n\tNMD_X86_OPERAND_TYPE_REGISTER,\n\tNMD_X86_OPERAND_TYPE_MEMORY,\n\tNMD_X86_OPERAND_TYPE_IMMEDIATE,\n};\n\ntypedef struct nmd_x86_memory_operand\n{\n\tuint8_t segment;     /* The segment register. A member of 'NMD_X86_REG'. */\n\tuint8_t base;        /* The base register. A member of 'NMD_X86_REG'. */\n\tuint8_t index;       /* The index register. A member of 'NMD_X86_REG'. */\n\tuint8_t scale;       /* Scale(1, 2, 4 or 8). */\n\tint64_t disp;        /* Displacement. */\n} nmd_x86_memory_operand;\n\nenum NMD_X86_OPERAND_ACTION\n{\n\tNMD_X86_OPERAND_ACTION_NONE = 0, /* The operand is neither read from nor written to. */\n\n\tNMD_X86_OPERAND_ACTION_READ      = (1 << 0), /* The operand is read. */\n\tNMD_X86_OPERAND_ACTION_WRITE     = (1 << 1), /* The operand is modified. */\n\tNMD_X86_OPERAND_ACTION_CONDREAD  = (1 << 2), /* The operand may be read depending on some condition(conditional read). */\n\tNMD_X86_OPERAND_ACTION_CONDWRITE = (1 << 3), /* The operand may be modified depending on some condition(conditional write). */\n\n\t/* These are not actual actions, but rather masks of actions. */\n\tNMD_X86_OPERAND_ACTION_READWRITE = (NMD_X86_OPERAND_ACTION_READ | NMD_X86_OPERAND_ACTION_WRITE),\n\tNMD_X86_OPERAND_ACTION_ANY_READ  = (NMD_X86_OPERAND_ACTION_READ | NMD_X86_OPERAND_ACTION_CONDREAD),\n\tNMD_X86_OPERAND_ACTION_ANY_WRITE = (NMD_X86_OPERAND_ACTION_WRITE | NMD_X86_OPERAND_ACTION_CONDWRITE)\n};\n\ntypedef struct nmd_x86_operand\n{\n\tuint8_t type;                  /* The operand's type. A member of 'NMD_X86_OPERAND_TYPE'. */\n\t/* uint8_t size;                The operand's size. (I don't really know what this `size` variable represents or how it would be useful) */\n\tbool is_implicit;              /* If true, the operand does not appear on the intruction's formatted form. */\n\tuint8_t action;                /* The action on the operand. A member of 'NMD_X86_OPERAND_ACTION'. */\n\tunion {                        /* The operand's \"raw\" data. */\n\t\tuint8_t reg;               /* Register operand. A variable of type 'NMD_X86_REG' */\n\t\tint64_t imm;               /* Immediate operand. */\n\t\tnmd_x86_memory_operand mem;  /* Memory operand. */\n\t} fields;\n} nmd_x86_operand;\n\ntypedef union nmd_x86_cpu_flags\n{\n\tstruct\n\t{\n\t\tuint8_t CF   : 1; /* Bit  0.    Carry Flag (CF) */\n\t\tuint8_t b1   : 1; /* Bit  1.    Reserved */\n\t\tuint8_t PF   : 1; /* Bit  2.    Parity Flag (PF) */\n\t\tuint8_t B3   : 1; /* Bit  3.    Reserved */\n\t\tuint8_t AF   : 1; /* Bit  4.    Auxiliary Carry Flag (AF) */\n\t\tuint8_t B5   : 1; /* Bit  5.    Reserved */\n\t\tuint8_t ZF   : 1; /* Bit  6.    Zero flag(ZF) */\n\t\tuint8_t SF   : 1; /* Bit  7.    Sign flag(SF) */\n\t\tuint8_t TF   : 1; /* Bit  8.    Trap flag(TF) */\n\t\tuint8_t IF   : 1; /* Bit  9.    Interrupt Enable Flag (IF) */\n\t\tuint8_t DF   : 1; /* Bit 10.    Direction Flag (DF) */\n\t\tuint8_t OF   : 1; /* Bit 11.    Overflow Flag (OF) */\n\t\tuint8_t IOPL : 2; /* Bit 12,13. I/O Privilege Level (IOPL) */\n\t\tuint8_t NT   : 1; /* Bit 14.    Nested Task (NT) */\n\t\tuint8_t B15  : 1; /* Bit 15.    Reserved */\n\t\tuint8_t RF   : 1; /* Bit 16.    Resume Flag (RF) */\n\t\tuint8_t VM   : 1; /* Bit 17.    Virtual-8086 Mode (VM) */\n\t\tuint8_t AC   : 1; /* Bit 18.    Alignment Check / Access Control (AC) */\n\t\tuint8_t VIF  : 1; /* Bit 19.    Virtual Interrupt Flag (VIF) */\n\t\tuint8_t VIP  : 1; /* Bit 20.    Virtual Interrupt Pending (VIP) */\n\t\tuint8_t ID   : 1; /* Bit 21.    ID Flag(ID) */\n\t\tuint8_t B22  : 1; /* Bit 22.    Reserved */\n\t\tuint8_t B23  : 1; /* Bit 23.    Reserved */\n\t\tuint8_t B24  : 1; /* Bit 24.    Reserved */\n\t\tuint8_t B25  : 1; /* Bit 25.    Reserved */\n\t\tuint8_t B26  : 1; /* Bit 26.    Reserved */\n\t\tuint8_t B27  : 1; /* Bit 27.    Reserved */\n\t\tuint8_t B28  : 1; /* Bit 28.    Reserved */\n\t\tuint8_t B29  : 1; /* Bit 29.    Reserved */\n\t\tuint8_t B30  : 1; /* Bit 30.    Reserved */\n\t\tuint8_t B31  : 1; /* Bit 31.    Reserved */\n\t} fields;\n\tstruct\n\t{\n\t\tuint8_t IE  : 1; /* Bit  0.    Invalid Operation (IE) */\n\t\tuint8_t DE  : 1; /* Bit  1.    Denormalized Operand (DE) */\n\t\tuint8_t ZE  : 1; /* Bit  2.    Zero Divide (ZE) */\n\t\tuint8_t OE  : 1; /* Bit  3.    Overflow (OE) */\n\t\tuint8_t UE  : 1; /* Bit  4.    Underflow (UE) */\n\t\tuint8_t PE  : 1; /* Bit  5.    Precision (PE) */\n\t\tuint8_t SF  : 1; /* Bit  6.    Stack Fault (SF) */\n\t\tuint8_t ES  : 1; /* Bit  7.    Exception Summary Status (ES) */\n\t\tuint8_t C0  : 1; /* Bit  8.    Condition code 0 (C0) */\n\t\tuint8_t C1  : 1; /* Bit  9.    Condition code 1 (C1) */\n\t\tuint8_t C2  : 1; /* Bit 10.    Condition code 2 (C2) */\n\t\tuint8_t TOP : 3; /* Bit 11-13. Top of Stack Pointer (TOP) */\n\t\tuint8_t C3  : 1; /* Bit 14.    Condition code 3 (C3) */\n\t\tuint8_t B   : 1; /* Bit 15.    FPU Busy (B) */\n\t} fpu_fields;\n\tuint8_t l8;\n\tuint32_t eflags;\n\tuint16_t fpu_flags;\n} nmd_x86_cpu_flags;\n\nenum NMD_X86_EFLAGS\n{\n\tNMD_X86_EFLAGS_ID   = (1 << 21),\n\tNMD_X86_EFLAGS_VIP  = (1 << 20),\n\tNMD_X86_EFLAGS_VIF  = (1 << 19),\n\tNMD_X86_EFLAGS_AC   = (1 << 18),\n\tNMD_X86_EFLAGS_VM   = (1 << 17),\n\tNMD_X86_EFLAGS_RF   = (1 << 16),\n\tNMD_X86_EFLAGS_NT   = (1 << 14),\n\tNMD_X86_EFLAGS_IOPL = (1 << 12) /*| (1 << 13)*/,\n\tNMD_X86_EFLAGS_OF   = (1 << 11),\n\tNMD_X86_EFLAGS_DF   = (1 << 10),\n\tNMD_X86_EFLAGS_IF   = (1 << 9),\n\tNMD_X86_EFLAGS_TF   = (1 << 8),\n\tNMD_X86_EFLAGS_SF   = (1 << 7),\n\tNMD_X86_EFLAGS_ZF   = (1 << 6),\n\tNMD_X86_EFLAGS_AF   = (1 << 4),\n\tNMD_X86_EFLAGS_PF   = (1 << 2),\n\tNMD_X86_EFLAGS_CF   = (1 << 0)\n};\n\nenum NMD_X86_FPU_FLAGS\n{\n\tNMD_X86_FPU_FLAGS_C0 = (1 << 8),\n\tNMD_X86_FPU_FLAGS_C1 = (1 << 9),\n\tNMD_X86_FPU_FLAGS_C2 = (1 << 10),\n\tNMD_X86_FPU_FLAGS_C3 = (1 << 14)\n};\n\ntypedef struct nmd_x86_instruction\n{\n\tbool valid : 1;                                         /* If true, the instruction is valid. */\n\tbool has_modrm : 1;                                     /* If true, the instruction has a ModR/M byte. */\n\tbool has_sib : 1;                                       /* If true, the instruction has an SIB byte. */\n\tbool has_rex : 1;                                       /* If true, the instruction has a REX prefix */\n\tbool rex_w_prefix : 1;                                  /* If true, a REX.W prefix is closer to the opcode than a operand size override prefix. */\n\tbool repeat_prefix : 1;                                 /* If true, a 'repeat'(F3h) prefix is closer to the opcode than a 'repeat not zero'(F2h) prefix. */\n\tuint8_t mode;                                           /* The decoding mode. A member of 'NMD_X86_MODE'. */\n\tuint8_t length;                                         /* The instruction's length in bytes. */\n\tuint8_t opcode;                                         /* Opcode byte. */\n\tuint8_t opcode_size;                                    /* The opcode's size in bytes. */\n\tuint16_t id;                                            /* The instruction's identifier. A member of 'NMD_X86_INSTRUCTION'. */\n\tuint16_t prefixes;                                      /* A mask of prefixes. See 'NMD_X86_PREFIXES'. */\n\tuint8_t num_prefixes;                                   /* Number of prefixes. */\n\tuint8_t num_operands;                                   /* The number of operands. */\n\tuint8_t group;                                          /* The instruction's group(e.g. jmp, prvileged...). A member of 'NMD_GROUP'. */\n\tuint8_t buffer[NMD_X86_MAXIMUM_INSTRUCTION_LENGTH];     /* A buffer containing the full instruction. */\n\tnmd_x86_operand operands[NMD_X86_MAXIMUM_NUM_OPERANDS]; /* Operands. */\n\tnmd_x86_modrm modrm;                                    /* The Mod/RM byte. Check 'flags.fields.has_modrm'. */\n\tnmd_x86_sib sib;                                        /* The SIB byte. Check 'flags.fields.has_sib'. */\n\tuint8_t imm_mask;                                       /* A mask of one or more members of 'NMD_X86_IMM'. */\n\tuint8_t disp_mask;                                      /* A mask of one or more members of 'NMD_X86_DISP'. */\n\tuint64_t immediate;                                     /* Immediate. Check 'imm_mask'. */\n\tuint32_t displacement;                                  /* Displacement. Check 'disp_mask'. */\n\tuint8_t opcode_map;                                     /* The instruction's opcode map. A member of 'NMD_X86_OPCODE_MAP'. */\n\tuint8_t encoding;                                       /* The instruction's encoding. A member of 'NMD_X86_INSTRUCTION_ENCODING'. */\n\tnmd_x86_vex vex;                                        /* VEX prefix. */\n\tnmd_x86_cpu_flags modified_flags;                       /* Cpu flags modified by the instruction. */\n\tnmd_x86_cpu_flags tested_flags;                         /* Cpu flags tested by the instruction. */\n\tnmd_x86_cpu_flags set_flags;                            /* Cpu flags set by the instruction. */\n\tnmd_x86_cpu_flags cleared_flags;                        /* Cpu flags cleared by the instruction. */\n\tnmd_x86_cpu_flags undefined_flags;                      /* Cpu flags whose state is undefined. */\n\tuint8_t rex;                                            /* REX prefix. */\n\tuint8_t segment_override;                               /* The segment override prefix closest to the opcode. A member of 'NMD_X86_PREFIXES'. */\n\tuint16_t simd_prefix;                                   /* One of these prefixes that is the closest to the opcode: NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE, NMD_X86_PREFIXES_LOCK, NMD_X86_PREFIXES_REPEAT_NOT_ZERO, NMD_X86_PREFIXES_REPEAT, or NMD_X86_PREFIXES_NONE. The prefixes are specified as members of the 'NMD_X86_PREFIXES' enum. */\n} nmd_x86_instruction;\n\ntypedef union nmd_x86_register\n{\n\tint8_t  h8;\n\tint8_t  l8;\n\tint16_t l16;\n\tint32_t l32;\n\tint64_t l64;\n} nmd_x86_register;\n\ntypedef union nmd_x86_register_512\n{\n\tuint64_t xmm0[2];\n\tuint64_t ymm0[4];\n\tuint64_t zmm0[8];\n} nmd_x86_register_512;\n\n/*\nAssembles one or more instructions from a string. Returns the number of bytes written to the buffer on success, zero otherwise. Instructions can be separated using the '\\n'(new line) character.\nParameters:\n - string          [in]         A pointer to a string that represents one or more instructions in assembly language.\n - buffer          [out]        A pointer to a buffer that receives the encoded instructions.\n - buffer_size     [in]         The size of the buffer in bytes.\n - runtime_address [in]         The instruction's runtime address. You may use 'NMD_X86_INVALID_RUNTIME_ADDRESS'.\n - mode            [in]         The architecture mode. 'NMD_X86_MODE_32', 'NMD_X86_MODE_64' or 'NMD_X86_MODE_16'.\n - count           [in/out/opt] A pointer to a variable that on input is the maximum number of instructions that can be parsed, and on output the number of instructions parsed. This parameter may be null.\n*/\nNMD_ASSEMBLY_API size_t nmd_x86_assemble(const char* string, void* buffer, size_t buffer_size, uint64_t runtime_address, NMD_X86_MODE mode, size_t* count);\n\n/*\nDecodes an instruction. Returns true if the instruction is valid, false otherwise.\nParameters:\n - buffer      [in]  A pointer to a buffer containing a encoded instruction.\n - buffer_size [in]  The buffer's size in bytes.\n - instruction [out] A pointer to a variable of type 'nmd_x86_instruction' that receives information about the instruction.\n - mode        [in]  The architecture mode. 'NMD_X86_MODE_32', 'NMD_X86_MODE_64' or 'NMD_X86_MODE_16'.\n - flags       [in]  A mask of 'NMD_X86_DECODER_FLAGS_XXX' that specifies which features the decoder is allowed to use. If uncertain, use 'NMD_X86_DECODER_FLAGS_MINIMAL'.\n*/\nNMD_ASSEMBLY_API bool nmd_x86_decode(const void* buffer, size_t buffer_size, nmd_x86_instruction* instruction, NMD_X86_MODE mode, uint32_t flags);\n\n/*\nFormats an instruction. This function may cause a crash if you modify 'instruction' manually.\nParameters:\n - instruction     [in]  A pointer to a variable of type 'nmd_x86_instruction' describing the instruction to be formatted.\n - buffer          [out] A pointer to buffer that receives the string. The buffer's recommended size is 128 bytes.\n - runtime_address [in]  The instruction's runtime address. You may use 'NMD_X86_INVALID_RUNTIME_ADDRESS'.\n - flags           [in]  A mask of 'NMD_X86_FORMAT_FLAGS_XXX' that specifies how the function should format the instruction. If uncertain, use 'NMD_X86_FORMAT_FLAGS_DEFAULT'.\n*/\nNMD_ASSEMBLY_API void nmd_x86_format(const nmd_x86_instruction* instruction, char* buffer, uint64_t runtime_address, uint32_t flags);\n\n/*\nReturns the instruction's length if it's valid, zero otherwise.\nParameters:\n - buffer      [in] A pointer to a buffer containing a encoded instruction.\n - buffer_size [in] The buffer's size in bytes.\n - mode        [in] The architecture mode. 'NMD_X86_MODE_32', 'NMD_X86_MODE_64' or 'NMD_X86_MODE_16'.\n*/\nNMD_ASSEMBLY_API size_t nmd_x86_ldisasm(const void* buffer, size_t buffer_size, NMD_X86_MODE mode);\n\n#endif /* NMD_ASSEMBLY_H */\n\n\n#ifdef NMD_ASSEMBLY_IMPLEMENTATION\n\n/* Four high-order bits of an opcode to index a row of the opcode table */\n#define _NMD_R(b) ((b) >> 4)\n\n/* Four low-order bits to index a column of the table */\n#define _NMD_C(b) ((b) & 0xF)\n\n#define _NMD_NUM_ELEMENTS(arr) (sizeof(arr) / sizeof((arr)[0]))\n\n#ifndef _NMD_IS_UPPERCASE\n#define _NMD_IS_UPPERCASE(c) ((c) >= 'A' && (c) <= 'Z')\n#define _NMD_IS_LOWERCASE(c) ((c) >= 'a' && (c) <= 'z')\n#define _NMD_TOLOWER(c) (_NMD_IS_UPPERCASE(c) ? (c) + 0x20 : (c))\n#define _NMD_IS_DECIMAL_NUMBER(c) ((c) >= '0' && (c) <= '9')\n#define _NMD_MIN(a, b) ((a)<(b)?(a):(b))\n#define _NMD_MAX(a, b) ((a)>(b)?(a):(b))\n#endif /* _NMD_IS_UPPERCASE */  \n\n#define _NMD_SET_REG_OPERAND(operand, _is_implicit, _action, _reg) {operand.type = NMD_X86_OPERAND_TYPE_REGISTER; operand.is_implicit = _is_implicit; operand.action = _action; operand.fields.reg = _reg;}\n#define _NMD_SET_IMM_OPERAND(operand, _is_implicit, _action, _imm) {operand.type = NMD_X86_OPERAND_TYPE_IMMEDIATE; operand.is_implicit = _is_implicit; operand.action = _action; operand.fields.imm = _imm;}\n#define _NMD_SET_MEM_OPERAND(operand, _is_implicit, _action, _segment, _base, _index, _scale, _disp) {operand.type = NMD_X86_OPERAND_TYPE_MEMORY; operand.is_implicit = _is_implicit; operand.action = _action; operand.fields.mem.segment = _segment; operand.fields.mem.base = _base; operand.fields.mem.index = _index; operand.fields.mem.scale = _scale; operand.fields.mem.disp = _disp;}\n#define _NMD_GET_GPR(reg) (reg + (instruction->mode>>2)*8) /* reg(16),reg(32),reg(64). e.g. ax,eax,rax */\n#define _NMD_GET_IP() (NMD_X86_REG_IP + (instruction->mode>>2)) /* ip,eip,rip */\t\t\t\t\t\n#define _NMD_GET_BY_MODE_OPSZPRFX(mode, opszprfx, _16, _32) ((mode) == NMD_X86_MODE_16 ? ((opszprfx) ? (_32) : (_16)) : ((opszprfx) ? (_16) : (_32))) /* Get something based on mode and operand size prefix. Used for instructions where the the 64-bit mode variant does not exist or is the same as the one for 32-bit mode */\n#define _NMD_GET_BY_MODE_OPSZPRFX_W64(mode, opszprfx, rex_w_prefix, _16, _32, _64) ((mode) == NMD_X86_MODE_16 ? ((opszprfx) ? (_32) : (_16)) : ((opszprfx) ? (_16) : ((rex_w_prefix) ? (_64) : (_32)))) /* Get something based on mode and operand size prefix. The 64-bit version is accessed with the REX.W prefix */\n#define _NMD_GET_BY_MODE_OPSZPRFX_D64(mode, opszprfx, _16, _32, _64) ((mode) == NMD_X86_MODE_16 ? ((opszprfx) ? (_32) : (_16)) : ((opszprfx) ? (_16) : ((mode) == NMD_X86_MODE_64 ? (_64) : (_32)))) /* Get something based on mode and operand size prefix. The 64-bit version is accessed by default when mode is NMD_X86_MODE_64 and there's no operand size override prefix. */\n#define _NMD_GET_BY_MODE_OPSZPRFX_F64(mode, opszprfx, _16, _32, _64) ((mode) == NMD_X86_MODE_64 ? (_64) : ((mode) == NMD_X86_MODE_16 ? ((opszprfx) ? (_32) : (_16)) : ((opszprfx) ? (_16) : (_32)))) /* Get something based on mode and operand size prefix. The 64-bit version is accessed when mode is NMD_X86_MODE_64 independent of an operand size override prefix. */\n\n/* Make sure we can read a byte, read a byte, increment the buffer and decrement the buffer's size */\n#define _NMD_READ_BYTE(buffer_, buffer_size_, var_) { if ((buffer_size_) < sizeof(uint8_t)) { return false; } var_ = *((uint8_t*)(buffer_)); buffer_ = ((uint8_t*)(buffer_)) + sizeof(uint8_t); (buffer_size_) -= sizeof(uint8_t); }\n\nNMD_ASSEMBLY_API const char* const _nmd_reg8[] = { \"al\", \"cl\", \"dl\", \"bl\", \"ah\", \"ch\", \"dh\", \"bh\" };\nNMD_ASSEMBLY_API const char* const _nmd_reg8_x64[] = { \"al\", \"cl\", \"dl\", \"bl\", \"spl\", \"bpl\", \"sil\", \"dil\" };\nNMD_ASSEMBLY_API const char* const _nmd_reg16[] = { \"ax\", \"cx\", \"dx\", \"bx\", \"sp\", \"bp\", \"si\", \"di\" };\nNMD_ASSEMBLY_API const char* const _nmd_reg32[] = { \"eax\", \"ecx\", \"edx\", \"ebx\", \"esp\", \"ebp\", \"esi\", \"edi\" };\nNMD_ASSEMBLY_API const char* const _nmd_reg64[] = { \"rax\", \"rcx\", \"rdx\", \"rbx\", \"rsp\", \"rbp\", \"rsi\", \"rdi\" };\nNMD_ASSEMBLY_API const char* const _nmd_regrxb[] = { \"r8b\", \"r9b\", \"r10b\", \"r11b\", \"r12b\", \"r13b\", \"r14b\", \"r15b\" };\nNMD_ASSEMBLY_API const char* const _nmd_regrxw[] = { \"r8w\", \"r9w\", \"r10w\", \"r11w\", \"r12w\", \"r13w\", \"r14w\", \"r15w\" };\nNMD_ASSEMBLY_API const char* const _nmd_regrxd[] = { \"r8d\", \"r9d\", \"r10d\", \"r11d\", \"r12d\", \"r13d\", \"r14d\", \"r15d\" };\nNMD_ASSEMBLY_API const char* const _nmd_regrx[] = { \"r8\", \"r9\", \"r10\", \"r11\", \"r12\", \"r13\", \"r14\", \"r15\" };\nNMD_ASSEMBLY_API const char* const _nmd_segment_reg[] = { \"es\", \"cs\", \"ss\", \"ds\", \"fs\", \"gs\" };\n\nNMD_ASSEMBLY_API const char* const _nmd_condition_suffixes[] = { \"o\", \"no\", \"b\", \"nb\", \"z\", \"nz\", \"be\", \"a\", \"s\", \"ns\", \"p\", \"np\", \"l\", \"ge\", \"le\", \"g\" };\n\nNMD_ASSEMBLY_API const char* const _nmd_op1_opcode_map_mnemonics[] = { \"add\", \"adc\", \"and\", \"xor\", \"or\", \"sbb\", \"sub\", \"cmp\" };\nNMD_ASSEMBLY_API const char* const _nmd_opcode_extensions_grp1[] = { \"add\", \"or\", \"adc\", \"sbb\", \"and\", \"sub\", \"xor\", \"cmp\" };\nNMD_ASSEMBLY_API const char* const _nmd_opcode_extensions_grp2[] = { \"rol\", \"ror\", \"rcl\", \"rcr\", \"shl\", \"shr\", \"shl\", \"sar\" };\nNMD_ASSEMBLY_API const char* const _nmd_opcode_extensions_grp3[] = { \"test\", \"test\", \"not\", \"neg\", \"mul\", \"imul\", \"div\", \"idiv\" };\nNMD_ASSEMBLY_API const char* const _nmd_opcode_extensions_grp5[] = { \"inc\", \"dec\", \"call\", \"call far\", \"jmp\", \"jmp far\", \"push\" };\nNMD_ASSEMBLY_API const char* const _nmd_opcode_extensions_grp6[] = { \"sldt\", \"str\", \"lldt\", \"ltr\", \"verr\", \"verw\" };\nNMD_ASSEMBLY_API const char* const _nmd_opcode_extensions_grp7[] = { \"sgdt\", \"sidt\", \"lgdt\", \"lidt\", \"smsw\", 0, \"lmsw\", \"invlpg\" };\nNMD_ASSEMBLY_API const char* const _nmd_opcode_extensions_grp7_reg0[] = { \"enclv\", \"vmcall\", \"vmlaunch\", \"vmresume\", \"vmxoff\", \"pconfig\" };\nNMD_ASSEMBLY_API const char* const _nmd_opcode_extensions_grp7_reg1[] = { \"monitor\", \"mwait\", \"clac\", \"stac\", 0, 0, 0, \"encls\" };\nNMD_ASSEMBLY_API const char* const _nmd_opcode_extensions_grp7_reg2[] = { \"xgetbv\", \"xsetbv\", 0, 0, \"vmfunc\", \"xend\", \"xtest\", \"enclu\" };\nNMD_ASSEMBLY_API const char* const _nmd_opcode_extensions_grp7_reg3[] = { \"vmrun \", \"vmmcall\", \"vmload \", \"vmsave\", \"stgi\", \"clgi\", \"skinit eax\", \"invlpga \" };\nNMD_ASSEMBLY_API const char* const _nmd_opcode_extensions_grp7_reg7[] = { \"swapgs\", \"rdtscp\", \"monitorx\", \"mwaitx\", \"clzero \", \"rdpru\" };\n\nNMD_ASSEMBLY_API const char* const _nmd_escape_opcodesD8[] = { \"add\", \"mul\", \"com\", \"comp\", \"sub\", \"subr\", \"div\", \"divr\" };\nNMD_ASSEMBLY_API const char* const _nmd_escape_opcodesD9[] = { \"ld\", 0, \"st\", \"stp\", \"ldenv\", \"ldcw\", \"nstenv\", \"nstcw\" };\nNMD_ASSEMBLY_API const char* const _nmd_escape_opcodesDA_DE[] = { \"iadd\", \"imul\", \"icom\", \"icomp\", \"isub\", \"isubr\", \"idiv\", \"idivr\" };\nNMD_ASSEMBLY_API const char* const _nmd_escape_opcodesDB[] = { \"ild\", \"isttp\", \"ist\", \"istp\", 0, \"ld\", 0, \"stp\" };\nNMD_ASSEMBLY_API const char* const _nmd_escape_opcodesDC[] = { \"add\", \"mul\", \"com\", \"comp\", \"sub\", \"subr\", \"div\", \"divr\" };\nNMD_ASSEMBLY_API const char* const _nmd_escape_opcodesDD[] = { \"ld\", \"isttp\", \"st\", \"stp\", \"rstor\", 0, \"nsave\", \"nstsw\" };\nNMD_ASSEMBLY_API const char* const _nmd_escape_opcodesDF[] = { \"ild\", \"isttp\", \"ist\", \"istp\", \"bld\", \"ild\", \"bstp\", \"istp\" };\nNMD_ASSEMBLY_API const char* const* _nmd_escape_opcodes[] = { _nmd_escape_opcodesD8, _nmd_escape_opcodesD9, _nmd_escape_opcodesDA_DE, _nmd_escape_opcodesDB, _nmd_escape_opcodesDC, _nmd_escape_opcodesDD, _nmd_escape_opcodesDA_DE, _nmd_escape_opcodesDF };\n\nNMD_ASSEMBLY_API const uint8_t _nmd_op1_modrm[] = { 0xFF, 0x63, 0x69, 0x6B, 0xC0, 0xC1, 0xC6, 0xC7, 0xD0, 0xD1, 0xD2, 0xD3, 0xF6, 0xF7, 0xFE };\nNMD_ASSEMBLY_API const uint8_t _nmd_op1_imm8[] = { 0x6A, 0x6B, 0x80, 0x82, 0x83, 0xA8, 0xC0, 0xC1, 0xC6, 0xCD, 0xD4, 0xD5, 0xEB };\nNMD_ASSEMBLY_API const uint8_t _nmd_op1_imm32[] = { 0xE8, 0xE9, 0x68, 0x81, 0x69, 0xA9, 0xC7 };\nNMD_ASSEMBLY_API const uint8_t _nmd_invalid_op2[] = { 0x04, 0x0a, 0x0c, 0x7a, 0x7b, 0x36, 0x39 };\nNMD_ASSEMBLY_API const uint8_t _nmd_two_opcodes[] = { 0xb0, 0xb1, 0xb3, 0xbb, 0xc0, 0xc1 };\nNMD_ASSEMBLY_API const uint8_t _nmd_valid_3DNow_opcodes[] = { 0x0c, 0x0d, 0x1c, 0x1d, 0x8a, 0x8e, 0x90, 0x94, 0x96, 0x97, 0x9a, 0x9e, 0xa0, 0xa4, 0xa6, 0xa7, 0xaa, 0xae, 0xb0, 0xb4, 0xb6, 0xb7, 0xbb, 0xbf };\n\nNMD_ASSEMBLY_API bool _nmd_find_byte(const uint8_t* arr, const size_t N, const uint8_t x)\n{\n\tsize_t i = 0;\n\tfor (; i < N; i++)\n\t{\n\t\tif (arr[i] == x)\n\t\t\treturn true;\n\t}; \n\t\n\treturn false;\n}\n\n/* Returns a pointer to the first occurrence of 'c' in 's', or a null pointer if 'c' is not present. */\nNMD_ASSEMBLY_API const char* _nmd_strchr(const char* s, char c)\n{\n\tfor (; *s; s++)\n\t{\n\t\tif (*s == c)\n\t\t\treturn s;\n\t}\n\n\treturn 0;\n}\n\n/* Returns a pointer to the last occurrence of 'c' in 's', or a null pointer if 'c' is not present. */\nNMD_ASSEMBLY_API const char* _nmd_reverse_strchr(const char* s, char c)\n{\n\tconst char* end = s;\n\twhile (*end)\n\t\tend++;\n\n\tfor (; end > s; end--)\n\t{\n\t\tif (*end == c)\n\t\t\treturn end;\n\t}\n\n\treturn 0;\n}\n\n/* Returns a pointer to the first occurrence of 's2' in 's', or a null pointer if 's2' is not present. */\nNMD_ASSEMBLY_API const char* _nmd_strstr(const char* s, const char* s2)\n{\n\tsize_t i = 0;\n\tfor (; *s; s++)\n\t{\n\t\tif (s2[i] == '\\0')\n\t\t\treturn s - i;\n\n\t\tif (*s != s2[i])\n\t\t\ti = 0;\n\n\t\tif (*s == s2[i])\n\t\t\ti++;\n\t}\n\n\treturn 0;\n}\n\n/* Returns a pointer to the first occurrence of 's2' in 's', or a null pointer if 's2' is not present. If 's3_opt' is not null it receives the address of the next byte in 's'. */\nNMD_ASSEMBLY_API const char* _nmd_strstr_ex(const char* s, const char* s2, const char** s3_opt)\n{\n\tsize_t i = 0;\n\tfor (; *s; s++)\n\t{\n\t\tif (s2[i] == '\\0')\n\t\t{\n\t\t\tif (s3_opt)\n\t\t\t\t*s3_opt = s;\n\t\t\treturn s - i;\n\t\t}\n\n\t\tif (*s != s2[i])\n\t\t\ti = 0;\n\n\t\tif (*s == s2[i])\n\t\t\ti++;\n\t}\n\n\tif (s2[i] == '\\0')\n\t{\n\t\tif (s3_opt)\n\t\t\t*s3_opt = s;\n\t\treturn s - i;\n\t}\n\n\treturn 0;\n}\n\n\n/* Inserts 'c' at 's'. */\nNMD_ASSEMBLY_API void _nmd_insert_char(const char* s, char c)\n{\n\tchar* end = (char*)s;\n\twhile (*end)\n\t\tend++;\n\n\t*(end + 1) = '\\0';\n\n\tfor (; end > s; end--)\n\t\t*end = *(end - 1);\n\n\t*end = c;\n}\n\n/* Returns true if there is only a number between 's1' and 's2', false otherwise. */\nNMD_ASSEMBLY_API bool _nmd_is_number(const char* s1, const char* s2)\n{\n\tconst char* s = s1;\n\tfor (; s < s2; s++)\n\t{\n\t\tif (!(*s >= '0' && *s <= '9') && !(*s >= 'a' && *s <= 'f') && !(*s >= 'A' && *s <= 'F'))\n\t\t{\n\t\t\tif ((s == s1 + 1 && *s1 == '0' && (*s == 'x' || *s == 'X')) || (s == s2 - 1 && (*s == 'h' || *s == 'H')))\n\t\t\t\tcontinue;\n\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n/* Returns a pointer to the first occurrence of a number between 's1' and 's2', zero otherwise. */\nNMD_ASSEMBLY_API const char* _nmd_find_number(const char* s1, const char* s2)\n{\n\tconst char* s = s1;\n\tfor (; s < s2; s++)\n\t{\n\t\tif ((*s >= '0' && *s <= '9') || (*s >= 'a' && *s <= 'f') || (*s >= 'A' && *s <= 'F'))\n\t\t\treturn s;\n\t}\n\n\treturn 0;\n}\n\n/* Returns true if s1 matches s2 exactly. */\nNMD_ASSEMBLY_API bool _nmd_strcmp(const char* s1, const char* s2)\n{\n\tfor (; *s1 && *s2; s1++, s2++)\n\t{\n\t\tif (*s1 != *s2)\n\t\t\treturn false;\n\t}\n\n\treturn !*s1 && !*s2;\n}\n\nNMD_ASSEMBLY_API size_t _nmd_get_bit_index(uint32_t mask)\n{\n\tsize_t i = 0;\n\twhile (!(mask & (1 << i)))\n\t\ti++;\n\n\treturn i;\n}\n\nNMD_ASSEMBLY_API size_t _nmd_assembly_get_num_digits_hex(uint64_t n)\n{\n\tif (n == 0)\n\t\treturn 1;\n\n\tsize_t num_digits = 0;\n\tfor (; n > 0; n /= 16)\n\t\tnum_digits++;\n\n\treturn num_digits;\n}\n\nNMD_ASSEMBLY_API size_t _nmd_assembly_get_num_digits(uint64_t n)\n{\n\tif (n == 0)\n\t\treturn 1;\n\n\tsize_t num_digits = 0;\n\tfor (; n > 0; n /= 10)\n\t\tnum_digits++;\n\n\treturn num_digits;\n}\n\n\ntypedef struct _nmd_assemble_info\n{\n\tchar* s; /* string */\n\tuint8_t* b; /* buffer */\n\tNMD_X86_MODE mode;\n\tuint64_t runtime_address;\n} _nmd_assemble_info;\n\nenum _NMD_NUMBER_BASE\n{\n\t_NMD_NUMBER_BASE_NONE = 0,\n\t_NMD_NUMBER_BASE_DECIMAL = 10,\n\t_NMD_NUMBER_BASE_HEXADECIMAL = 16,\n\t_NMD_NUMBER_BASE_BINARY = 2\n};\n\nNMD_ASSEMBLY_API size_t _nmd_assemble_reg(_nmd_assemble_info* ai, uint8_t base_byte)\n{\n\tuint8_t i = 0;\n\tif (ai->mode == NMD_X86_MODE_64)\n\t{\n\t\tfor (i = 0; i < _NMD_NUM_ELEMENTS(_nmd_reg64); i++)\n\t\t{\n\t\t\tif (_nmd_strcmp(ai->s, _nmd_reg64[i]))\n\t\t\t{\n\t\t\t\tai->b[0] = base_byte + i;\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0; i < _NMD_NUM_ELEMENTS(_nmd_regrx); i++)\n\t\t{\n\t\t\tif (_nmd_strcmp(ai->s, _nmd_regrx[i]))\n\t\t\t{\n\t\t\t\tai->b[0] = 0x41;\n\t\t\t\tai->b[1] = base_byte + i;\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t}\n\t}\n\telse if (ai->mode == NMD_X86_MODE_32)\n\t{\n\t\tfor (i = 0; i < _NMD_NUM_ELEMENTS(_nmd_reg32); i++)\n\t\t{\n\t\t\tif (_nmd_strcmp(ai->s, _nmd_reg32[i]))\n\t\t\t{\n\t\t\t\tai->b[0] = base_byte + i;\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t}\n\t}\t\n\n\tfor (i = 0; i < _NMD_NUM_ELEMENTS(_nmd_reg16); i++)\n\t{\n\t\tif (_nmd_strcmp(ai->s, _nmd_reg16[i]))\n\t\t{\n\t\t\tai->b[0] = 0x66;\n\t\t\tai->b[1] = base_byte + i;\n\t\t\treturn 2;\n\t\t}\n\t}\n\n\treturn 0;\n}\n\nNMD_ASSEMBLY_API uint8_t _nmd_encode_segment_reg(NMD_X86_REG segment_reg)\n{\n\tswitch (segment_reg)\n\t{\n\tcase NMD_X86_REG_ES: return 0x26;\n\tcase NMD_X86_REG_CS: return 0x2e;\n\tcase NMD_X86_REG_SS: return 0x36;\n\tcase NMD_X86_REG_DS: return 0x3e;\n\tcase NMD_X86_REG_FS: return 0x64;\n\tcase NMD_X86_REG_GS: return 0x65;\n\tdefault: return 0;\n\t}\n}\n\nNMD_ASSEMBLY_API size_t _nmd_parse_number(const char* string, int64_t* p_num)\n{\n\tif (*string == '\\0')\n\t\treturn 0;\n\n\t/* Assume decimal base. */\n\tuint8_t base = _NMD_NUMBER_BASE_DECIMAL;\n\tsize_t i;\n\tconst char* s = string;\n\tbool is_negative = false;\n\tbool force_positive = false;\n\tbool h_suffix = false;\n    bool assume_hex = false;\n\n\tif (s[0] == '-')\n\t{\n\t\tis_negative = true;\n\t\ts++;\n\t}\n\telse if (s[0] == '+')\n\t{\n\t\tforce_positive = true;\n\t\ts++;\n\t}\n\n\tif (s[0] == '0')\n\t{\n\t\tif (s[1] == 'x')\n\t\t{\n\t\t\ts += 2;\n\t\t\tbase = _NMD_NUMBER_BASE_HEXADECIMAL;\n\t\t}\n\t\telse if (s[1] == 'b')\n\t\t{\n\t\t\ts += 2;\n\t\t\tbase = _NMD_NUMBER_BASE_BINARY;\n\t\t}\n\t}\n\n\tfor (i = 0; s[i]; i++)\n\t{\n\t\tconst char c = s[i];\n\n\t\tif (base == _NMD_NUMBER_BASE_DECIMAL)\n\t\t{\n\t\t\tif ((c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'))\n\t\t\t{\n\t\t\t\tbase = _NMD_NUMBER_BASE_HEXADECIMAL;\n                assume_hex = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\telse if (!(c >= '0' && c <= '9'))\n\t\t\t\tbreak;\n\t\t}\n\t\telse if (base == _NMD_NUMBER_BASE_HEXADECIMAL)\n\t\t{\n\t\t\tif (!((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')))\n\t\t\t\tbreak;\n\t\t}\n\t\telse if (c != '0' && c != '1') /* _NMD_NUMBER_BASE_BINARY */\n\t\t\tbreak;\n\t}\n\n\tif (s[i] == 'h')\n\t{\n\t\tbase = _NMD_NUMBER_BASE_HEXADECIMAL;\n\t\th_suffix = true;\n\t}\n\n\tconst size_t num_digits = i;\n\tif (num_digits == 0)\n\t\treturn 0;\n\n\tint64_t num = 0;\n\tfor (i = 0; i < num_digits; i++)\n\t{\n\t\tconst char c = s[i];\n\t\tint n = c % 16;\n\t\tif (c >= 'A')\n\t\t\tn += 9;\n\n\t\tnum += n;\n\t\tif (i < num_digits - 1)\n\t\t{\n\t\t\t/* Return false if number is greater than 2^64-1 */\n\t\t\tif ( num_digits > 16 && i >= 15)\n\t\t\t{\n\t\t\t\tif ((base == _NMD_NUMBER_BASE_DECIMAL && (uint64_t)num >= (uint64_t)1844674407370955162) || /* ceiling((2^64-1) / 10) */\n\t\t\t\t\t(base == _NMD_NUMBER_BASE_HEXADECIMAL && (uint64_t)num >= (uint64_t)1152921504606846976) || /* *ceiling((2^64-1) / 16) */\n\t\t\t\t\t(base == _NMD_NUMBER_BASE_BINARY && (uint64_t)num >= (uint64_t)9223372036854775808U)) /* ceiling((2^64-1) / 2) */\n\t\t\t\t{\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t}\n\t\t\tnum *= base;\n\t\t}\n\t}\n\n\tif (is_negative)\n\t\tnum *= -1;\n\n\t*p_num = num;\n\n\tsize_t offset = 0;\n\n\tif (is_negative || force_positive)\n\t\toffset += 1;\n\n\tif (h_suffix)\n\t\toffset += 1;\n\telse if ((base == _NMD_NUMBER_BASE_HEXADECIMAL && !assume_hex) || base == _NMD_NUMBER_BASE_BINARY) /* 0x / 0b*/\n        offset += 2;\n\t\n\treturn offset + num_digits;\n}\n\nNMD_ASSEMBLY_API size_t _nmd_append_prefix_by_reg_size(uint8_t* b, const char* s, size_t* num_prefixes, size_t* index)\n{\n\tsize_t i;\n\t\n\tfor (i = 0; i < _NMD_NUM_ELEMENTS(_nmd_reg32); i++)\n\t{\n\t\tif (_nmd_strcmp(s, _nmd_reg32[i]))\n\t\t{\n\t\t\t*num_prefixes = 0;\n\t\t\t*index = i;\n\t\t\treturn 4;\n\t\t}\n\t}\n\n\tfor (i = 0; i < _NMD_NUM_ELEMENTS(_nmd_reg8); i++)\n\t{\n\t\tif (_nmd_strcmp(s, _nmd_reg8[i]))\n\t\t{\n\t\t\t*num_prefixes = 0;\n\t\t\t*index = i;\n\t\t\treturn 1;\n\t\t}\n\t}\n\n\tfor (i = 0; i < _NMD_NUM_ELEMENTS(_nmd_reg16); i++)\n\t{\n\t\tif (_nmd_strcmp(s, _nmd_reg16[i]))\n\t\t{\n\t\t\tb[0] = 0x66;\n\t\t\t*num_prefixes = 1;\n\t\t\t*index = i;\n\t\t\treturn 2;\n\t\t}\n\t}\t\n\n\tfor (i = 0; i < _NMD_NUM_ELEMENTS(_nmd_reg64); i++)\n\t{\n\t\tif (_nmd_strcmp(s, _nmd_reg64[i]))\n\t\t{\n\t\t\tb[0] = 0x48;\n\t\t\t*num_prefixes = 1;\n\t\t\t*index = i;\n\t\t\treturn 8;\n\t\t}\n\t}\n\n\tfor (i = 0; i < _NMD_NUM_ELEMENTS(_nmd_regrx); i++)\n\t{\n\t\tif (_nmd_strcmp(s, _nmd_regrx[i]))\n\t\t{\n\t\t\tb[0] = 0x49;\n\t\t\t*num_prefixes = 1;\n\t\t\t*index = i;\n\t\t\treturn 8;\n\t\t}\n\t}\n\n\tfor (i = 0; i < _NMD_NUM_ELEMENTS(_nmd_regrxd); i++)\n\t{\n\t\tif (_nmd_strcmp(s, _nmd_regrxd[i]))\n\t\t{\n\t\t\tb[0] = 0x41;\n\t\t\t*num_prefixes = 1;\n\t\t\t*index = i;\n\t\t\treturn 4;\n\t\t}\n\t}\n\n\tfor (i = 0; i < _NMD_NUM_ELEMENTS(_nmd_regrxw); i++)\n\t{\n\t\tif (_nmd_strcmp(s, _nmd_regrxw[i]))\n\t\t{\n\t\t\tb[0] = 0x66;\n\t\t\tb[1] = 0x41;\n\t\t\t*num_prefixes = 2;\n\t\t\t*index = i;\n\t\t\treturn 2;\n\t\t}\n\t}\n\n\tfor (i = 0; i < _NMD_NUM_ELEMENTS(_nmd_regrxb); i++)\n\t{\n\t\tif (_nmd_strcmp(s, _nmd_regrxb[i]))\n\t\t{\n\t\t\tb[0] = 0x41;\n\t\t\t*num_prefixes = 1;\n\t\t\t*index = i;\n\t\t\treturn 1;\n\t\t}\n\t}\n\n\treturn 0;\n}\n\nNMD_ASSEMBLY_API NMD_X86_REG _nmd_parse_reg8(const char** string)\n{\n\tconst char* s = *string;\n\tsize_t i;\n\tfor (i = 0; i < _NMD_NUM_ELEMENTS(_nmd_reg8); i++)\n\t{\n\t\tif (_nmd_strstr_ex(s, _nmd_reg8[i], string) == s)\n\t\t\treturn (NMD_X86_REG)(NMD_X86_REG_AL + i);\n\t}\n\treturn NMD_X86_REG_NONE;\n}\n\nNMD_ASSEMBLY_API NMD_X86_REG _nmd_parse_reg16(const char** string)\n{\n\tconst char* s = *string;\n\tsize_t i;\n\tfor (i = 0; i < _NMD_NUM_ELEMENTS(_nmd_reg16); i++)\n\t{\n\t\tif (_nmd_strstr_ex(s, _nmd_reg16[i], string) == s)\n\t\t\treturn (NMD_X86_REG)(NMD_X86_REG_AX + i);\n\t}\n\treturn NMD_X86_REG_NONE;\n}\n\nNMD_ASSEMBLY_API NMD_X86_REG _nmd_parse_reg32(const char** string)\n{\n\tconst char* s = *string;\n\tsize_t i;\n\tfor (i = 0; i < _NMD_NUM_ELEMENTS(_nmd_reg32); i++)\n\t{\n\t\tif (_nmd_strstr_ex(s, _nmd_reg32[i], string) == s)\n\t\t\treturn (NMD_X86_REG)(NMD_X86_REG_EAX + i);\n\t}\n\treturn NMD_X86_REG_NONE;\n}\n\nNMD_ASSEMBLY_API NMD_X86_REG _nmd_parse_reg64(const char** string)\n{\n\tconst char* s = *string;\n\tsize_t i;\n\tfor (i = 0; i < _NMD_NUM_ELEMENTS(_nmd_reg64); i++)\n\t{\n\t\tif (_nmd_strstr_ex(s, _nmd_reg64[i], string) == s)\n\t\t\treturn (NMD_X86_REG)(NMD_X86_REG_RAX + i);\n\t}\n\treturn NMD_X86_REG_NONE;\n}\n\nNMD_ASSEMBLY_API NMD_X86_REG _nmd_parse_regrxb(const char** string)\n{\n\tconst char* s = *string;\n\tsize_t i;\n\tfor (i = 0; i < _NMD_NUM_ELEMENTS(_nmd_regrxb); i++)\n\t{\n\t\tif (_nmd_strstr_ex(s, _nmd_regrxb[i], string) == s)\n\t\t\treturn (NMD_X86_REG)(NMD_X86_REG_R8B + i);\n\t}\n\treturn NMD_X86_REG_NONE;\n}\n\nNMD_ASSEMBLY_API NMD_X86_REG _nmd_parse_regrxw(const char** string)\n{\n\tconst char* s = *string;\n\tsize_t i;\n\tfor (i = 0; i < _NMD_NUM_ELEMENTS(_nmd_regrxw); i++)\n\t{\n\t\tif (_nmd_strstr_ex(s, _nmd_regrxw[i], string) == s)\n\t\t\treturn (NMD_X86_REG)(NMD_X86_REG_R8W + i);\n\t}\n\treturn NMD_X86_REG_NONE;\n}\n\nNMD_ASSEMBLY_API NMD_X86_REG _nmd_parse_regrxd(const char** string)\n{\n\tconst char* s = *string;\n\tsize_t i;\n\tfor (i = 0; i < _NMD_NUM_ELEMENTS(_nmd_regrxd); i++)\n\t{\n\t\tif (_nmd_strstr_ex(s, _nmd_regrxd[i], string) == s)\n\t\t\treturn (NMD_X86_REG)(NMD_X86_REG_R8D + i);\n\t}\n\treturn NMD_X86_REG_NONE;\n}\n\nNMD_ASSEMBLY_API NMD_X86_REG _nmd_parse_regrx(const char** string)\n{\n\tconst char* s = *string;\n\tsize_t i;\n\tfor (i = 0; i < _NMD_NUM_ELEMENTS(_nmd_regrx); i++)\n\t{\n\t\tif (_nmd_strstr_ex(s, _nmd_regrx[i], string) == s)\n\t\t\treturn (NMD_X86_REG)(NMD_X86_REG_R8 + i);\n\t}\n\treturn NMD_X86_REG_NONE;\n}\n\n/* Parses a register */\nNMD_ASSEMBLY_API NMD_X86_REG _nmd_parse_reg(const char** string)\n{\n    NMD_X86_REG reg;\n    if(!(reg = _nmd_parse_reg8(string)) && !(reg = _nmd_parse_reg16(string)) && !(reg = _nmd_parse_reg32(string)) && !(reg = _nmd_parse_reg64(string)) &&\n    !(reg = _nmd_parse_regrxb(string)) && !(reg = _nmd_parse_regrxw(string)) && !(reg = _nmd_parse_regrxd(string)) && !(reg = _nmd_parse_regrx(string)))\n    { }\n    \n    return reg;\n}\n\n/* \nParses a memory operand in the format: '[exp]'\nstring: a pointer to the string that represents the memory operand. The string is modified to point to the character after the memory operand.\noperand[out]: Describes the memory operand.\nsize[out]: The size of the pointer. byte ptr:1, dword ptr:4, etc.. or zero if unknown.\nReturn value: True if success, false otherwise.\n*/\nNMD_ASSEMBLY_API bool _nmd_parse_memory_operand(const char** string, nmd_x86_memory_operand* operand, size_t* size)\n{\n\t/* Check for pointer size */\n\tconst char* s = *string;\n\tsize_t num_bytes;\n\tif (_nmd_strstr(s, \"byte\") == s)\n\t\tnum_bytes = 1;\n\telse if (_nmd_strstr(s, \"word\") == s)\n\t\tnum_bytes = 2;\n\telse if (_nmd_strstr(s, \"dword\") == s)\n\t\tnum_bytes = 4;\n\telse if (_nmd_strstr(s, \"qword\") == s)\n\t\tnum_bytes = 8;\n\telse\n\t\tnum_bytes = 0;\n\t*size = num_bytes;\n\n\t/* Check for the \"ptr\" keyword. It should only be present if a pointer size was specified */\n\tif (num_bytes > 0)\n\t{\n\t\ts += num_bytes >= 4 ? 5 : 4;\n\n\t\t/* \" ptr\" */\n\t\tif (s[0] == ' ' && s[1] == 'p' && s[2] == 't' && s[3] == 'r')\n\t\t\ts += 4;\n\n\t\tif (s[0] == ' ')\n\t\t\ts++;\n\t\telse if (s[0] != '[')\n\t\t\treturn false;\n\t}\n\n\t/* Check for a segment register */\n\tsize_t i = 0;\n\toperand->segment = NMD_X86_REG_NONE;\n\tfor (; i < _NMD_NUM_ELEMENTS(_nmd_segment_reg); i++)\n\t{\n\t\tif (_nmd_strstr(s, _nmd_segment_reg[i]) == s)\n\t\t{\n\t\t\tif (s[2] != ':')\n\t\t\t\treturn false;\n\n\t\t\ts += 3;\n\t\t\toperand->segment = (uint8_t)(NMD_X86_REG_ES + i);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t/* Check for the actual memory operand expression. If this check fails, this is not a memory operand */\n\tif (s[0] == '[')\n\t\ts++;\n\telse\n\t\treturn false;\n\t\n\t/* \n\tParse the memory operand expression.\n\tEven though formally there's no support for subtraction, if the expression has such operation between\n\ttwo numeric operands, it'll be resolved to a single number(the same applies for the other operations).\n\t*/\n\toperand->base = 0;\n\toperand->index = 0;\n\toperand->scale = 0;\n\toperand->disp = 0;\n\tbool add = false;\n\tbool sub = false;\n\tbool multiply = false;\n\tbool is_register = false;\n\twhile (true)\n\t{\n\t\t/* \n\t\tCheck for the base/index register. The previous math operation must not be subtration\n\t\tnor multiplication because these are not valid for registers(only addition is).\n\t\t*/\n\t\tbool parsed_element = false;\n\t\tif (!sub && !multiply)\n\t\t{\n\t\t\tfor (i = 0; i < _NMD_NUM_ELEMENTS(_nmd_reg32); i++)\n\t\t\t{\n\t\t\t\tconst char* tmp;\n\t\t\t\tif (_nmd_strstr_ex(s, _nmd_reg32[i], &tmp) == s)\n\t\t\t\t{\n\t\t\t\t\ts = tmp;\n\t\t\t\t\tif (add)\n\t\t\t\t\t{\n\t\t\t\t\t\toperand->index = (uint8_t)(NMD_X86_REG_EAX + i);\n\t\t\t\t\t\toperand->scale = 1;\n\t\t\t\t\t\tadd = false;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\toperand->base = (uint8_t)(NMD_X86_REG_EAX + i);\n\t\t\t\t\tparsed_element = true;\n\t\t\t\t\tis_register = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tint64_t num;\n\t\tsize_t num_digits;\n\t\tif (!parsed_element && (num_digits = _nmd_parse_number(s, &num)))\n\t\t{\n\t\t\ts += num_digits;\n\n\t\t\tif (add)\n\t\t\t{\n\t\t\t\toperand->disp += num;\n\t\t\t\tadd = false;\n\t\t\t}\n\t\t\telse if (sub)\n\t\t\t{\n\t\t\t\toperand->disp -= num;\n\t\t\t\tsub = false;\n\t\t\t}\n\t\t\telse if (multiply)\n\t\t\t{\n\t\t\t\tif (!is_register || (num != 1 && num != 2 && num != 4 && num != 8))\n\t\t\t\t\treturn false;\n\n\t\t\t\toperand->scale = (uint8_t)num;\n\t\t\t}\n\t\t\telse\n\t\t\t\toperand->disp = num;\n\n\t\t\tparsed_element = true;\n\t\t}\n\n\t\tif (!parsed_element)\n\t\t\treturn false;\n\n\t\tif (s[0] == '+')\n\t\t\tadd = true;\n\t\telse if (s[0] == '-')\n\t\t\tsub = true;\n\t\telse if (s[0] == '*')\n\t\t{\n\t\t\t/* There cannot be more than one '*' operator. */\n\t\t\tif (multiply)\n\t\t\t\treturn false;\n\n\t\t\tmultiply = true;\n\t\t}\n\t\telse if (s[0] == ']')\n\t\t\tbreak;\n\t\telse\n\t\t\treturn false;\n\n\t\ts++;\n\t}\n\n\t*string = s + 1;\n\treturn true;\n}\n\nNMD_ASSEMBLY_API size_t _nmd_assemble_mem_reg(uint8_t* buffer, nmd_x86_memory_operand* mem, uint8_t opcode, uint8_t modrm_reg)\n{\n\tsize_t offset = 0;\n\t\n\t/* Assemble segment register if required */\n\tif (mem->segment && mem->segment != ((mem->base == NMD_X86_REG_ESP || mem->index == NMD_X86_REG_ESP) ? NMD_X86_REG_SS : NMD_X86_REG_DS))\n\t\tbuffer[offset++] = _nmd_encode_segment_reg((NMD_X86_REG)mem->segment);\n\n\tbuffer[offset++] = opcode;\n\n\tnmd_x86_modrm modrm;\n\tmodrm.fields.reg = modrm_reg;\n\tmodrm.fields.mod = 0;\n\n\tif (mem->index != NMD_X86_REG_NONE && mem->base != NMD_X86_REG_NONE)\n\t{\n\t\tmodrm.fields.rm = 0b100;\n\t\tnmd_x86_sib sib;\n\t\tsib.fields.scale = (uint8_t)_nmd_get_bit_index(mem->scale);\n\t\tsib.fields.base = mem->base - NMD_X86_REG_EAX;\n\t\tsib.fields.index = mem->index - NMD_X86_REG_EAX;\n\n\t\tconst size_t next_offset = offset;\n\t\tif (mem->disp != 0)\n\t\t{\n\t\t\tif (mem->disp >= -128 && mem->disp <= 127)\n\t\t\t{\n\t\t\t\tmodrm.fields.mod = 1;\n\t\t\t\t*(int8_t*)(buffer + offset + 2) = (int8_t)mem->disp;\n\t\t\t\toffset++;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tmodrm.fields.mod = 2;\n\t\t\t\t*(int32_t*)(buffer + offset + 2) = (int32_t)mem->disp;\n\t\t\t\toffset += 4;\n\t\t\t}\n\t\t}\n\n\t\tbuffer[next_offset] = modrm.modrm;\n\t\tbuffer[next_offset + 1] = sib.sib;\n\t\toffset += 2;\n\n\t\treturn offset;\n\t}\n\telse if (mem->base != NMD_X86_REG_NONE)\n\t{\n\t\tmodrm.fields.rm = mem->base - NMD_X86_REG_EAX;\n\t\tconst size_t next_offset = offset;\n\t\tif (mem->disp != 0)\n\t\t{\n\t\t\tif (mem->disp >= -128 && mem->disp <= 127)\n\t\t\t{\n\t\t\t\tmodrm.fields.mod = 1;\n\t\t\t\t*(int8_t*)(buffer + offset + 1) = (int8_t)mem->disp;\n\t\t\t\toffset++;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tmodrm.fields.mod = 2;\n\t\t\t\t*(int32_t*)(buffer + offset + 1) = (int32_t)mem->disp;\n\t\t\t\toffset += 4;\n\t\t\t}\n\t\t}\n\t\tbuffer[next_offset] = modrm.modrm;\n\t\toffset++;\n\t}\n\telse\n\t{\n\t\tmodrm.fields.rm = 0b101;\n\t\tbuffer[offset++] = modrm.modrm;\n\t\t*(int32_t*)(buffer + offset) = (int32_t)mem->disp;\n\t\toffset += 4;\n\t}\n\n\treturn offset;\n}\n\nNMD_ASSEMBLY_API size_t _nmd_assemble_single(_nmd_assemble_info* ai)\n{\n    const char* s;\n    int64_t num;\n    size_t num_digits;\n    NMD_X86_REG reg, reg2;\n\tsize_t i = 0;\n\n\t/* Parse prefixes */\n\tbool lock_prefix = false, repeat_prefix = false, repeat_zero_prefix = false, repeat_not_zero_prefix = false;\n\tif (_nmd_strstr(ai->s, \"lock \") == ai->s)\n\t\tlock_prefix = true, ai->s += 5;\n\telse if (_nmd_strstr(ai->s, \"rep \") == ai->s)\n\t\trepeat_prefix = true, ai->s += 4;\n\telse if (_nmd_strstr(ai->s, \"repe \") == ai->s || _nmd_strstr(ai->s, \"repz \") == ai->s)\n\t\trepeat_zero_prefix = true, ai->s += 5;\n\telse if (_nmd_strstr(ai->s, \"repne \") == ai->s || _nmd_strstr(ai->s, \"repnz \") == ai->s)\n\t\trepeat_not_zero_prefix = true, ai->s += 6;\n\t\n\tif (_nmd_strstr(ai->s, \"xacquire \") == ai->s)\n\t{\n\n\t}\n\telse if (_nmd_strstr(ai->s, \"xrelease \") == ai->s)\n\t{\n\n\t}\n\n\t/* Parse opcodes */\n\tif (ai->mode == NMD_X86_MODE_64) /* Only x86-64. */\n\t{\n\t\tif (_nmd_strstr(ai->s, \"mov \"))\n\t\t{\n\t\t\tconst char* s = ai->s + 4;\n\t\t\tif ((reg = _nmd_parse_regrxb((const char**)&s)))\n\t\t\t{\n\t\t\t\tai->b[0] = 0x41;\n\t\t\t\tai->b[1] = 0xb0 + (reg - NMD_X86_REG_R8B);\n\n\t\t\t\tif (*s++ != ',')\n\t\t\t\t\treturn 0;\n\n\t\t\t\tif ((num_digits = _nmd_parse_number(s, &num)))\n\t\t\t\t{\n\t\t\t\t\tai->b[2] = (uint8_t)num;\n\t\t\t\t\treturn 3;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (_nmd_strstr(ai->s, \"push \") == ai->s || _nmd_strstr(ai->s, \"pop \") == ai->s)\n\t\t{\n\t\t\tconst bool is_push = ai->s[1] == 'u';\n\t\t\ts = ai->s + (is_push ? 5 : 4);\n\t\t\tif (((reg = _nmd_parse_reg64(&s))) && !*s)\n\t\t\t{\n\t\t\t\tai->b[0] = (is_push ? 0x50 : 0x58) + reg % 8;\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\telse if ((reg = _nmd_parse_regrxw(&s)) && !*s)\n\t\t\t{\n\t\t\t\tai->b[0] = 0x66;\n\t\t\t\tai->b[1] = 0x41;\n\t\t\t\tai->b[2] = (is_push ? 0x50 : 0x58) + reg % 8;\n\t\t\t\treturn 3;\n\t\t\t}\n\t\t\telse if (((reg = _nmd_parse_regrx(&s))) && !*s)\n\t\t\t{\n\t\t\t\tai->b[0] = 0x41;\n\t\t\t\tai->b[1] = (is_push ? 0x50 : 0x58) + reg % 8;\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t}\n\t\telse if (_nmd_strstr(ai->s, \"mov \") == ai->s)\n\t\t{\n\t\t\tai->s += 4;\n\t\t\tif ((reg = _nmd_parse_reg8((const char**)&ai->s)))\n\t\t\t{\n\t\t\t\tai->b[0] = 0xb0 + reg % 8;\n\n\t\t\t\tif (*ai->s++ != ',')\n\t\t\t\t\treturn 0;\n\n\t\t\t\tif ((num_digits = _nmd_parse_number(ai->s, &num)))\n\t\t\t\t{\n\t\t\t\t\tai->b[1] = (uint8_t)num;\n\t\t\t\t\treturn 2;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (_nmd_strcmp(ai->s, \"xchg r8,rax\") || _nmd_strcmp(ai->s, \"xchg rax,r8\"))\n\t\t{\n\t\t\tai->b[0] = 0x49;\n\t\t\tai->b[1] = 0x90;\n\t\t\treturn 2;\n\t\t}\n\t\telse if (_nmd_strcmp(ai->s, \"xchg r8d,eax\") || _nmd_strcmp(ai->s, \"xchg eax,r8d\"))\n\t\t{\n\t\t\tai->b[0] = 0x41;\n\t\t\tai->b[1] = 0x90;\n\t\t\treturn 2;\n\t\t}\n\t\telse if (_nmd_strcmp(ai->s, \"pushfq\"))\n\t\t{\n\t\t\tai->b[0] = 0x9c;\n\t\t\treturn 1;\n\t\t}\n\t\telse if (_nmd_strcmp(ai->s, \"popfq\"))\n\t\t{\n\t\t\tai->b[0] = 0x9d;\n\t\t\treturn 1;\n\t\t}\n\t\telse if (_nmd_strcmp(ai->s, \"iretq\"))\n\t\t{\n\t\t\tai->b[0] = 0x48;\n\t\t\tai->b[1] = 0xcf;\n\t\t\treturn 2;\n\t\t}\n\t\telse if (_nmd_strcmp(ai->s, \"cdqe\"))\n\t\t{\n\t\t\tai->b[0] = 0x48;\n\t\t\tai->b[1] = 0x98;\n\t\t\treturn 2;\n\t\t}\n\t\telse if (_nmd_strcmp(ai->s, \"cqo\"))\n\t\t{\n\t\t\tai->b[0] = 0x48;\n\t\t\tai->b[1] = 0x99;\n\t\t\treturn 2;\n\t\t}\n\t}\n\telse /* x86-16 / x86-32 */\n\t{\n\t\tif (_nmd_strstr(ai->s, \"inc \") || _nmd_strstr(ai->s, \"dec \"))\n\t\t{\n\t\t\tconst bool is_inc = ai->s[0] == 'i';\n\t\t\ts = ai->s + 4;\n\t\t\tint offset = 0;\n\t\t\tif (((reg = _nmd_parse_reg32(&s))) && !*s)\n\t\t\t{\n\t\t\t\tif (ai->mode == NMD_X86_MODE_16)\n\t\t\t\t\tai->b[offset++] = 0x66;\n\t\t\t}\n\t\t\telse if (((reg = _nmd_parse_reg16(&s))) && !*s)\n\t\t\t{\n\t\t\t\tif (ai->mode == NMD_X86_MODE_32)\n\t\t\t\t\tai->b[offset++] = 0x66;\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn 0;\n\n\t\t\tai->b[offset++] = (is_inc ? 0x40 : 0x48) + reg % 8;\n\t\t\treturn offset;\n\t\t}\n\t\telse if (_nmd_strstr(ai->s, \"push \") == ai->s || _nmd_strstr(ai->s, \"pop \") == ai->s)\n\t\t{\n\t\t\tconst bool is_push = ai->s[1] == 'u';\n\t\t\ts = ai->s + (is_push ? 5 : 4);\n\t\t\tif (((reg = _nmd_parse_reg32(&s))) && !*s)\n\t\t\t{\n\t\t\t\tif (ai->mode == NMD_X86_MODE_16)\n\t\t\t\t{\n\t\t\t\t\tai->b[0] = 0x66;\n\t\t\t\t\tai->b[1] = (is_push ? 0x50 : 0x58) + reg % 8;\n\t\t\t\t\treturn 2;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tai->b[0] = (is_push ? 0x50 : 0x58) + reg % 8;\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (_nmd_strcmp(ai->s, \"pushad\"))\n\t\t{\n\t\t\tif (ai->mode == NMD_X86_MODE_16)\n\t\t\t{\n\t\t\t\tai->b[0] = 0x66;\n\t\t\t\tai->b[1] = 0x60;\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tai->b[0] = 0x60;\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t}\n\t\telse if (_nmd_strcmp(ai->s, \"pusha\"))\n\t\t{\n\t\t\tif (ai->mode == NMD_X86_MODE_16)\n\t\t\t{\n\t\t\t\tai->b[0] = 0x60;\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tai->b[0] = 0x66;\n\t\t\t\tai->b[1] = 0x60;\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t}\n\t\telse if (_nmd_strcmp(ai->s, \"popad\"))\n\t\t{\n\t\t\tif (ai->mode == NMD_X86_MODE_16)\n\t\t\t{\n\t\t\t\tai->b[0] = 0x66;\n\t\t\t\tai->b[1] = 0x61;\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tai->b[0] = 0x61;\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t}\n\t\telse if (_nmd_strcmp(ai->s, \"popa\"))\n\t\t{\n\t\t\tif (ai->mode == NMD_X86_MODE_16)\n\t\t\t{\n\t\t\t\tai->b[0] = 0x61;\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tai->b[0] = 0x66;\n\t\t\t\tai->b[1] = 0x61;\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t}\n\t\telse if (_nmd_strcmp(ai->s, \"pushfd\"))\n\t\t{\n\t\t\tif (ai->mode == NMD_X86_MODE_16)\n\t\t\t{\n\t\t\t\tai->b[0] = 0x66;\n\t\t\t\tai->b[1] = 0x9c;\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tai->b[0] = 0x9c;\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t}\n\t\telse if (_nmd_strcmp(ai->s, \"popfd\"))\n\t\t{\n\t\t\tif (ai->mode == NMD_X86_MODE_16)\n\t\t\t{\n\t\t\t\tai->b[0] = 0x66;\n\t\t\t\tai->b[1] = 0x9d;\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tai->b[0] = 0x9d;\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t}\n\t}\n\n\ttypedef struct _nmd_string_byte_pair { const char* s; uint8_t b; } _nmd_string_byte_pair;\n\n\tconst _nmd_string_byte_pair single_byte_op1[] = {\n\t\t{ \"int3\",    0xcc },\n\t\t{ \"nop\",     0x90 },\n\t\t{ \"ret\",     0xc3 },\n\t\t{ \"retf\",    0xcb },\n\t\t{ \"ret far\", 0xcb },\n\t\t{ \"leave\",   0xc9 },\n\t\t{ \"int1\",    0xf1 },\n\t\t{ \"push es\", 0x06 },\n\t\t{ \"push ss\", 0x16 },\n\t\t{ \"push ds\", 0x1e },\n\t\t{ \"push cs\", 0x0e },\n\t\t{ \"pop es\",  0x07 },\n\t\t{ \"pop ss\",  0x17 },\n\t\t{ \"pop ds\",  0x1f },\n\t\t{ \"daa\",     0x27 },\n\t\t{ \"aaa\",     0x37 },\n\t\t{ \"das\",     0x2f },\n\t\t{ \"aas\",     0x3f },\n\t\t{ \"xlat\",    0xd7 },\n\t\t{ \"fwait\",   0x9b },\n\t\t{ \"hlt\",     0xf4 },\n\t\t{ \"cmc\",     0xf5 },\n\t\t{ \"clc\",     0xf8 },\n\t\t{ \"sahf\",    0x9e },\n\t\t{ \"lahf\",    0x9f },\n\t\t{ \"into\",    0xce },\n\t\t{ \"salc\",    0xd6 },\n\t\t{ \"slc\",     0xf8 },\n\t\t{ \"stc\",     0xf9 },\n\t\t{ \"cli\",     0xfa },\n\t\t{ \"sti\",     0xfb },\n\t\t{ \"cld\",     0xfc },\n\t\t{ \"std\",     0xfd },\n\t};\n\tfor (i = 0; i < _NMD_NUM_ELEMENTS(single_byte_op1); i++)\n\t{\n\t\tif (_nmd_strcmp(ai->s, single_byte_op1[i].s))\n\t\t{\n\t\t\tai->b[0] = single_byte_op1[i].b;\n\t\t\treturn 1;\n\t\t}\n\t}\n\n\tconst _nmd_string_byte_pair single_byte_op2[] = {\n\t\t{ \"syscall\",  0x05 },\n\t\t{ \"clts\",     0x06 },\n\t\t{ \"sysret\",   0x07 },\n\t\t{ \"invd\",     0x08 },\n\t\t{ \"wbinvd\",   0x09 },\n\t\t{ \"ud2\",      0x0b },\n\t\t{ \"femms\",    0x0e },\n\t\t{ \"wrmsr\",    0x30 },\n\t\t{ \"rdtsc\",    0x31 },\n\t\t{ \"rdmsr\",    0x32 },\n\t\t{ \"rdpmc\",    0x33 },\n\t\t{ \"sysenter\", 0x34 },\n\t\t{ \"sysexit\",  0x35 },\n\t\t{ \"getsec\",   0x37 },\n\t\t{ \"emms\",     0x77 },\n\t\t{ \"push fs\",  0xa0 },\n\t\t{ \"pop fs\",   0xa1 },\n\t\t{ \"cpuid\",    0xa2 },\n\t\t{ \"push gs\",  0xa8 },\n\t\t{ \"pop gs\",   0xa9 },\n\t\t{ \"rsm\",      0xaa }\n\t};\n\tfor (i = 0; i < _NMD_NUM_ELEMENTS(single_byte_op2); i++)\n\t{\n\t\tif (_nmd_strcmp(ai->s, single_byte_op2[i].s))\n\t\t{\n\t\t\tai->b[0] = 0x0f;\n\t\t\tai->b[1] = single_byte_op2[i].b;\n\t\t\treturn 2;\n\t\t}\n\t}\n\t\n\t/* Parse 'add', 'adc', 'and', 'xor', 'or', 'sbb', 'sub' and 'cmp' . Opcodes in first \"4 rows\"/[80, 83] */\n\tfor (i = 0; i < _NMD_NUM_ELEMENTS(_nmd_op1_opcode_map_mnemonics); i++)\n\t{\n\t\tif (_nmd_strstr(ai->s, _nmd_op1_opcode_map_mnemonics[i]) == ai->s)\n\t\t{\n\t\t\tconst uint8_t base_opcode = (i % 4) * 0x10 + (i >= 4 ? 8 : 0);\n\t\t\tai->s += 4;\n            \n\t\t\tnmd_x86_memory_operand memory_operand;\n\t\t\tsize_t pointer_size;\n\t\t\tif (_nmd_parse_memory_operand((const char**)&ai->s, &memory_operand, &pointer_size)) /* Colum 00,01,08,09 */\n\t\t\t{                \n\t\t\t\tif (*ai->s++ != ',' || !(reg = _nmd_parse_reg((const char**)&ai->s)))\n\t\t\t\t\treturn 0;\n                \n\t\t\t\treturn _nmd_assemble_mem_reg(ai->b, &memory_operand, base_opcode, reg % 8);\n\n\t\t\t\t/*\n\t\t\t\tsize_t offset = 0;\n\t\t\t\tif (memory_operand.segment && memory_operand.segment != ((memory_operand.base == NMD_X86_REG_ESP || memory_operand.index == NMD_X86_REG_ESP) ? NMD_X86_REG_SS : NMD_X86_REG_DS))\n\t\t\t\t\tai->b[offset++] = _nmd_encode_segment_reg((NMD_X86_REG)memory_operand.segment);\n\t\t\t\t\n\t\t\t\tif (pointer_size == 1)\n\t\t\t\t{\n\t\t\t\t\tai->b[offset++] = base_opcode + 0;\n\t\t\t\t\n\t\t\t\t\tif (*ai->s++ != ',')\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\n\t\t\t\t\tNMD_X86_REG reg = _nmd_parse_reg(&ai->s);\n\t\t\t\t\n\t\t\t\t\tnmd_x86_modrm modrm;\n\t\t\t\t\tmodrm.fields.mod = 0;\n\t\t\t\t\tmodrm.fields.reg = (reg - 1) % 8;\n\t\t\t\t\tmodrm.fields.rm = (memory_operand.base - 1) % 8;\n\t\t\t\t\n\t\t\t\t\tai->b[offset++] = modrm.modrm;\n\t\t\t\t\n\t\t\t\t\treturn offset;\n\t\t\t\t}\n\t\t\t\t*/\n\t\t\t}\n            else if (_nmd_strstr_ex(ai->s, \"al,\", &s) == ai->s && (num_digits = _nmd_parse_number(s, &num)) && *(s + num_digits) == '\\0') /* column 04,0C */\n\t\t\t{\n\t\t\t\tif (num < -0x80 || num > 0xff)\n\t\t\t\t\treturn 0;\n\n\t\t\t\tai->b[0] = base_opcode + 4;\n\t\t\t\tai->b[1] = (int8_t)num;\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t\telse if ((_nmd_strstr_ex(ai->s, \"eax,\", &s) == ai->s || _nmd_strstr_ex(ai->s, \"ax,\", &s) == ai->s || _nmd_strstr_ex(ai->s, \"rax,\", &s) == ai->s) && _nmd_parse_number(s, &num)) /* column 05,0D */\n\t\t\t{\n\t\t\t\tconst bool is_eax = ai->s[0] == 'e';\n\t\t\t\tconst bool is_ax = ai->s[1] == 'x';\n\n\t\t\t\tif (is_eax)\n\t\t\t\t{\n\t\t\t\t\tif (num < -(int64_t)0x80000000 || num > 0xffffffff)\n\t\t\t\t\t\treturn 0;\n\n\t\t\t\t\tai->b[0] = base_opcode + 5;\n\t\t\t\t\t*(int32_t*)(ai->b + 1) = (int32_t)num;\n\t\t\t\t\treturn 5;\n\t\t\t\t}\n\t\t\t\telse if (!is_eax)\n\t\t\t\t{\n\t\t\t\t\tif (ai->mode != NMD_X86_MODE_64 && !is_ax)\n\t\t\t\t\t\treturn 0;\n\n\t\t\t\t\tai->b[0] = is_ax ? 0x66 : 0x48;\n\t\t\t\t\tai->b[1] = base_opcode + 5;\n\n\t\t\t\t\tif (is_ax)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (num < -0x8000 || num > 0xffff)\n\t\t\t\t\t\t\treturn 0;\n\n\t\t\t\t\t\t*(int16_t*)(ai->b + 2) = (int16_t)num;\n\t\t\t\t\t\treturn 4;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (num < -(int64_t)0x80000000 || num > 0xffffffff)\n\t\t\t\t\t\t\treturn 0;\n\n\t\t\t\t\t\t*(int32_t*)(ai->b + 2) = (int32_t)num;\n\t\t\t\t\t\treturn 6;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n            else if ((reg = _nmd_parse_reg((const char**)&ai->s)) && *ai->s++ == ',') /* column 00-04,08-0B */\n            {\n                if(_nmd_parse_memory_operand((const char**)&ai->s, &memory_operand, &pointer_size)) /* column 02,03,0A,0B */\n                {\n                    return 0;\n                }\n                else /* 00,01,08,09 */\n                {\n                    if(!(reg2 = _nmd_parse_reg((const char**)&ai->s)))\n                        return 0;\n                    \n                    ai->b[0] = base_opcode;\n                    \n                    /* mod = 0b11, reg = reg2, rm = reg */\n                    ai->b[1] = 0b11000000 | ((reg2 % 8) << 3) | (reg % 8);\n                    \n                    return 2;\n                }\n            }\n\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\tif (_nmd_strstr(ai->s, \"jmp \") == ai->s)\n\t{\n\t\tif (!(num_digits = _nmd_parse_number(ai->s + 4, &num)) && ai->s[4 + num_digits] == '\\0')\n\t\t\treturn 0;\n\n\t\tsize_t offset = 0;\n\t\tif (ai->mode == NMD_X86_MODE_16)\n\t\t\tai->b[offset++] = 0x66;\n\t\tai->b[offset++] = 0xe9;\n\t\tconst int64_t size = (int64_t)offset + 4;\n\t\t*(uint32_t*)(ai->b + offset) = (uint32_t)((ai->runtime_address == NMD_X86_INVALID_RUNTIME_ADDRESS) ? (num - size) : (ai->runtime_address + size + num));\n\t\treturn size;\n\t}\n\telse if (ai->s[0] == 'j')\n\t{\n\t\tchar* s = ai->s;\n\t\twhile (true)\n\t\t{\n\t\t\tif (*s == ' ')\n\t\t\t{\n\t\t\t\t*s = '\\0';\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (*s == '\\0')\n\t\t\t\treturn 0;\n\n\t\t\ts++;\n\t\t}\n\n\t\tfor (i = 0; i < _NMD_NUM_ELEMENTS(_nmd_condition_suffixes); i++)\n\t\t{\n\t\t\tif (_nmd_strcmp(ai->s + 1, _nmd_condition_suffixes[i]))\n\t\t\t{\n\t\t\t\tif (!(num_digits = _nmd_parse_number(s + 1, &num)))\n\t\t\t\t\treturn 0;\n\n\t\t\t\tconst int64_t delta = (ai->runtime_address == NMD_X86_INVALID_RUNTIME_ADDRESS ? num : num - ai->runtime_address);\n\t\t\t\tif (delta >= -(1 << 7) + 2 && delta <= (1 << 7) - 1 + 2)\n\t\t\t\t{\n\t\t\t\t\tai->b[0] = 0x70 + (uint8_t)i;\n\t\t\t\t\t*(int8_t*)(ai->b + 1) = (int8_t)(delta - 2);\n\t\t\t\t\treturn 2;\n\t\t\t\t}\n\t\t\t\telse if (delta >= -((int64_t)1 << 31) + 6 && delta <= ((int64_t)1 << 31) - 1 + 6)\n\t\t\t\t{\n\t\t\t\t\tsize_t offset = 0;\n\t\t\t\t\tif (ai->mode == NMD_X86_MODE_16)\n\t\t\t\t\t\tai->b[offset++] = 0x66;\n\n\t\t\t\t\tai->b[offset++] = 0x0f;\n\t\t\t\t\tai->b[offset++] = 0x80 + (uint8_t)i;\n\t\t\t\t\t*(int32_t*)(ai->b + offset) = (int32_t)(delta - (offset+4));\n\t\t\t\t\treturn offset + 4;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if (_nmd_strstr(ai->s, \"inc \") == ai->s || _nmd_strstr(ai->s, \"dec \") == ai->s)\n\t{\n\t\tconst char* tmp = ai->s + 4;\n\t\tnmd_x86_memory_operand memory_operand;\n\t\tsize_t size;\n\t\tif (_nmd_parse_memory_operand(&tmp, &memory_operand, &size))\n\t\t{\n\t\t\tsize_t offset = 0;\n\t\t\tif (memory_operand.segment && memory_operand.segment != ((memory_operand.base == NMD_X86_REG_ESP || memory_operand.index == NMD_X86_REG_ESP) ? NMD_X86_REG_SS : NMD_X86_REG_DS))\n\t\t\t\tai->b[offset++] = _nmd_encode_segment_reg((NMD_X86_REG)memory_operand.segment);\n\n\t\t\tai->b[offset++] = size == 1 ? 0xfe : 0xff;\n\n\t\t\tnmd_x86_modrm modrm;\n\t\t\tmodrm.fields.reg = ai->s[0] == 'i' ? 0 : 8;\n\t\t\tmodrm.fields.mod = 0;\n\n\t\t\tif (memory_operand.index != NMD_X86_REG_NONE && memory_operand.base != NMD_X86_REG_NONE)\n\t\t\t{\n\t\t\t\tmodrm.fields.rm = 0b100;\n\t\t\t\tnmd_x86_sib sib;\n\t\t\t\tsib.fields.scale = (uint8_t)_nmd_get_bit_index(memory_operand.scale);\n\t\t\t\tsib.fields.base = memory_operand.base - NMD_X86_REG_EAX;\n\t\t\t\tsib.fields.index = memory_operand.index - NMD_X86_REG_EAX;\n\n\t\t\t\tconst size_t next_offset = offset;\n\t\t\t\tif (memory_operand.disp != 0)\n\t\t\t\t{\n\t\t\t\t\tif (memory_operand.disp >= -128 && memory_operand.disp <= 127)\n\t\t\t\t\t{\n\t\t\t\t\t\tmodrm.fields.mod = 1;\n\t\t\t\t\t\t*(int8_t*)(ai->b + offset + 2) = (int8_t)memory_operand.disp;\n\t\t\t\t\t\toffset++;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tmodrm.fields.mod = 2;\n\t\t\t\t\t\t*(int32_t*)(ai->b + offset + 2) = (int32_t)memory_operand.disp;\n\t\t\t\t\t\toffset += 4;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tai->b[next_offset] = modrm.modrm;\n\t\t\t\tai->b[next_offset + 1] = sib.sib;\n\t\t\t\toffset += 2;\n\n\t\t\t\treturn offset;\n\t\t\t}\n\t\t\telse if (memory_operand.base != NMD_X86_REG_NONE)\n\t\t\t{\n\t\t\t\tmodrm.fields.rm = memory_operand.base - NMD_X86_REG_EAX;\n\t\t\t\tconst size_t next_offset = offset;\n\t\t\t\tif (memory_operand.disp != 0)\n\t\t\t\t{\n\t\t\t\t\tif (memory_operand.disp >= -128 && memory_operand.disp <= 127)\n\t\t\t\t\t{\n\t\t\t\t\t\tmodrm.fields.mod = 1;\n\t\t\t\t\t\t*(int8_t*)(ai->b + offset + 1) = (int8_t)memory_operand.disp;\n\t\t\t\t\t\toffset++;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tmodrm.fields.mod = 2;\n\t\t\t\t\t\t*(int32_t*)(ai->b + offset + 1) = (int32_t)memory_operand.disp;\n\t\t\t\t\t\toffset += 4;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tai->b[next_offset] = modrm.modrm;\n\t\t\t\toffset++;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tmodrm.fields.rm = 0b101;\n\t\t\t\tai->b[offset++] = modrm.modrm;\n\t\t\t\t*(int32_t*)(ai->b + offset) = (int32_t)memory_operand.disp;\n\t\t\t\toffset += 4;\n\t\t\t}\n\n\t\t\treturn offset;\n\t\t}\n\n\t\tsize_t num_prefixes, index;\n\t\tsize = _nmd_append_prefix_by_reg_size(ai->b, ai->s + 4, &num_prefixes, &index);\n\t\tif (size > 0)\n\t\t{\n\t\t\tif (ai->mode == NMD_X86_MODE_64)\n\t\t\t{\n\t\t\t\tai->b[num_prefixes + 0] = size == 1 ? 0xfe : 0xff;\n\t\t\t\tai->b[num_prefixes + 1] = 0xc0 + (ai->s[0] == 'i' ? 0 : 8) + (uint8_t)index;\n\t\t\t\treturn num_prefixes + 2;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (size == 1)\n\t\t\t\t{\n\t\t\t\t\tai->b[0] = 0xfe;\n\t\t\t\t\tai->b[1] = 0xc0 + (ai->s[0] == 'i' ? 0 : 8) + (uint8_t)index;\n\t\t\t\t\treturn 2;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tai->b[num_prefixes + 0] = (ai->s[0] == 'i' ? 0x40 : 0x48) + (uint8_t)index;\n\t\t\t\t\treturn num_prefixes + 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if (_nmd_strstr(ai->s, \"call \") == ai->s)\n\t{\n\t\tif ((num_digits = _nmd_parse_number(ai->s + 5, &num)))\n\t\t{\n\t\t\tai->b[0] = 0xe8;\n\t\t\tif(ai->runtime_address == NMD_X86_INVALID_RUNTIME_ADDRESS)\n\t\t\t\t*(int32_t*)(ai->b + 1) = (int32_t)(num - 5);\n\t\t\telse\n\t\t\t\t*(int32_t*)(ai->b + 1) = (int32_t)(num - (ai->runtime_address + 5));\n\t\t\treturn 5;\n\t\t}\n\t}\n\telse if (_nmd_strstr(ai->s, \"push \") == ai->s || _nmd_strstr(ai->s, \"pop \") == ai->s)\n\t{\n\t\tconst bool is_push = ai->s[1] == 'u';\n\t\tai->s += is_push ? 5 : 4;\n\t\tNMD_X86_REG reg;\n\t\tif ((reg = _nmd_parse_reg16((const char**)&ai->s)))\n\t\t{\n\t\t\tif (ai->mode == NMD_X86_MODE_16)\n\t\t\t{\n\t\t\t\tai->b[0] = (is_push ? 0x50 : 0x58) + reg % 8;\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tai->b[0] = 0x66;\n\t\t\t\tai->b[1] = (is_push ? 0x50 : 0x58) + reg % 8;\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t}\n\t\telse if (is_push && (num_digits = _nmd_parse_number(ai->s, &num)) && ai->s[num_digits] == '\\0')\n\t\t{\n\t\t\tif (num >= -(1 << 7) && num <= (1 << 7) - 1)\n\t\t\t{\n\t\t\t\tai->b[0] = 0x6a;\n\t\t\t\t*(int8_t*)(ai->b + 1) = (int8_t)num;\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tsize_t offset = 0;\n\t\t\t\tif (ai->mode == NMD_X86_MODE_16)\n\t\t\t\t\tai->b[offset++] = 0x66;\n\t\t\t\tai->b[offset++] = 0x68;\n\t\t\t\t*(int32_t*)(ai->b + offset) = (int32_t)num;\n\t\t\t\treturn offset + 4;\n\t\t\t}\n\t\t}\n\t}\n\telse if (_nmd_strstr(ai->s, \"mov \") == ai->s)\n\t{\n\t\tai->s += 4;\n\t\tconst NMD_X86_REG reg = _nmd_parse_reg8((const char**)&ai->s);\n\t\tif (reg)\n\t\t{\n\t\t\tai->b[0] = 0xb0 + (reg - NMD_X86_REG_AL);\n\t\t\t\n\t\t\tif (*ai->s++ != ',')\n\t\t\t\treturn 0;\n            \n\t\t\tif ((num_digits = _nmd_parse_number(ai->s, &num)))\n\t\t\t{\n\t\t\t\tai->b[1] = (uint8_t)num;\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t}\n\t}\n\telse if (_nmd_strstr(ai->s, \"ret \") == ai->s || _nmd_strstr(ai->s, \"retf \") == ai->s)\n\t{\n\t\tconst bool is_far = ai->s[3] == 'f';\n\t\tai->s += is_far ? 5 : 4;\n        \n\t\tif ((num_digits = _nmd_parse_number(ai->s, &num)) && ai->s[num_digits] == '\\0')\n\t\t{\n\t\t\tai->b[0] = is_far ? 0xca : 0xc2;\n\t\t\t*(uint16_t*)(ai->b + 1) = (uint16_t)num;\n\t\t\treturn 3;\n\t\t}\n\t}\n\telse if (_nmd_strstr(ai->s, \"emit \") == ai->s)\n\t{\n\t\tsize_t offset = 5;\n\t\twhile ((num_digits = _nmd_parse_number(ai->s + offset, &num)))\n\t\t{\n\t\t\tif (num < 0 || num > 0xff)\n\t\t\t\treturn 0;\n\n\t\t\tai->b[i++] = (uint8_t)num;\n\n\t\t\toffset += num_digits;\n\t\t\tif (ai->s[offset] == ' ')\n\t\t\t\toffset++;\n\t\t}\n\t\treturn i;\n\t}\n\telse if (_nmd_strcmp(ai->s, \"pushf\"))\n\t{\n\t\tif (ai->mode == NMD_X86_MODE_16)\n\t\t{\n\t\t\tai->b[0] = 0x9c;\n\t\t\treturn 1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tai->b[0] = 0x66;\n\t\t\tai->b[1] = 0x9c;\n\t\t\treturn 2;\n\t\t}\n\t}\n\telse if (_nmd_strcmp(ai->s, \"popf\"))\n\t{\n\t\tif (ai->mode == NMD_X86_MODE_16)\n\t\t{\n\t\t\tai->b[0] = 0x9d;\n\t\t\treturn 1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tai->b[0] = 0x66;\n\t\t\tai->b[1] = 0x9d;\n\t\t\treturn 2;\n\t\t}\n\t}\n\telse if (_nmd_strcmp(ai->s, \"pause\"))\n\t{\n\t\tai->b[0] = 0xf3;\n\t\tai->b[1] = 0x90;\n\t\treturn 2;\n\t}\n\telse if (_nmd_strcmp(ai->s, \"iret\"))\n\t{\n\t\tif (ai->mode == NMD_X86_MODE_16)\n\t\t{\n\t\t\tai->b[0] = 0xcf;\n\t\t\treturn 1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tai->b[0] = 0x66;\n\t\t\tai->b[1] = 0xcf;\n\t\t\treturn 2;\n\t\t}\n\t}\n\telse if (_nmd_strcmp(ai->s, \"iretd\"))\n\t{\n\t\tif (ai->mode == NMD_X86_MODE_16)\n\t\t{\n\t\t\tai->b[0] = 0x66;\n\t\t\tai->b[1] = 0xcf;\n\t\t\treturn 2;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tai->b[0] = 0xcf;\n\t\t\treturn 1;\n\t\t}\n\t}\n\telse if (_nmd_strcmp(ai->s, \"pushf\"))\n\t{\n\t\tai->b[0] = 0x66;\n\t\tai->b[1] = 0x9c;\n\t\treturn 2;\n\t}\n\telse if (_nmd_strcmp(ai->s, \"popf\"))\n\t{\n\t\tai->b[0] = 0x66;\n\t\tai->b[1] = 0x9d;\n\t\treturn 2;\n\t}\n\telse if (_nmd_strcmp(ai->s, \"cwde\"))\n\t{\n\t\tint offset = 0;\n\t\tif (ai->mode == NMD_X86_MODE_16)\n\t\t\tai->b[offset++] = 0x66;\n\t\tai->b[offset++] = 0x98;\n\t\treturn offset;\n\t}\n\telse if (_nmd_strstr(ai->s, \"int \") == ai->s)\n\t{\n\t\tai->s += 4;\n\t\tif ((num_digits = _nmd_parse_number(ai->s, &num)) && ai->s[num_digits] == '\\0')\n\t\t{\n\t\t\tai->b[0] = 0xcd;\n\t\t\tai->b[1] = (uint8_t)num;\n\t\t\treturn 2;\n\t\t}\n\t}\n\telse if (_nmd_strcmp(ai->s, \"cbw\"))\n\t{\n\t\tint offset = 0;\n\t\tif (ai->mode != NMD_X86_MODE_16)\n\t\t\tai->b[offset++] = 0x66;\n\t\tai->b[offset++] = 0x98;\n\t\treturn offset;\n\t}\n\telse if (_nmd_strcmp(ai->s, \"cdq\"))\n\t{\n\t\tint offset = 0;\n\t\tif (ai->mode == NMD_X86_MODE_16)\n\t\t\tai->b[offset++] = 0x66;\n\t\tai->b[offset++] = 0x99;\n\t\treturn offset;\n\t}\n\telse if (_nmd_strcmp(ai->s, \"cwd\"))\n\t{\n\t\tint offset = 0;\n\t\tif (ai->mode != NMD_X86_MODE_16)\n\t\t\tai->b[offset++] = 0x66;\n\t\tai->b[offset++] = 0x99;\n\t\treturn offset;\n\t}\n\n\treturn 0;\n}\n\n/*\nAssembles one or more instructions from a string. Returns the number of bytes written to the buffer on success, zero otherwise. Instructions can be separated using the '\\n'(new line) character.\nParameters:\n - string          [in]         A pointer to a string that represents one or more instructions in assembly language.\n - buffer          [out]        A pointer to a buffer that receives the encoded instructions.\n - buffer_size     [in]         The size of the buffer in bytes.\n - runtime_address [in]         The instruction's runtime address. You may use 'NMD_X86_INVALID_RUNTIME_ADDRESS'.\n - mode            [in]         The architecture mode. 'NMD_X86_MODE_32', 'NMD_X86_MODE_64' or 'NMD_X86_MODE_16'.\n - count           [in/out/opt] A pointer to a variable that on input is the maximum number of instructions that can be parsed, and on output the number of instructions parsed. This parameter may be null.\n*/\nNMD_ASSEMBLY_API size_t nmd_x86_assemble(const char* string, void* buffer, size_t buffer_size, uint64_t runtime_address, NMD_X86_MODE mode, size_t* count)\n{\n\tif (!*string)\n\t\treturn 0;\n\n\tconst uint8_t* const buffer_end = (uint8_t*)buffer + buffer_size;\n\tconst size_t num_max_instructions = count ? *count : (size_t)(-1);\n\tsize_t num_instructions = 0;\n\tchar parsed_string[256];\n\tuint8_t temp_buffer[15]; /* The assembling takes place on this buffer instead of the user's buffer because the assembler doesn't check the buffer size. If it assembled directly to the user's buffer it could access bad memory */\n\tuint8_t* b = (uint8_t*)buffer;\n\tsize_t remaining_size;\n\tsize_t length = 0;\n\n\t_nmd_assemble_info ai;\n\tai.s = parsed_string;\n\tai.mode = mode;\n\tai.runtime_address = runtime_address;\n\tai.b = temp_buffer;\n\t\n\t/* Parse the first character of the string because the loop just ahead accesses `string-1` which could be bad memory if we didn't do this */\n\tif (*string == ' ')\n\t\tstring++;\n\telse\n\t{\n\t\tparsed_string[0] = *string++;\n\t\tlength++;\n\t}\n\n\twhile (*string && num_instructions < num_max_instructions)\n\t{\n\t\tremaining_size = buffer_end - b;\n\t\t\t\t\n\t\t/* Copy 'string' to 'parsed_string' converting it to lowercase and removing unwanted spaces. If the instruction separator character '\\n' is found, stop. */\n\t\tchar c = *string; /* Current character */\n\t\tchar prev_c = *(string - 1); /* Previous character */\n\t\twhile (c && c != '\\n')\n\t\t{\n\t\t\t/* Ignore(skip) the current character if it's a space and the previous character is one of the following: ' ', '+', '*', '[' */\n\t\t\tif (c == ' ' && (prev_c == ' ' || prev_c == '+' || prev_c == '*' || prev_c == '['))\n\t\t\t{\n\t\t\t\tc = *++string;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t/* Append character */\n\t\t\tparsed_string[length++] = _NMD_TOLOWER(c);\n\n\t\t\t/* The maximum length is 255 */\n\t\t\tif (length >= 256)\n\t\t\t\treturn 0;\n\n\t\t\t/* Set previous character */\n\t\t\tprev_c = c;\n\n\t\t\t/* Get the next character */\n\t\t\tc = *++string;\n\t\t}\n\n\t\t/* This check is only ever true if *string == '\\n', that is the instruction separator character */\n\t\tif (*string /* == '\\n' */)\n\t\t\tstring++; /* Go forward by one character so 'string' points to the next instruction */\n\n\t\t/* If the last character is a space, remove it. */\n\t\tif (length > 0 && parsed_string[length - 1] == ' ')\n\t\t\tlength--;\n\n\t\t/* After all of the string manipulation, place the null character */\n\t\tparsed_string[length] = '\\0';\n\n\t\t/* Try to assemble the instruction */\n\t\tconst size_t num_bytes = _nmd_assemble_single(&ai);\n\t\tif (num_bytes == 0 || num_bytes > remaining_size)\n\t\t\treturn 0;\n\n\t\t/* Copy bytes from 'temp_buffer' to 'buffer' */\n\t\tsize_t i = 0;\n\t\tfor (; i < num_bytes; i++)\n\t\t\tb[i] = temp_buffer[i];\n\t\tb += num_bytes;\n\n\t\tnum_instructions++;\n\n\t\t/* Reset length in case there's another instruction */\n\t\tlength = 0;\n\t}\n\n\tif (count)\n\t\t*count = num_instructions;\n\n\t/* Return the number of bytes written to the buffer */\n\treturn (size_t)((ptrdiff_t)b - (ptrdiff_t)buffer);\n}\n\n\nNMD_ASSEMBLY_API void _nmd_decode_operand_segment_reg(const nmd_x86_instruction* instruction, nmd_x86_operand* operand)\n{\n\tif (instruction->segment_override)\n\t\toperand->fields.reg = (uint8_t)(NMD_X86_REG_ES + _nmd_get_bit_index(instruction->segment_override));\n\telse\n\t\toperand->fields.reg = (uint8_t)(!(instruction->prefixes & NMD_X86_PREFIXES_REX_B) && (instruction->modrm.fields.rm == 0b100 || instruction->modrm.fields.rm == 0b101) ? NMD_X86_REG_SS : NMD_X86_REG_DS);\n}\n\n/* Decodes a memory operand. modrm is assumed to be in the range [00,BF] */\nNMD_ASSEMBLY_API void _nmd_decode_modrm_upper32(const nmd_x86_instruction* instruction, nmd_x86_operand* operand)\n{\n    /* Set operand type */\n\toperand->type = NMD_X86_OPERAND_TYPE_MEMORY;\n\n\tif (instruction->has_sib) /* R/M is 0b100 */\n\t{\n\t\tif (instruction->sib.fields.base == 0b101) /* Check if there is displacement */\n\t\t{\n\t\t\tif (instruction->modrm.fields.mod != 0b00)\n\t\t\t\toperand->fields.mem.base = (uint8_t)(instruction->mode == NMD_X86_MODE_64 && !(instruction->prefixes & NMD_X86_PREFIXES_ADDRESS_SIZE_OVERRIDE) ? (instruction->prefixes & NMD_X86_PREFIXES_REX_B ? NMD_X86_REG_R13 : NMD_X86_REG_RBP) : NMD_X86_REG_EBP);\n\t\t}\n\t\telse\n\t\t\toperand->fields.mem.base = (uint8_t)((instruction->mode == NMD_X86_MODE_64 && !(instruction->prefixes & NMD_X86_PREFIXES_ADDRESS_SIZE_OVERRIDE) ? (instruction->prefixes & NMD_X86_PREFIXES_REX_B ? NMD_X86_REG_R8 : NMD_X86_REG_RAX) : NMD_X86_REG_EAX) + instruction->sib.fields.base);\n\n\t\tif (instruction->sib.fields.index != 0b100)\n\t\t\toperand->fields.mem.index = (uint8_t)((instruction->mode == NMD_X86_MODE_64 && !(instruction->prefixes & NMD_X86_PREFIXES_ADDRESS_SIZE_OVERRIDE) ? (instruction->prefixes & NMD_X86_PREFIXES_REX_X ? NMD_X86_REG_R8 : NMD_X86_REG_RAX) : NMD_X86_REG_EAX) + instruction->sib.fields.index);\n\n\t\tif (instruction->prefixes & NMD_X86_PREFIXES_REX_X && instruction->sib.fields.index == 0b100)\n\t\t{\n\t\t\toperand->fields.mem.index = (uint8_t)NMD_X86_REG_R12;\n\t\t}\n        \n\t\toperand->fields.mem.scale = instruction->sib.fields.scale;\n\t}\n\telse if (!(instruction->modrm.fields.mod == 0b00 && instruction->modrm.fields.rm == 0b101))\n\t{\n\t\tif (instruction->mode == NMD_X86_MODE_16 && !(instruction->prefixes & NMD_X86_PREFIXES_ADDRESS_SIZE_OVERRIDE))\n\t\t{\n\t\t\toperand->fields.mem.base = NMD_X86_REG_BX;\n\t\t\toperand->fields.mem.index = NMD_X86_REG_SI;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif ((instruction->prefixes & (NMD_X86_PREFIXES_ADDRESS_SIZE_OVERRIDE | NMD_X86_PREFIXES_REX_B)) == (NMD_X86_PREFIXES_ADDRESS_SIZE_OVERRIDE | NMD_X86_PREFIXES_REX_B) && instruction->mode == NMD_X86_MODE_64)\n\t\t\t\toperand->fields.mem.base = (uint8_t)(NMD_X86_REG_R8D + instruction->modrm.fields.rm);\n\t\t\telse\n\t\t\t\toperand->fields.mem.base = (uint8_t)((instruction->mode == NMD_X86_MODE_64 && !(instruction->prefixes & NMD_X86_PREFIXES_ADDRESS_SIZE_OVERRIDE) ? (instruction->prefixes & NMD_X86_PREFIXES_REX_B ? NMD_X86_REG_R8 : NMD_X86_REG_RAX) : NMD_X86_REG_EAX) + instruction->modrm.fields.rm);\n\t\t}\n\t}\n\n\t_nmd_decode_operand_segment_reg(instruction, operand);\n\n\toperand->fields.mem.disp = instruction->displacement;\n}\n\nNMD_ASSEMBLY_API void _nmd_decode_memory_operand(const nmd_x86_instruction* instruction, nmd_x86_operand* operand, uint8_t mod11base_reg)\n{\n\tif (instruction->modrm.fields.mod == 0b11)\n\t{\n\t\toperand->type = NMD_X86_OPERAND_TYPE_REGISTER;\n\t\toperand->fields.reg = mod11base_reg + instruction->modrm.fields.rm;\n\t}\n\telse\n\t\t_nmd_decode_modrm_upper32(instruction, operand);\n}\n\nNMD_ASSEMBLY_API void _nmd_decode_operand_Eb(const nmd_x86_instruction* instruction, nmd_x86_operand* operand)\n{\n\t_nmd_decode_memory_operand(instruction, operand, NMD_X86_REG_AL);\n}\n\nNMD_ASSEMBLY_API void _nmd_decode_operand_Ew(const nmd_x86_instruction* instruction, nmd_x86_operand* operand)\n{\n\t_nmd_decode_memory_operand(instruction, operand, NMD_X86_REG_AX);\n}\n\nNMD_ASSEMBLY_API void _nmd_decode_operand_Ev(const nmd_x86_instruction* instruction, nmd_x86_operand* operand)\n{\n\t_nmd_decode_memory_operand(instruction, operand, (uint8_t)(instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_REG_AX : NMD_X86_REG_EAX));\n}\n\nNMD_ASSEMBLY_API void _nmd_decode_operand_Ey(const nmd_x86_instruction* instruction, nmd_x86_operand* operand)\n{\n\t_nmd_decode_memory_operand(instruction, operand, (uint8_t)(instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_REG_AX : NMD_X86_REG_EAX));\n}\n\nNMD_ASSEMBLY_API void _nmd_decode_operand_Qq(const nmd_x86_instruction* instruction, nmd_x86_operand* operand)\n{\n\t_nmd_decode_memory_operand(instruction, operand, NMD_X86_REG_MM0);\n}\n\nNMD_ASSEMBLY_API void _nmd_decode_operand_Wdq(const nmd_x86_instruction* instruction, nmd_x86_operand* operand)\n{\n\t_nmd_decode_memory_operand(instruction, operand, NMD_X86_REG_XMM0);\n}\n\nNMD_ASSEMBLY_API void _nmd_decode_operand_Gb(const nmd_x86_instruction* instruction, nmd_x86_operand* operand)\n{\n\toperand->type = NMD_X86_OPERAND_TYPE_REGISTER;\n\toperand->fields.reg = NMD_X86_REG_AL + instruction->modrm.fields.reg;\n}\n\nNMD_ASSEMBLY_API void _nmd_decode_operand_Gd(const nmd_x86_instruction* instruction, nmd_x86_operand* operand)\n{\n\toperand->type = NMD_X86_OPERAND_TYPE_REGISTER;\n\toperand->fields.reg = NMD_X86_REG_EAX + instruction->modrm.fields.reg;\n}\n\nNMD_ASSEMBLY_API void _nmd_decode_operand_Gw(const nmd_x86_instruction* instruction, nmd_x86_operand* operand)\n{\n\toperand->type = NMD_X86_OPERAND_TYPE_REGISTER;\n\toperand->fields.reg = NMD_X86_REG_AX + instruction->modrm.fields.reg;\n}\n\nNMD_ASSEMBLY_API void _nmd_decode_operand_Gv(const nmd_x86_instruction* instruction, nmd_x86_operand* operand)\n{\n\toperand->type = NMD_X86_OPERAND_TYPE_REGISTER;\n\tif (instruction->prefixes & NMD_X86_PREFIXES_REX_B)\n\t\toperand->fields.reg = (uint8_t)((!(instruction->prefixes & NMD_X86_PREFIXES_REX_W) ? NMD_X86_REG_R8D : NMD_X86_REG_R8) + instruction->modrm.fields.reg);\n\telse\n\t\toperand->fields.reg = (uint8_t)((instruction->rex_w_prefix ? NMD_X86_REG_RAX : (instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE && instruction->mode != NMD_X86_MODE_16 ? NMD_X86_REG_AX : NMD_X86_REG_EAX)) + instruction->modrm.fields.reg);\n}\n\nNMD_ASSEMBLY_API void _nmd_decode_operand_Rv(const nmd_x86_instruction* instruction, nmd_x86_operand* operand)\n{\n\toperand->type = NMD_X86_OPERAND_TYPE_REGISTER;\n\tif (instruction->prefixes & NMD_X86_PREFIXES_REX_R)\n\t\toperand->fields.reg = (uint8_t)((!(instruction->prefixes & NMD_X86_PREFIXES_REX_W) ? NMD_X86_REG_R8D : NMD_X86_REG_R8) + instruction->modrm.fields.rm);\n\telse\n\t\toperand->fields.reg = (uint8_t)((instruction->rex_w_prefix ? NMD_X86_REG_RAX : ((instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE && instruction->mode != NMD_X86_MODE_16) || (instruction->mode == NMD_X86_MODE_16 && !(instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)) ? NMD_X86_REG_AX : NMD_X86_REG_EAX)) + instruction->modrm.fields.rm);\n}\n\nNMD_ASSEMBLY_API void _nmd_decode_operand_Gy(const nmd_x86_instruction* instruction, nmd_x86_operand* operand)\n{\n\toperand->type = NMD_X86_OPERAND_TYPE_REGISTER;\n\toperand->fields.reg = (uint8_t)((instruction->mode == NMD_X86_MODE_64 ? NMD_X86_REG_RAX : NMD_X86_REG_EAX) + instruction->modrm.fields.reg);\n}\n\nNMD_ASSEMBLY_API void _nmd_decode_operand_Pq(const nmd_x86_instruction* instruction, nmd_x86_operand* operand)\n{\n\toperand->type = NMD_X86_OPERAND_TYPE_REGISTER;\n\toperand->fields.reg = NMD_X86_REG_MM0 + instruction->modrm.fields.reg;\n}\n\nNMD_ASSEMBLY_API void _nmd_decode_operand_Nq(const nmd_x86_instruction* instruction, nmd_x86_operand* operand)\n{\n\toperand->type = NMD_X86_OPERAND_TYPE_REGISTER;\n\toperand->fields.reg = NMD_X86_REG_MM0 + instruction->modrm.fields.rm;\n}\n\nNMD_ASSEMBLY_API void _nmd_decode_operand_Vdq(const nmd_x86_instruction* instruction, nmd_x86_operand* operand)\n{\n\toperand->type = NMD_X86_OPERAND_TYPE_REGISTER;\n\toperand->fields.reg = NMD_X86_REG_XMM0 + instruction->modrm.fields.reg;\n}\n\nNMD_ASSEMBLY_API void _nmd_decode_operand_Udq(const nmd_x86_instruction* instruction, nmd_x86_operand* operand)\n{\n\toperand->type = NMD_X86_OPERAND_TYPE_REGISTER;\n\toperand->fields.reg = NMD_X86_REG_XMM0 + instruction->modrm.fields.rm;\n}\n\nNMD_ASSEMBLY_API void _nmd_decode_conditional_flag(nmd_x86_instruction* instruction, const uint8_t condition)\n{\n\tswitch (condition)\n\t{\n\t\tcase 0x0: instruction->tested_flags.fields.OF = 1; break;                                                                             /* Jump if overflow (OF=1) */\n\t\tcase 0x1: instruction->tested_flags.fields.OF = 1; break;                                                                             /* Jump if not overflow (OF=0) */\n\t\tcase 0x2: instruction->tested_flags.fields.CF = 1; break;                                                                             /* Jump if not above or equal (CF=1) */\n\t\tcase 0x3: instruction->tested_flags.fields.CF = 1; break;                                                                             /* Jump if not below (CF=0) */\n\t\tcase 0x4: instruction->tested_flags.fields.ZF = 1; break;                                                                             /* Jump if equal (ZF=1) */\n\t\tcase 0x5: instruction->tested_flags.fields.ZF = 1; break;                                                                             /* Jump if not equal (ZF=0) */\n\t\tcase 0x6: instruction->tested_flags.fields.CF = instruction->tested_flags.fields.ZF = 1; break;                                       /* Jump if not above (CF=1 or ZF=1) */\n\t\tcase 0x7: instruction->tested_flags.fields.CF = instruction->tested_flags.fields.ZF = 1; break;                                       /* Jump if not below or equal (CF=0 and ZF=0) */\n\t\tcase 0x8: instruction->tested_flags.fields.SF = 1; break;                                                                             /* Jump if sign (SF=1) */\n\t\tcase 0x9: instruction->tested_flags.fields.SF = 1; break;                                                                             /* Jump if not sign (SF=0) */\n\t\tcase 0xa: instruction->tested_flags.fields.PF = 1; break;                                                                             /* Jump if parity/parity even (PF=1) */\n\t\tcase 0xb: instruction->tested_flags.fields.PF = 1; break;                                                                             /* Jump if parity odd (PF=0) */\n\t\tcase 0xc: instruction->tested_flags.fields.SF = instruction->tested_flags.fields.OF = 1; break;                                       /* Jump if not greater or equal (SF != OF) */\n\t\tcase 0xd: instruction->tested_flags.fields.SF = instruction->tested_flags.fields.OF = 1; break;                                       /* Jump if not less (SF=OF) */\n\t\tcase 0xe: instruction->tested_flags.fields.ZF = instruction->tested_flags.fields.SF = instruction->tested_flags.fields.OF = 1; break; /* Jump if not greater (ZF=1 or SF != OF) */\n\t\tcase 0xf: instruction->tested_flags.fields.ZF = instruction->tested_flags.fields.SF = instruction->tested_flags.fields.OF = 1; break; /* Jump if not less or equal (ZF=0 and SF=OF) */\n\t}\n}\n\nNMD_ASSEMBLY_API bool _nmd_decode_modrm(const uint8_t** p_buffer, size_t* p_buffer_size, nmd_x86_instruction* const instruction)\n{\n\tinstruction->has_modrm = true;\n\t_NMD_READ_BYTE(*p_buffer, *p_buffer_size, instruction->modrm.modrm);\n\t\n\tconst bool address_prefix = (bool)(instruction->prefixes & NMD_X86_PREFIXES_ADDRESS_SIZE_OVERRIDE);\n\n\t/* Check for 16-Bit Addressing Form */\n\tif (instruction->mode == NMD_X86_MODE_16)\n\t{\n\t\tif (instruction->modrm.fields.mod != 0b11)\n\t\t{\n\t\t\tif (instruction->modrm.fields.mod == 0b00)\n\t\t\t{\n\t\t\t\tif (instruction->modrm.fields.rm == 0b110)\n\t\t\t\t\tinstruction->disp_mask = NMD_X86_DISP16;\n\t\t\t}\n\t\t\telse\n\t\t\t\tinstruction->disp_mask = (uint8_t)(instruction->modrm.fields.mod == 0b01 ? NMD_X86_DISP8 : NMD_X86_DISP16);\n\t\t}\n\t}\n\telse\n\t{\n\t\t/* Check for 16-Bit Addressing Form */\n\t\tif (address_prefix && instruction->mode == NMD_X86_MODE_32)\n\t\t{\n\t\t\t/* Check for displacement */\n\t\t\tif ((instruction->modrm.fields.mod == 0b00 && instruction->modrm.fields.rm == 0b110) || instruction->modrm.fields.mod == 0b10)\n\t\t\t\tinstruction->disp_mask = NMD_X86_DISP16;\n\t\t\telse if (instruction->modrm.fields.mod == 0b01)\n\t\t\t\tinstruction->disp_mask = NMD_X86_DISP8;\n\t\t}\n\t\telse /*if (!address_prefix || (address_prefix && **b >= 0x40) || (address_prefix && instruction->mode == NMD_X86_MODE_64)) */\n\t\t{\n\t\t\t/* Check for SIB byte */\n\t\t\tif (instruction->modrm.modrm < 0xC0 && instruction->modrm.fields.rm == 0b100 && (!address_prefix || (address_prefix && instruction->mode == NMD_X86_MODE_64)))\n\t\t\t{\n\t\t\t\tinstruction->has_sib = true;\n\t\t\t\t_NMD_READ_BYTE(*p_buffer, *p_buffer_size, instruction->sib.sib);\n\t\t\t}\n\n\t\t\t/* Check for displacement */\n\t\t\tif (instruction->modrm.fields.mod == 0b01) /* disp8 (ModR/M) */\n\t\t\t\tinstruction->disp_mask = NMD_X86_DISP8;\n\t\t\telse if ((instruction->modrm.fields.mod == 0b00 && instruction->modrm.fields.rm == 0b101) || instruction->modrm.fields.mod == 0b10) /* disp16,32 (ModR/M) */\n\t\t\t\tinstruction->disp_mask = (uint8_t)(address_prefix && !(instruction->mode == NMD_X86_MODE_64 && instruction->prefixes & NMD_X86_PREFIXES_ADDRESS_SIZE_OVERRIDE) ? NMD_X86_DISP16 : NMD_X86_DISP32);\n\t\t\telse if (instruction->has_sib && instruction->sib.fields.base == 0b101) /* disp8,32 (SIB) */\n\t\t\t\tinstruction->disp_mask = (uint8_t)(instruction->modrm.fields.mod == 0b01 ? NMD_X86_DISP8 : NMD_X86_DISP32);\n\t\t}\n\t}\n\n\t/* Make sure we can read 'instruction->disp_mask' bytes from the buffer */\n\tif (*p_buffer_size < instruction->disp_mask)\n\t\treturn false;\n\t\n\t/* Copy 'instruction->disp_mask' bytes from the buffer */\n\tsize_t i = 0;\n\tfor (; i < (size_t)instruction->disp_mask; i++)\n\t\t((uint8_t*)(&instruction->displacement))[i] = (*p_buffer)[i];\n\t\n\t/* Increment the buffer and decrement the buffer's size */\n\t*p_buffer += instruction->disp_mask;\n\t*p_buffer_size -= instruction->disp_mask;\n\n\treturn true;\n}\n\n/*\nDecodes an instruction. Returns true if the instruction is valid, false otherwise.\nParameters:\n - buffer      [in]  A pointer to a buffer containing an encoded instruction.\n - buffer_size [in]  The size of the buffer in bytes.\n - instruction [out] A pointer to a variable of type 'nmd_x86_instruction' that receives information about the instruction.\n - mode        [in]  The architecture mode. 'NMD_X86_MODE_32', 'NMD_X86_MODE_64' or 'NMD_X86_MODE_16'.\n - flags       [in]  A mask of 'NMD_X86_DECODER_FLAGS_XXX' that specifies which features the decoder is allowed to use. If uncertain, use 'NMD_X86_DECODER_FLAGS_MINIMAL'.\n*/\nNMD_ASSEMBLY_API bool nmd_x86_decode(const void* const buffer, size_t buffer_size, nmd_x86_instruction* instruction, NMD_X86_MODE mode, uint32_t flags)\n{\n\t/* Security considerations for memory safety:\n\tThe contents of 'buffer' should be considered untrusted and decoded carefully.\n\t\n\t'buffer' should always point to the start of the buffer. We use the 'b'\n\tbuffer iterator to read data from the buffer, however before accessing it\n\tmake sure to check 'buffer_size' to see if we can safely access it. Then,\n\tafter reading data from the buffer we increment 'b' and decrement 'buffer_size'.\n\tHelper macros: _NMD_READ_BYTE()\n\t*/\n\t\n\t/* Clear 'instruction' */\n\tsize_t i = 0;\n\tfor (; i < sizeof(nmd_x86_instruction); i++)\n\t\t((uint8_t*)(instruction))[i] = 0x00;\n\n\t/* Set mode */\n\tinstruction->mode = (uint8_t)mode;\n\n\t/* Set buffer iterator */\n\tconst uint8_t* b = (const uint8_t*)buffer;\n\t\n\t/*  Clamp 'buffer_size' to 15. We will only read up to 15 bytes(NMD_X86_MAXIMUM_INSTRUCTION_LENGTH) */\n\tif (buffer_size > 15)\n\t\tbuffer_size = 15;\n\t\n\t/* Decode legacy and REX prefixes */\n\tfor (; buffer_size > 0; b++, buffer_size--)\n\t{\n\t\tswitch (*b)\n\t\t{\n\t\tcase 0xF0: instruction->prefixes = (instruction->prefixes | (instruction->simd_prefix = NMD_X86_PREFIXES_LOCK)); continue;\n\t\tcase 0xF2: instruction->prefixes = (instruction->prefixes | (instruction->simd_prefix = NMD_X86_PREFIXES_REPEAT_NOT_ZERO)), instruction->repeat_prefix = false; continue;\n\t\tcase 0xF3: instruction->prefixes = (instruction->prefixes | (instruction->simd_prefix = NMD_X86_PREFIXES_REPEAT)), instruction->repeat_prefix = true; continue;\n\t\tcase 0x2E: instruction->prefixes = (instruction->prefixes | (instruction->segment_override = NMD_X86_PREFIXES_CS_SEGMENT_OVERRIDE)); continue;\n\t\tcase 0x36: instruction->prefixes = (instruction->prefixes | (instruction->segment_override = NMD_X86_PREFIXES_SS_SEGMENT_OVERRIDE)); continue;\n\t\tcase 0x3E: instruction->prefixes = (instruction->prefixes | (instruction->segment_override = NMD_X86_PREFIXES_DS_SEGMENT_OVERRIDE)); continue;\n\t\tcase 0x26: instruction->prefixes = (instruction->prefixes | (instruction->segment_override = NMD_X86_PREFIXES_ES_SEGMENT_OVERRIDE)); continue;\n\t\tcase 0x64: instruction->prefixes = (instruction->prefixes | (instruction->segment_override = NMD_X86_PREFIXES_FS_SEGMENT_OVERRIDE)); continue;\n\t\tcase 0x65: instruction->prefixes = (instruction->prefixes | (instruction->segment_override = NMD_X86_PREFIXES_GS_SEGMENT_OVERRIDE)); continue;\n\t\tcase 0x66: instruction->prefixes = (instruction->prefixes | (instruction->simd_prefix = NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)), instruction->rex_w_prefix = false; continue;\n\t\tcase 0x67: instruction->prefixes = (instruction->prefixes | NMD_X86_PREFIXES_ADDRESS_SIZE_OVERRIDE); continue;\n\t\tdefault:\n\t\t\tif (mode == NMD_X86_MODE_64 && _NMD_R(*b) == 4) /* REX prefixes [0x40,0x4f] */\n\t\t\t{\n\t\t\t\tinstruction->has_rex = true;\n\t\t\t\tinstruction->rex = *b;\n\t\t\t\tinstruction->prefixes = (instruction->prefixes & ~(NMD_X86_PREFIXES_REX_B | NMD_X86_PREFIXES_REX_X | NMD_X86_PREFIXES_REX_R | NMD_X86_PREFIXES_REX_W));\n\n\t\t\t\tif (*b & 0b0001) /* Bit position 0 */\n\t\t\t\t\tinstruction->prefixes = instruction->prefixes | NMD_X86_PREFIXES_REX_B;\n\t\t\t\tif (*b & 0b0010) /* Bit position 1 */\n\t\t\t\t\tinstruction->prefixes = instruction->prefixes | NMD_X86_PREFIXES_REX_X;\n\t\t\t\tif (*b & 0b0100) /* Bit position 2 */\n\t\t\t\t\tinstruction->prefixes = instruction->prefixes | NMD_X86_PREFIXES_REX_R;\n\t\t\t\tif (*b & 0b1000) /* Bit position 3 */\n\t\t\t\t{\n\t\t\t\t\tinstruction->prefixes = instruction->prefixes | NMD_X86_PREFIXES_REX_W;\n\t\t\t\t\tinstruction->rex_w_prefix = true;\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tbreak;\n\t}\n\n\t/* Calculate the number of prefixes based on how much the iterator moved */\n\tinstruction->num_prefixes = (uint8_t)((ptrdiff_t)(b)-(ptrdiff_t)(buffer));\n\n\t/* Assume the instruction uses legacy encoding. It is most likely the case */\n\tinstruction->encoding = NMD_X86_ENCODING_LEGACY;\n\n\t/* Opcode byte. This variable is used because 'op' is simpler than 'instruction->opcode' */\n\tuint8_t op;\n\t_NMD_READ_BYTE(b, buffer_size, op);\n\n\tif (op == 0x0F) /* 2 or 3 byte opcode */\n\t{\n\t\t_NMD_READ_BYTE(b, buffer_size, op);\n\n\t\tif (op == 0x38 || op == 0x3A) /* 3 byte opcode */\n\t\t{\n\t\t\tinstruction->opcode_size = 3;\n\t\t\tinstruction->opcode_map = (uint8_t)(op == 0x38 ? NMD_X86_OPCODE_MAP_0F38 : NMD_X86_OPCODE_MAP_0F3A);\n            \n\t\t\t_NMD_READ_BYTE(b, buffer_size, op);\n\t\t\tinstruction->opcode = op;\n\n\t\t\tif (!_nmd_decode_modrm(&b, &buffer_size, instruction))\n\t\t\t\treturn false;\n\n\t\t\tconst nmd_x86_modrm modrm = instruction->modrm;\n\t\t\tif (instruction->opcode_map == NMD_X86_OPCODE_MAP_0F38)\n\t\t\t{\n#ifndef NMD_ASSEMBLY_DISABLE_DECODER_VALIDITY_CHECK\n\t\t\t\tif (flags & NMD_X86_DECODER_FLAGS_VALIDITY_CHECK)\n\t\t\t\t{\n\t\t\t\t\t/* Check if the instruction is invalid. */\n\t\t\t\t\tif (op == 0x36)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op <= 0xb || (op >= 0x1c && op <= 0x1e))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT || instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO)\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op >= 0xc8 && op <= 0xcd)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (instruction->simd_prefix)\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x10 || op == 0x14 || op == 0x15 || op == 0x17 || (op >= 0x20 && op <= 0x25) || op == 0x28 || op == 0x29 || op == 0x2b || _NMD_R(op) == 3 || op == 0x40 || op == 0x41 || op == 0xcf || (op >= 0xdb && op <= 0xdf))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (instruction->simd_prefix != NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x2a || (op >= 0x80 && op <= 0x82))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (modrm.fields.mod == 0b11 || instruction->simd_prefix != NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xf0 || op == 0xf1)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (modrm.fields.mod == 0b11 && (instruction->simd_prefix == NMD_X86_PREFIXES_NONE || instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE))\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\telse if (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT)\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xf5 || op == 0xf8)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (instruction->simd_prefix != NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE || modrm.fields.mod == 0b11)\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xf6)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_NONE && modrm.fields.mod == 0b11)\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\telse if (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO)\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xf9)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (instruction->simd_prefix != NMD_X86_PREFIXES_NONE || modrm.fields.mod == 0b11)\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n#endif /* NMD_ASSEMBLY_DISABLE_DECODER_VALIDITY_CHECK */\n\n#ifndef NMD_ASSEMBLY_DISABLE_DECODER_INSTRUCTION_ID\n\t\t\t\tif (flags & NMD_X86_DECODER_FLAGS_INSTRUCTION_ID)\n\t\t\t\t{\n\t\t\t\t\tif (_NMD_R(op) == 0x00)\n\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_PSHUFB + op;\n\t\t\t\t\telse if (op >= 0x1c && op <= 0x1e)\n\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_PABSB + (op - 0x1c);\n\t\t\t\t\telse if (_NMD_R(op) == 2)\n\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_PMOVSXBW + _NMD_C(op);\n\t\t\t\t\telse if (_NMD_R(op) == 3)\n\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_PMOVZXBW + _NMD_C(op);\n\t\t\t\t\telse if (_NMD_R(op) == 8)\n\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_INVEPT + _NMD_C(op);\n\t\t\t\t\telse if (_NMD_R(op) == 0xc)\n\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_SHA1NEXTE + (_NMD_C(op) - 8);\n\t\t\t\t\telse if (_NMD_R(op) == 0xd)\n\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_AESIMC + (_NMD_C(op) - 0xb);\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tswitch (op)\n\t\t\t\t\t\t{\n\t\t\t\t\t\tcase 0x10: instruction->id = NMD_X86_INSTRUCTION_PBLENDVB; break;\n\t\t\t\t\t\tcase 0x14: instruction->id = NMD_X86_INSTRUCTION_BLENDVPS; break;\n\t\t\t\t\t\tcase 0x15: instruction->id = NMD_X86_INSTRUCTION_BLENDVPD; break;\n\t\t\t\t\t\tcase 0x17: instruction->id = NMD_X86_INSTRUCTION_PTEST; break;\n\t\t\t\t\t\tcase 0x40: instruction->id = NMD_X86_INSTRUCTION_PMULLD; break;\n\t\t\t\t\t\tcase 0x41: instruction->id = NMD_X86_INSTRUCTION_PHMINPOSUW; break;\n\t\t\t\t\t\tcase 0xf0: case 0xf1: instruction->id = (uint16_t)((instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE || instruction->simd_prefix == 0x00) ? NMD_X86_INSTRUCTION_MOVBE : NMD_X86_INSTRUCTION_CRC32); break;\n\t\t\t\t\t\tcase 0xf6: instruction->id = (uint16_t)(instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_INSTRUCTION_ADCX : NMD_X86_INSTRUCTION_ADOX); break;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n#endif /* NMD_ASSEMBLY_DISABLE_DECODER_INSTRUCTION_ID */\n\t\t\t\t\n#ifndef NMD_ASSEMBLY_DISABLE_DECODER_CPU_FLAGS\n\t\t\t\tif (flags & NMD_X86_DECODER_FLAGS_CPU_FLAGS)\n\t\t\t\t{\n\t\t\t\t\tif (op == 0x80 || op == 0x81) /* invept,invvpid */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_CF | NMD_X86_EFLAGS_ZF;\n\t\t\t\t\t\tinstruction->cleared_flags.eflags = NMD_X86_EFLAGS_PF | NMD_X86_EFLAGS_AF | NMD_X86_EFLAGS_SF | NMD_X86_EFLAGS_OF;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xf6)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE) /* adcx */\n\t\t\t\t\t\t\tinstruction->modified_flags.eflags = instruction->tested_flags.eflags = NMD_X86_EFLAGS_CF;\n\t\t\t\t\t\tif (instruction->prefixes & NMD_X86_PREFIXES_REPEAT) /* adox */\n\t\t\t\t\t\t\tinstruction->modified_flags.eflags = instruction->tested_flags.eflags = NMD_X86_EFLAGS_OF;\n\t\t\t\t\t}\n\t\t\t\t}\n#endif /* NMD_ASSEMBLY_DISABLE_DECODER_CPU_FLAGS */\n\n#ifndef NMD_ASSEMBLY_DISABLE_DECODER_OPERANDS\n\t\t\t\tif (flags & NMD_X86_DECODER_FLAGS_OPERANDS)\n\t\t\t\t{\n\t\t\t\t\tinstruction->num_operands = 2;\n\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_READWRITE;\n\t\t\t\t\tinstruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\n\t\t\t\t\tif (_NMD_R(op) == 0 || (op >= 0x1c && op <= 0x1e))\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_decode_operand_Pq(instruction, &instruction->operands[0]);\n\t\t\t\t\t\t_nmd_decode_operand_Qq(instruction, &instruction->operands[1]);\n\t\t\t\t\t}\n\t\t\t\t\telse if (_NMD_R(op) == 8)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_decode_operand_Gy(instruction, &instruction->operands[0]);\n\t\t\t\t\t\t_nmd_decode_modrm_upper32(instruction, &instruction->operands[1]);\n\t\t\t\t\t}\n\t\t\t\t\telse if (_NMD_R(op) >= 1 && _NMD_R(op) <= 0xe)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_decode_operand_Vdq(instruction, &instruction->operands[0]);\n\t\t\t\t\t\t_nmd_decode_operand_Wdq(instruction, &instruction->operands[1]);\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xf6)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_decode_operand_Gy(instruction, &instruction->operands[!instruction->simd_prefix ? 1 : 0]);\n\t\t\t\t\t\t_nmd_decode_operand_Ey(instruction, &instruction->operands[!instruction->simd_prefix ? 0 : 1]);\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xf0 || op == 0xf1)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO || (instruction->prefixes & (NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE | NMD_X86_PREFIXES_REPEAT_NOT_ZERO)) == (NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE | NMD_X86_PREFIXES_REPEAT_NOT_ZERO))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t_nmd_decode_operand_Gd(instruction, &instruction->operands[0]);\n\t\t\t\t\t\t\tif (op == 0xf0)\n\t\t\t\t\t\t\t\t_nmd_decode_operand_Eb(instruction, &instruction->operands[1]);\n\t\t\t\t\t\t\telse if (instruction->prefixes == NMD_X86_PREFIXES_REPEAT_NOT_ZERO)\n\t\t\t\t\t\t\t\t_nmd_decode_operand_Ey(instruction, &instruction->operands[1]);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t_nmd_decode_operand_Ew(instruction, &instruction->operands[1]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t\t\t\t\t\t_nmd_decode_operand_Gw(instruction, &instruction->operands[op == 0xf0 ? 0 : 1]);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t_nmd_decode_operand_Gy(instruction, &instruction->operands[op == 0xf0 ? 0 : 1]);\n\n\t\t\t\t\t\t\t_nmd_decode_memory_operand(instruction, &instruction->operands[op == 0xf0 ? 1 : 0], (uint8_t)(instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_REG_AX : (instruction->rex_w_prefix ? NMD_X86_REG_RAX : NMD_X86_REG_EAX)));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n#endif /* NMD_ASSEMBLY_DISABLE_DECODER_OPERANDS */\n\t\t\t}\n\t\t\telse /* 0x3a */\n\t\t\t{\n\t\t\t\tinstruction->imm_mask = NMD_X86_IMM8;\n                _NMD_READ_BYTE(b, buffer_size, instruction->immediate);\n\n#ifndef NMD_ASSEMBLY_DISABLE_DECODER_VALIDITY_CHECK\n\t\t\t\tif (flags & NMD_X86_DECODER_FLAGS_VALIDITY_CHECK)\n\t\t\t\t{\n\t\t\t\t\t/* Check if the instruction is invalid. */\n\t\t\t\t\tif ((op >= 0x8 && op <= 0xe) || (op >= 0x14 && op <= 0x17) || (op >= 0x20 && op <= 0x22) || (op >= 0x40 && op <= 0x42) || op == 0x44 || (op >= 0x60 && op <= 0x63) || op == 0xdf || op == 0xce || op == 0xcf)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (instruction->simd_prefix != NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x0f || op == 0xcc)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (instruction->simd_prefix)\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n#endif /* NMD_ASSEMBLY_DISABLE_DECODER_VALIDITY_CHECK */\n\n#ifndef NMD_ASSEMBLY_DISABLE_DECODER_INSTRUCTION_ID\n\t\t\t\tif (flags & NMD_X86_DECODER_FLAGS_INSTRUCTION_ID)\n\t\t\t\t{\n\t\t\t\t\tif (_NMD_R(op) == 0)\n\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_ROUNDPS + (op - 8);\n\t\t\t\t\telse if (_NMD_R(op) == 4)\n\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_DPPS + _NMD_C(op);\n\t\t\t\t\telse if (_NMD_R(op) == 6)\n\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_PCMPESTRM + _NMD_C(op);\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tswitch (op)\n\t\t\t\t\t\t{\n\t\t\t\t\t\tcase 0x14: instruction->id = NMD_X86_INSTRUCTION_PEXTRB; break;\n\t\t\t\t\t\tcase 0x15: instruction->id = NMD_X86_INSTRUCTION_PEXTRW; break;\n\t\t\t\t\t\tcase 0x16: instruction->id = (uint16_t)(instruction->prefixes & NMD_X86_PREFIXES_REX_W ? NMD_X86_INSTRUCTION_PEXTRQ : NMD_X86_INSTRUCTION_PEXTRD); break;\n\t\t\t\t\t\tcase 0x17: instruction->id = NMD_X86_INSTRUCTION_EXTRACTPS; break;\n\t\t\t\t\t\tcase 0x20: instruction->id = NMD_X86_INSTRUCTION_PINSRB; break;\n\t\t\t\t\t\tcase 0x21: instruction->id = NMD_X86_INSTRUCTION_INSERTPS; break;\n\t\t\t\t\t\tcase 0x22: instruction->id = (uint16_t)(instruction->prefixes & NMD_X86_PREFIXES_REX_W ? NMD_X86_INSTRUCTION_PINSRQ : NMD_X86_INSTRUCTION_PINSRD); break;\n\t\t\t\t\t\tcase 0xcc: instruction->id = NMD_X86_INSTRUCTION_SHA1RNDS4; break;\n\t\t\t\t\t\tcase 0xdf: instruction->id = NMD_X86_INSTRUCTION_AESKEYGENASSIST; break;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n#endif /* NMD_ASSEMBLY_DISABLE_DECODER_INSTRUCTION_ID */\n\n#ifndef NMD_ASSEMBLY_DISABLE_DECODER_OPERANDS\n\t\t\t\tif (flags & NMD_X86_DECODER_FLAGS_OPERANDS)\n\t\t\t\t{\n\t\t\t\t\tinstruction->num_operands = 3;\n\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_READWRITE;\n\t\t\t\t\tinstruction->operands[1].action = instruction->operands[2].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t\tinstruction->operands[2].type = NMD_X86_OPERAND_TYPE_IMMEDIATE;\n\n\t\t\t\t\tif (op == 0x0f && !instruction->simd_prefix)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_decode_operand_Pq(instruction, &instruction->operands[0]);\n\t\t\t\t\t\t_nmd_decode_operand_Qq(instruction, &instruction->operands[1]);\n\t\t\t\t\t}\n\t\t\t\t\telse if (_NMD_R(op) == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_decode_memory_operand(instruction, &instruction->operands[0], NMD_X86_REG_EAX);\n\t\t\t\t\t\t_nmd_decode_operand_Vdq(instruction, &instruction->operands[1]);\n\t\t\t\t\t}\n\t\t\t\t\telse if (_NMD_R(op) == 2)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_decode_operand_Vdq(instruction, &instruction->operands[0]);\n\t\t\t\t\t\t_nmd_decode_memory_operand(instruction, &instruction->operands[1], (uint8_t)(_NMD_C(op) == 1 ? NMD_X86_REG_XMM0 : NMD_X86_REG_EAX));\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xcc || op == 0xdf || _NMD_R(op) == 4 || _NMD_R(op) == 6 || _NMD_R(op) == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_decode_operand_Vdq(instruction, &instruction->operands[0]);\n\t\t\t\t\t\t_nmd_decode_operand_Wdq(instruction, &instruction->operands[1]);\n\t\t\t\t\t}\n\t\t\t\t}\n#endif /* NMD_ASSEMBLY_DISABLE_DECODER_OPERANDS */\n\t\t\t}\n\t\t}\n\t\telse if (op == 0x0f) /* 3DNow! opcode map*/\n\t\t{\n#ifndef NMD_ASSEMBLY_DISABLE_DECODER_3DNOW\n\t\t\tif (flags & NMD_X86_DECODER_FLAGS_3DNOW)\n\t\t\t{\n\t\t\t\tif (!_nmd_decode_modrm(&b, &buffer_size, instruction))\n\t\t\t\t\treturn false;\n\n\t\t\t\tinstruction->encoding = NMD_X86_ENCODING_3DNOW;\n\t\t\t\tinstruction->opcode = 0x0f;\n\t\t\t\tinstruction->imm_mask = NMD_X86_IMM8; /* The real opcode is encoded as the immediate byte. */\n\t\t\t\t_NMD_READ_BYTE(b, buffer_size, instruction->immediate);\n\n#ifndef NMD_ASSEMBLY_DISABLE_DECODER_VALIDITY_CHECK\n\t\t\t\tif (!_nmd_find_byte(_nmd_valid_3DNow_opcodes, sizeof(_nmd_valid_3DNow_opcodes), (uint8_t)instruction->immediate))\n\t\t\t\t\treturn false;\n#endif /* NMD_ASSEMBLY_DISABLE_DECODER_VALIDITY_CHECK */\n\n\t\t\t}\n\t\t\telse\n\t\t\t\treturn false;\n#else /* NMD_ASSEMBLY_DISABLE_DECODER_3DNOW */\n\t\treturn false;\n#endif /* NMD_ASSEMBLY_DISABLE_DECODER_3DNOW */\n\t\t}\n\t\telse /* 2 byte opcode. */\n\t\t{\n\t\t\tinstruction->opcode_size = 2;\n\t\t\tinstruction->opcode = op;\n\t\t\tinstruction->opcode_map = NMD_X86_OPCODE_MAP_0F;\n\t\t\t\n\t\t\t/* Check for ModR/M, SIB and displacement */\n\t\t\tif (op >= 0x20 && op <= 0x23 && buffer_size == 2)\n\t\t\t{\n\t\t\t\tinstruction->has_modrm = true;\n\t\t\t\t_NMD_READ_BYTE(b, buffer_size, instruction->modrm.modrm);\n\t\t\t}\n\t\t\telse if (op < 4 || (_NMD_R(op) != 3 && _NMD_R(op) > 0 && _NMD_R(op) < 7) || (op >= 0xD0 && op != 0xFF) || (_NMD_R(op) == 7 && _NMD_C(op) != 7) || _NMD_R(op) == 9 || _NMD_R(op) == 0xB || (_NMD_R(op) == 0xC && _NMD_C(op) < 8) || (_NMD_R(op) == 0xA && (op % 8) >= 3) || op == 0x0ff || op == 0x00 || op == 0x0d)\n\t\t\t{\n\t\t\t\tif (!_nmd_decode_modrm(&b, &buffer_size, instruction))\n\t\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst nmd_x86_modrm modrm = instruction->modrm;\n#ifndef NMD_ASSEMBLY_DISABLE_DECODER_VALIDITY_CHECK\n\t\t\tif (flags & NMD_X86_DECODER_FLAGS_VALIDITY_CHECK)\n\t\t\t{\n\t\t\t\t/* Check if the instruction is invalid. */\n\t\t\t\tif (_nmd_find_byte(_nmd_invalid_op2, sizeof(_nmd_invalid_op2), op))\n\t\t\t\t\treturn false;\n\t\t\t\telse if (op == 0xc7)\n\t\t\t\t{\n\t\t\t\t\tif ((!instruction->simd_prefix && (modrm.fields.mod == 0b11 ? modrm.fields.reg <= 0b101 : modrm.fields.reg == 0b000 || modrm.fields.reg == 0b010)) || (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO && (modrm.fields.mod == 0b11 || modrm.fields.reg != 0b001)) || ((instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE || instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT) && (modrm.fields.mod == 0b11 ? modrm.fields.reg <= (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT ? 0b110 : 0b101) : (modrm.fields.reg != 0b001 && modrm.fields.reg != 0b110))))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse if (op == 0x00)\n\t\t\t\t{\n\t\t\t\t\tif (modrm.fields.reg >= 0b110)\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse if (op == 0x01)\n\t\t\t\t{\n\t\t\t\t\tif ((modrm.fields.mod == 0b11 ? ((instruction->simd_prefix & (NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE | NMD_X86_PREFIXES_REPEAT_NOT_ZERO | NMD_X86_PREFIXES_REPEAT) && ((modrm.modrm >= 0xc0 && modrm.modrm <= 0xc5) || (modrm.modrm >= 0xc8 && modrm.modrm <= 0xcb) || (modrm.modrm >= 0xcf && modrm.modrm <= 0xd1) || (modrm.modrm >= 0xd4 && modrm.modrm <= 0xd7) || modrm.modrm == 0xee || modrm.modrm == 0xef || modrm.modrm == 0xfa || modrm.modrm == 0xfb)) || (modrm.fields.reg == 0b000 && modrm.fields.rm >= 0b110) || (modrm.fields.reg == 0b001 && modrm.fields.rm >= 0b100 && modrm.fields.rm <= 0b110) || (modrm.fields.reg == 0b010 && (modrm.fields.rm == 0b010 || modrm.fields.rm == 0b011)) || (modrm.fields.reg == 0b101 && modrm.fields.rm < 0b110 && (!(instruction->simd_prefix & NMD_X86_PREFIXES_REPEAT) || (instruction->simd_prefix & NMD_X86_PREFIXES_REPEAT && (modrm.fields.rm != 0b000 && modrm.fields.rm != 0b010)))) || (modrm.fields.reg == 0b111 && (modrm.fields.rm > 0b101 || (mode != NMD_X86_MODE_64 && modrm.fields.rm == 0b000)))) : (!(instruction->simd_prefix & NMD_X86_PREFIXES_REPEAT) && modrm.fields.reg == 0b101)))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse if (op == 0x1A || op == 0x1B)\n\t\t\t\t{\n\t\t\t\t\tif (modrm.fields.mod == 0b11)\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse if (op == 0x20 || op == 0x22)\n\t\t\t\t{\n\t\t\t\t\tif (modrm.fields.reg == 0b001 || modrm.fields.reg >= 0b101)\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse if (op >= 0x24 && op <= 0x27)\n\t\t\t\t\treturn false;\n\t\t\t\telse if (op >= 0x3b && op <= 0x3f)\n\t\t\t\t\treturn false;\n\t\t\t\telse if (_NMD_R(op) == 5)\n\t\t\t\t{\n\t\t\t\t\tif ((op == 0x50 && modrm.fields.mod != 0b11) || (instruction->simd_prefix & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE && (op == 0x52 || op == 0x53)) || (instruction->simd_prefix & NMD_X86_PREFIXES_REPEAT && (op == 0x50 || (op >= 0x54 && op <= 0x57))) || (instruction->simd_prefix & NMD_X86_PREFIXES_REPEAT_NOT_ZERO && (op == 0x50 || (op >= 0x52 && op <= 0x57) || op == 0x5b)))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse if (_NMD_R(op) == 6)\n\t\t\t\t{\n\t\t\t\t\tif ((!(instruction->simd_prefix & (NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE | NMD_X86_PREFIXES_REPEAT | NMD_X86_PREFIXES_REPEAT_NOT_ZERO)) && (op == 0x6c || op == 0x6d)) || (instruction->simd_prefix & NMD_X86_PREFIXES_REPEAT && op != 0x6f) || instruction->simd_prefix & NMD_X86_PREFIXES_REPEAT_NOT_ZERO)\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse if (op == 0x78 || op == 0x79)\n\t\t\t\t{\n\t\t\t\t\tif ((((instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE && op == 0x78) && !(modrm.fields.mod == 0b11 && modrm.fields.reg == 0b000)) || ((instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE || instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO) && modrm.fields.mod != 0b11)) || (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse if (op == 0x7c || op == 0x7d)\n\t\t\t\t{\n\t\t\t\t\tif (instruction->simd_prefix & NMD_X86_PREFIXES_REPEAT || !(instruction->simd_prefix & (NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE | NMD_X86_PREFIXES_REPEAT | NMD_X86_PREFIXES_REPEAT_NOT_ZERO)))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse if (op == 0x7e || op == 0x7f)\n\t\t\t\t{\n\t\t\t\t\tif (instruction->simd_prefix & NMD_X86_PREFIXES_REPEAT_NOT_ZERO)\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse if (op >= 0x71 && op <= 0x73)\n\t\t\t\t{\n\t\t\t\t\tif (instruction->simd_prefix & (NMD_X86_PREFIXES_REPEAT | NMD_X86_PREFIXES_REPEAT_NOT_ZERO) || modrm.modrm <= 0xcf || (modrm.modrm >= 0xe8 && modrm.modrm <= 0xef))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse if (op == 0x73)\n\t\t\t\t{\n\t\t\t\t\tif (modrm.modrm >= 0xe0 && modrm.modrm <= 0xe8)\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse if (op == 0xa6)\n\t\t\t\t{\n\t\t\t\t\tif (modrm.modrm != 0xc0 && modrm.modrm != 0xc8 && modrm.modrm != 0xd0)\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse if (op == 0xa7)\n\t\t\t\t{\n\t\t\t\t\tif (!(modrm.fields.mod == 0b11 && modrm.fields.reg <= 0b101 && modrm.fields.rm == 0b000))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse if (op == 0xae)\n\t\t\t\t{\n\t\t\t\t\tif (((!instruction->simd_prefix && modrm.fields.mod == 0b11 && modrm.fields.reg <= 0b100) || (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO && !(modrm.fields.mod == 0b11 && modrm.fields.reg == 0b110)) || (instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE && (modrm.fields.reg < 0b110 || (modrm.fields.mod == 0b11 && modrm.fields.reg == 0b111))) || (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT && (modrm.fields.reg != 0b100 && modrm.fields.reg != 0b110) && !(modrm.fields.mod == 0b11 && modrm.fields.reg == 0b101))))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse if (op == 0xb8)\n\t\t\t\t{\n\t\t\t\t\tif (!(instruction->simd_prefix & NMD_X86_PREFIXES_REPEAT))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse if (op == 0xba)\n\t\t\t\t{\n\t\t\t\t\tif (modrm.fields.reg <= 0b011)\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse if (op == 0xd0)\n\t\t\t\t{\n\t\t\t\t\tif (!instruction->simd_prefix || instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT)\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse if (op == 0xe0)\n\t\t\t\t{\n\t\t\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT || instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO)\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse if (op == 0xf0)\n\t\t\t\t{\n\t\t\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO ? modrm.fields.mod == 0b11 : true)\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse if (instruction->simd_prefix & (NMD_X86_PREFIXES_REPEAT | NMD_X86_PREFIXES_REPEAT_NOT_ZERO))\n\t\t\t\t{\n\t\t\t\t\tif ((op >= 0x13 && op <= 0x17 && !(op == 0x16 && instruction->simd_prefix & NMD_X86_PREFIXES_REPEAT)) || op == 0x28 || op == 0x29 || op == 0x2e || op == 0x2f || (op <= 0x76 && op >= 0x74))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse if (op == 0x71 || op == 0x72 || (op == 0x73 && !(instruction->simd_prefix & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)))\n\t\t\t\t{\n\t\t\t\t\tif ((modrm.modrm >= 0xd8 && modrm.modrm <= 0xdf) || modrm.modrm >= 0xf8)\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse if (op >= 0xc3 && op <= 0xc6)\n\t\t\t\t{\n\t\t\t\t\tif ((op == 0xc5 && modrm.fields.mod != 0b11) || (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT || instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO) || (op == 0xc3 && instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telse if (_NMD_R(op) >= 0xd && _NMD_C(op) != 0 && op != 0xff && ((_NMD_C(op) == 6 && _NMD_R(op) != 0xf) ? (!instruction->simd_prefix || (_NMD_R(op) == 0xD && (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT || instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO) ? modrm.fields.mod != 0b11 : false)) : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT || instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO || ((_NMD_C(op) == 7 && _NMD_R(op) != 0xe) ? modrm.fields.mod != 0b11 : false))))\n\t\t\t\t\treturn false;\n\t\t\t\telse if (modrm.fields.mod == 0b11)\n\t\t\t\t{\n\t\t\t\t\tif (op == 0xb2 || op == 0xb4 || op == 0xb5 || op == 0xc3 || op == 0xe7 || op == 0x2b || (instruction->simd_prefix & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE && (op == 0x12 || op == 0x16)) || (!(instruction->simd_prefix & (NMD_X86_PREFIXES_REPEAT | NMD_X86_PREFIXES_REPEAT_NOT_ZERO)) && (op == 0x13 || op == 0x17)))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n#endif /* NMD_ASSEMBLY_DISABLE_DECODER_VALIDITY_CHECK */\n\n\t\t\tif (_NMD_R(op) == 8) /* imm32 */\n\t\t\t\tinstruction->imm_mask = _NMD_GET_BY_MODE_OPSZPRFX_F64(mode, instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE, NMD_X86_IMM16, NMD_X86_IMM32, NMD_X86_IMM32);\n\t\t\telse if ((_NMD_R(op) == 7 && _NMD_C(op) < 4) || op == 0xA4 || op == 0xC2 || (op > 0xC3 && op <= 0xC6) || op == 0xBA || op == 0xAC) /* imm8 */\n\t\t\t\tinstruction->imm_mask = NMD_X86_IMM8;\n\t\t\telse if (op == 0x78 && (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO || instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)) /* imm8 + imm8 = \"imm16\" */\n\t\t\t\tinstruction->imm_mask = NMD_X86_IMM16;\n\n\t\t\t/* Make sure we can read 'instruction->imm_mask' bytes from the buffer */\n\t\t\tif (buffer_size < instruction->imm_mask)\n\t\t\t\treturn false;\n\t\t\t\n\t\t\t/* Copy 'instruction->imm_mask' bytes from the buffer */\n\t\t\tfor (i = 0; i < instruction->imm_mask; i++)\n\t\t\t\t((uint8_t*)(&instruction->immediate))[i] = b[i];\n\t\t\t\n\t\t\t/* Increment the buffer and decrement the buffer's size */\n\t\t\tb += instruction->imm_mask;\n\t\t\tbuffer_size -= instruction->imm_mask;\n\t\t\t\n\t\t\tif (_NMD_R(op) == 8 && instruction->immediate & ((uint64_t)(1) << (instruction->imm_mask * 8 - 1)))\n\t\t\t\tinstruction->immediate |= 0xffffffffffffffff << (instruction->imm_mask * 8);\n\n#ifndef NMD_ASSEMBLY_DISABLE_DECODER_INSTRUCTION_ID\n\t\t\tif (flags & NMD_X86_DECODER_FLAGS_INSTRUCTION_ID)\n\t\t\t{\n\t\t\t\tif (_NMD_R(op) == 8)\n\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_JO + _NMD_C(op);\n\t\t\t\telse if (op >= 0xa2 && op <= 0xa5)\n\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_CPUID + (op - 0xa2);\n\t\t\t\telse if (op == 0x05)\n\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_SYSCALL;\n\t\t\t\telse if (_NMD_R(op) == 4)\n\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_CMOVO + _NMD_C(op);\n\t\t\t\telse if (op == 0x00)\n\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_SLDT + modrm.fields.reg;\n\t\t\t\telse if (op == 0x01)\n\t\t\t\t{\n\t\t\t\t\tif (modrm.fields.mod == 0b11)\n\t\t\t\t\t{\n\t\t\t\t\t\tswitch (modrm.fields.reg)\n\t\t\t\t\t\t{\n\t\t\t\t\t\tcase 0b000: instruction->id = NMD_X86_INSTRUCTION_VMCALL + modrm.fields.rm; break;\n\t\t\t\t\t\tcase 0b001: instruction->id = NMD_X86_INSTRUCTION_MONITOR + modrm.fields.rm; break;\n\t\t\t\t\t\tcase 0b010: instruction->id = NMD_X86_INSTRUCTION_XGETBV + modrm.fields.rm; break;\n\t\t\t\t\t\tcase 0b011: instruction->id = NMD_X86_INSTRUCTION_VMRUN + modrm.fields.rm; break;\n\t\t\t\t\t\tcase 0b100: instruction->id = NMD_X86_INSTRUCTION_SMSW; break;\n\t\t\t\t\t\tcase 0b110: instruction->id = NMD_X86_INSTRUCTION_LMSW; break;\n\t\t\t\t\t\tcase 0b111: instruction->id = (uint16_t)(modrm.fields.rm == 0b000 ? NMD_X86_INSTRUCTION_SWAPGS : NMD_X86_INSTRUCTION_RDTSCP); break;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_SGDT + modrm.fields.reg;\n\t\t\t\t}\n\t\t\t\telse if (op <= 0x0b)\n\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_LAR + (op - 2);\n\t\t\t\telse if (op == 0x19 || (op >= 0x1c && op <= 0x1f))\n\t\t\t\t{\n\t\t\t\t\tif (op == 0x1e && modrm.modrm == 0xfa)\n\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_ENDBR64;\n\t\t\t\t\telse if (op == 0x1e && modrm.modrm == 0xfb)\n\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_ENDBR32;\n\t\t\t\t\telse\n\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_NOP;\n\t\t\t\t}\n\t\t\t\telse if (op >= 0x10 && op <= 0x17)\n\t\t\t\t{\n\t\t\t\t\tswitch (instruction->simd_prefix)\n\t\t\t\t\t{\n\t\t\t\t\tcase NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE: instruction->id = NMD_X86_INSTRUCTION_VMOVUPS + _NMD_C(op); break;\n\t\t\t\t\tcase NMD_X86_PREFIXES_REPEAT: instruction->id = NMD_X86_INSTRUCTION_VMOVUPS + _NMD_C(op); break;\n\t\t\t\t\tcase NMD_X86_PREFIXES_REPEAT_NOT_ZERO: instruction->id = NMD_X86_INSTRUCTION_VMOVUPS + _NMD_C(op); break;\n\t\t\t\t\tdefault: instruction->id = NMD_X86_INSTRUCTION_VMOVUPS + _NMD_C(op); break;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (op >= 0x20 && op <= 0x23)\n\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_MOV;\n\t\t\t\telse if (_NMD_R(op) == 3)\n\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_WRMSR + _NMD_C(op);\n\t\t\t\telse if (_NMD_R(op) == 5)\n\t\t\t\t{\n\t\t\t\t\tswitch (instruction->simd_prefix)\n\t\t\t\t\t{\n\t\t\t\t\tcase NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE: instruction->id = NMD_X86_INSTRUCTION_MOVMSKPD + _NMD_C(op); break;\n\t\t\t\t\tcase NMD_X86_PREFIXES_REPEAT: instruction->id = NMD_X86_INSTRUCTION_BNDMOV + _NMD_C(op); break;\n\t\t\t\t\tcase NMD_X86_PREFIXES_REPEAT_NOT_ZERO: instruction->id = NMD_X86_INSTRUCTION_BNDCL + _NMD_C(op); break;\n\t\t\t\t\tdefault: instruction->id = NMD_X86_INSTRUCTION_MOVMSKPS + _NMD_C(op); break;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (op >= 0x60 && op <= 0x6d)\n\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_PUNPCKLBW + _NMD_C(op);\n\t\t\t\telse if (op >= 0x74 && op <= 0x76)\n\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_PCMPEQB + (op - 0x74);\n\t\t\t\telse if (op >= 0xb2 && op <= 0xb5)\n\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_LSS + (op - 0xb2);\n\t\t\t\telse if (op >= 0xc3 && op <= 0xc5)\n\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_MOVNTI + (op - 0xc3);\n\t\t\t\telse if (op == 0xc7)\n\t\t\t\t{\n\t\t\t\t\tif (modrm.fields.reg == 0b001)\n\t\t\t\t\t\tinstruction->id = (uint16_t)(instruction->rex_w_prefix ? NMD_X86_INSTRUCTION_CMPXCHG16B : NMD_X86_INSTRUCTION_CMPXCHG8B);\n\t\t\t\t\telse if (modrm.fields.reg == 0b111)\n\t\t\t\t\t\tinstruction->id = (uint16_t)(modrm.fields.mod == 0b11 ? (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT ? NMD_X86_INSTRUCTION_RDPID : NMD_X86_INSTRUCTION_RDSEED) : NMD_X86_INSTRUCTION_VMPTRST);\n\t\t\t\t\telse\n\t\t\t\t\t\tinstruction->id = (uint16_t)(modrm.fields.mod == 0b11 ? NMD_X86_INSTRUCTION_RDRAND : (instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_INSTRUCTION_VMCLEAR : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT ? NMD_X86_INSTRUCTION_VMXON : NMD_X86_INSTRUCTION_VMPTRLD)));\n\t\t\t\t}\n\t\t\t\telse if (op >= 0xc8 && op <= 0xcf)\n\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_BSWAP;\n\t\t\t\telse if (op == 0xa3)\n\t\t\t\t\tinstruction->id = (uint16_t)((modrm.fields.mod == 0b11 ? NMD_X86_INSTRUCTION_RDFSBASE : NMD_X86_INSTRUCTION_FXSAVE) + modrm.fields.reg);\n\t\t\t\telse if (op >= 0xd1 && op <= 0xfe)\n\t\t\t\t{\n\t\t\t\t\tif (op == 0xd6)\n\t\t\t\t\t\tinstruction->id = (uint16_t)(instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_INSTRUCTION_MOVQ : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT ? NMD_X86_INSTRUCTION_MOVQ2DQ : NMD_X86_INSTRUCTION_MOVDQ2Q));\n\t\t\t\t\telse if (op == 0xe6)\n\t\t\t\t\t\tinstruction->id = (uint16_t)(instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_INSTRUCTION_CVTTPD2DQ : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT ? NMD_X86_INSTRUCTION_CVTDQ2PD : NMD_X86_INSTRUCTION_CVTPD2DQ));\n\t\t\t\t\telse if (op == 0xe7)\n\t\t\t\t\t\tinstruction->id = (uint16_t)(instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_INSTRUCTION_MOVNTDQ : NMD_X86_INSTRUCTION_MOVNTQ);\n\t\t\t\t\telse if (op == 0xf7)\n\t\t\t\t\t\tinstruction->id = (uint16_t)(instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_INSTRUCTION_MASKMOVDQU : NMD_X86_INSTRUCTION_MASKMOVQ);\n\t\t\t\t\telse\n\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_PSRLW + (op - 0xd1);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tswitch (op)\n\t\t\t\t\t{\n\t\t\t\t\tcase 0xa0: case 0xa8: instruction->id = NMD_X86_INSTRUCTION_PUSH; break;\n\t\t\t\t\tcase 0xa1: case 0xa9: instruction->id = NMD_X86_INSTRUCTION_POP; break;\n\t\t\t\t\tcase 0xaf: instruction->id = NMD_X86_INSTRUCTION_IMUL; break;\n\t\t\t\t\tcase 0xb0: case 0xb1: instruction->id = NMD_X86_INSTRUCTION_CMPXCHG; break;\n\t\t\t\t\tcase 0x10: case 0x11: instruction->id = (uint16_t)(instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_INSTRUCTION_MOVUPD : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT ? NMD_X86_INSTRUCTION_MOVSS : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO ? NMD_X86_INSTRUCTION_MOVSD : NMD_X86_INSTRUCTION_MOVUPD))); break;\n\t\t\t\t\tcase 0x12: case 0x13: instruction->id = (uint16_t)(instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_INSTRUCTION_MOVLPD : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT ? NMD_X86_INSTRUCTION_MOVSLDUP : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO ? NMD_X86_INSTRUCTION_MOVDDUP : NMD_X86_INSTRUCTION_MOVLPS))); break;\n\t\t\t\t\tcase 0x14: instruction->id = (uint16_t)(instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_INSTRUCTION_UNPCKLPD : NMD_X86_INSTRUCTION_UNPCKLPS); break;\n\t\t\t\t\tcase 0x15: instruction->id = (uint16_t)(instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_INSTRUCTION_UNPCKHPD : NMD_X86_INSTRUCTION_UNPCKHPS); break;\n\t\t\t\t\tcase 0x16: case 0x17: instruction->id = (uint16_t)(instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_INSTRUCTION_MOVHPD : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT ? NMD_X86_INSTRUCTION_MOVSHDUP : NMD_X86_INSTRUCTION_MOVHPS)); break;\n\t\t\t\t\tcase 0x18: instruction->id = (uint16_t)(modrm.fields.reg >= 0b100 ? NMD_X86_INSTRUCTION_NOP : (modrm.fields.reg == 0b000 ? NMD_X86_INSTRUCTION_PREFETCHNTA : (modrm.fields.reg == 0b001 ? NMD_X86_INSTRUCTION_PREFETCHT0 : (modrm.fields.reg == 0b010 ? NMD_X86_INSTRUCTION_PREFETCHT1 : NMD_X86_INSTRUCTION_PREFETCHT2)))); break;\n\t\t\t\t\tcase 0x1a: instruction->id = (uint16_t)(instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_INSTRUCTION_BNDMOV : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT ? NMD_X86_INSTRUCTION_BNDCL : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO ? NMD_X86_INSTRUCTION_BNDCU : NMD_X86_INSTRUCTION_BNDLDX))); break;\n\t\t\t\t\tcase 0x1b: instruction->id = (uint16_t)(instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_INSTRUCTION_BNDMOV : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT ? NMD_X86_INSTRUCTION_BNDMK : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO ? NMD_X86_INSTRUCTION_BNDCN : NMD_X86_INSTRUCTION_BNDSTX))); break;\n\t\t\t\t\tcase 0x28: case 0x29: instruction->id = (uint16_t)(instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_INSTRUCTION_MOVAPD : NMD_X86_INSTRUCTION_MOVAPS); break;\n\t\t\t\t\tcase 0x2a: instruction->id = (uint16_t)(instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_INSTRUCTION_CVTPI2PD : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT ? NMD_X86_INSTRUCTION_CVTSI2SS : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO ? NMD_X86_INSTRUCTION_CVTSI2SD : NMD_X86_INSTRUCTION_CVTPI2PS))); break;\n\t\t\t\t\tcase 0x2b: instruction->id = (uint16_t)(instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_INSTRUCTION_MOVNTPD : NMD_X86_INSTRUCTION_MOVNTPS); break;\n\t\t\t\t\tcase 0x2c: instruction->id = (uint16_t)(instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_INSTRUCTION_CVTTPD2PI : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT ? NMD_X86_INSTRUCTION_CVTTSS2SI : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO ? NMD_X86_INSTRUCTION_CVTTSS2SI : NMD_X86_INSTRUCTION_CVTTPS2PI))); break;\n\t\t\t\t\tcase 0x2d: instruction->id = (uint16_t)(instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_INSTRUCTION_CVTPD2PI : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT ? NMD_X86_INSTRUCTION_CVTSS2SI : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO ? NMD_X86_INSTRUCTION_CVTSS2SI : NMD_X86_INSTRUCTION_CVTPS2PI))); break;\n\t\t\t\t\tcase 0x2e: case 0x2f: instruction->id = (uint16_t)(instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_INSTRUCTION_UCOMISD : NMD_X86_INSTRUCTION_UCOMISS); break;\n\t\t\t\t\tcase 0x6e: instruction->id = (uint16_t)(instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE && !instruction->rex_w_prefix && (instruction->prefixes & NMD_X86_PREFIXES_REX_W) ? NMD_X86_INSTRUCTION_MOVQ : NMD_X86_INSTRUCTION_MOVD); break;\n\t\t\t\t\tcase 0x6f: instruction->id = (uint16_t)(instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_INSTRUCTION_MOVDQA : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT ? NMD_X86_INSTRUCTION_MOVDQU : NMD_X86_INSTRUCTION_MOVQ)); break;\n\t\t\t\t\tcase 0x70: instruction->id = (uint16_t)(instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_INSTRUCTION_PSHUFD : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT ? NMD_X86_INSTRUCTION_PSHUFHW : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO ? NMD_X86_INSTRUCTION_PSHUFLW : NMD_X86_INSTRUCTION_PSHUFW))); break;\n\t\t\t\t\tcase 0x71: instruction->id = (uint16_t)(modrm.fields.reg == 0b101 ? NMD_X86_INSTRUCTION_PSRLQ : (modrm.fields.reg == 0b100 ? NMD_X86_INSTRUCTION_PSRAW : NMD_X86_INSTRUCTION_PSLLW)); break;\n\t\t\t\t\tcase 0x72: instruction->id = (uint16_t)(modrm.fields.reg == 0b101 ? NMD_X86_INSTRUCTION_PSRLD : (modrm.fields.reg == 0b100 ? NMD_X86_INSTRUCTION_PSRAD : NMD_X86_INSTRUCTION_PSLLD)); break;\n\t\t\t\t\tcase 0x73: instruction->id = (uint16_t)(modrm.fields.reg == 0b010 ? NMD_X86_INSTRUCTION_PSRLQ : (modrm.fields.reg == 0b011 ? NMD_X86_INSTRUCTION_PSRLDQ : (modrm.fields.reg == 0b110 ? NMD_X86_INSTRUCTION_PSLLQ : NMD_X86_INSTRUCTION_PSLLDQ))); break;\n\t\t\t\t\tcase 0x78: instruction->id = (uint16_t)(instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_INSTRUCTION_EXTRQ : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO ? NMD_X86_INSTRUCTION_INSERTQ : NMD_X86_INSTRUCTION_VMREAD)); break;\n\t\t\t\t\tcase 0x79: instruction->id = (uint16_t)(instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_INSTRUCTION_EXTRQ : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO ? NMD_X86_INSTRUCTION_INSERTQ : NMD_X86_INSTRUCTION_VMWRITE)); break;\n\t\t\t\t\tcase 0x7c: instruction->id = (uint16_t)(instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_INSTRUCTION_HADDPD : NMD_X86_INSTRUCTION_HADDPS); break;\n\t\t\t\t\tcase 0x7d: instruction->id = (uint16_t)(instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_INSTRUCTION_HSUBPD : NMD_X86_INSTRUCTION_HSUBPS); break;\n\t\t\t\t\tcase 0x7e: instruction->id = (uint16_t)(instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT || (instruction->rex_w_prefix && instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE) ? NMD_X86_INSTRUCTION_MOVQ : NMD_X86_INSTRUCTION_MOVD); break;\n\t\t\t\t\tcase 0x7f: instruction->id = (uint16_t)(instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_INSTRUCTION_MOVDQA : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT ? NMD_X86_INSTRUCTION_MOVDQU : NMD_X86_INSTRUCTION_MOVQ)); break;\n\t\t\t\t\tcase 0x77: instruction->id = NMD_X86_INSTRUCTION_EMMS; break;\n\t\t\t\t\tcase 0x0e: instruction->id = NMD_X86_INSTRUCTION_FEMMS; break;\n\t\t\t\t\tcase 0xa3: instruction->id = NMD_X86_INSTRUCTION_BT; break;\n\t\t\t\t\tcase 0xa4: case 0xa5: instruction->id = NMD_X86_INSTRUCTION_SHLD; break;\n\t\t\t\t\tcase 0xaa: instruction->id = NMD_X86_INSTRUCTION_RSM; break;\n\t\t\t\t\tcase 0xab: instruction->id = NMD_X86_INSTRUCTION_BTS; break;\n\t\t\t\t\tcase 0xac: case 0xad: instruction->id = NMD_X86_INSTRUCTION_SHRD; break;\n\t\t\t\t\tcase 0xb6: case 0xb7: instruction->id = NMD_X86_INSTRUCTION_MOVZX; break;\n\t\t\t\t\tcase 0xb8: instruction->id = NMD_X86_INSTRUCTION_POPCNT; break;\n\t\t\t\t\tcase 0xb9: instruction->id = NMD_X86_INSTRUCTION_UD1; break;\n\t\t\t\t\tcase 0xba: instruction->id = (uint16_t)(modrm.fields.reg == 0b100 ? NMD_X86_INSTRUCTION_BT : (modrm.fields.reg == 0b101 ? NMD_X86_INSTRUCTION_BTS : (modrm.fields.reg == 0b110 ? NMD_X86_INSTRUCTION_BTR : NMD_X86_INSTRUCTION_BTC))); break;\n\t\t\t\t\tcase 0xbb: instruction->id = NMD_X86_INSTRUCTION_BTC; break;\n\t\t\t\t\tcase 0xbc: instruction->id = (uint16_t)(instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT ? NMD_X86_INSTRUCTION_BSF : NMD_X86_INSTRUCTION_TZCNT); break;\n\t\t\t\t\tcase 0xbd: instruction->id = (uint16_t)(instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT ? NMD_X86_INSTRUCTION_BSR : NMD_X86_INSTRUCTION_LZCNT); break;\n\t\t\t\t\tcase 0xbe: case 0xbf: instruction->id = NMD_X86_INSTRUCTION_MOVSX; break;\n\t\t\t\t\tcase 0xc0: case 0xc1: instruction->id = NMD_X86_INSTRUCTION_XADD; break;\n\t\t\t\t\tcase 0xc2: instruction->id = (uint16_t)(instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_INSTRUCTION_CMPPD : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT ? NMD_X86_INSTRUCTION_CMPSS : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO ? NMD_X86_INSTRUCTION_CMPSD : NMD_X86_INSTRUCTION_CMPPS))); break;\n\t\t\t\t\tcase 0xd0: instruction->id = (uint16_t)(instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_INSTRUCTION_ADDSUBPD : NMD_X86_INSTRUCTION_ADDSUBPS); break;\n\t\t\t\t\tcase 0xff: instruction->id = NMD_X86_INSTRUCTION_UD0; break;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n#endif /* NMD_ASSEMBLY_DISABLE_DECODER_INSTRUCTION_ID */\n\n#ifndef NMD_ASSEMBLY_DISABLE_DECODER_CPU_FLAGS\n\t\t\tif (flags & NMD_X86_DECODER_FLAGS_CPU_FLAGS)\n\t\t\t{\n\t\t\t\tif (_NMD_R(op) == 4 || _NMD_R(op) == 8 || _NMD_R(op) == 9) /* Conditional Move (CMOVcc),Conditional jump(Jcc),Byte set on condition(SETcc) */\n\t\t\t\t\t_nmd_decode_conditional_flag(instruction, _NMD_C(op));\n\t\t\t\telse if (op == 0x05 || op == 0x07) /* syscall,sysret */\n\t\t\t\t{\n\t\t\t\t\tinstruction->cleared_flags.eflags = op == 0x05 ? NMD_X86_EFLAGS_VM | NMD_X86_EFLAGS_RF : NMD_X86_EFLAGS_RF;\n\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_CF | NMD_X86_EFLAGS_PF | NMD_X86_EFLAGS_AF | NMD_X86_EFLAGS_ZF | NMD_X86_EFLAGS_SF | NMD_X86_EFLAGS_TF | NMD_X86_EFLAGS_IF | NMD_X86_EFLAGS_DF | NMD_X86_EFLAGS_OF | NMD_X86_EFLAGS_IOPL | NMD_X86_EFLAGS_NT | NMD_X86_EFLAGS_AC | NMD_X86_EFLAGS_VIF | NMD_X86_EFLAGS_VIP | NMD_X86_EFLAGS_ID;\n\t\t\t\t}\n\t\t\t\telse if (op == 0x34) /* sysenter */\n\t\t\t\t\tinstruction->cleared_flags.eflags = NMD_X86_EFLAGS_IF | NMD_X86_EFLAGS_RF | NMD_X86_EFLAGS_VM;\n\t\t\t\telse if (op == 0xaa) /* rsm */\n\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_CF | NMD_X86_EFLAGS_PF | NMD_X86_EFLAGS_AF | NMD_X86_EFLAGS_ZF | NMD_X86_EFLAGS_SF | NMD_X86_EFLAGS_TF | NMD_X86_EFLAGS_IF | NMD_X86_EFLAGS_DF | NMD_X86_EFLAGS_OF | NMD_X86_EFLAGS_IOPL | NMD_X86_EFLAGS_NT | NMD_X86_EFLAGS_RF | NMD_X86_EFLAGS_VM | NMD_X86_EFLAGS_AC | NMD_X86_EFLAGS_VIF | NMD_X86_EFLAGS_VIP | NMD_X86_EFLAGS_ID;\n\t\t\t\telse if (op == 0xaf) /* mul */\n\t\t\t\t{\n\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_CF | NMD_X86_EFLAGS_OF;\n\t\t\t\t\tinstruction->undefined_flags.eflags = NMD_X86_EFLAGS_PF | NMD_X86_EFLAGS_AF | NMD_X86_EFLAGS_ZF | NMD_X86_EFLAGS_SF;\n\t\t\t\t}\n\t\t\t\telse if (op == 0xb0 || op == 0xb1) /* cmpxchg */\n\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_CF | NMD_X86_EFLAGS_PF | NMD_X86_EFLAGS_AF | NMD_X86_EFLAGS_ZF | NMD_X86_EFLAGS_SF | NMD_X86_EFLAGS_OF;\n\t\t\t\telse if (op == 0xc0 || op == 0xc1) /* xadd */\n\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_CF | NMD_X86_EFLAGS_PF | NMD_X86_EFLAGS_AF | NMD_X86_EFLAGS_ZF | NMD_X86_EFLAGS_SF | NMD_X86_EFLAGS_OF;\n\t\t\t\telse if (op == 0x00 && (modrm.fields.reg == 0b100 || modrm.fields.reg == 0b101)) /* verr,verw*/\n\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_OF;\n\t\t\t\telse if (op == 0x01 && modrm.fields.mod == 0b11)\n\t\t\t\t{\n\t\t\t\t\tif (modrm.fields.reg == 0b000)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (modrm.fields.rm == 0b001 || modrm.fields.rm == 0b010 || modrm.fields.rm == 0b011) /* vmcall,vmlaunch,vmresume */\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tinstruction->tested_flags.eflags = NMD_X86_EFLAGS_IOPL | NMD_X86_EFLAGS_VM;\n\t\t\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_CF | NMD_X86_EFLAGS_PF | NMD_X86_EFLAGS_AF | NMD_X86_EFLAGS_ZF | NMD_X86_EFLAGS_SF | NMD_X86_EFLAGS_TF | NMD_X86_EFLAGS_IF | NMD_X86_EFLAGS_DF | NMD_X86_EFLAGS_OF | NMD_X86_EFLAGS_IOPL | NMD_X86_EFLAGS_NT | NMD_X86_EFLAGS_RF | NMD_X86_EFLAGS_VM | NMD_X86_EFLAGS_AC | NMD_X86_EFLAGS_VIF | NMD_X86_EFLAGS_VIP | NMD_X86_EFLAGS_ID;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (op == 0x34)\n\t\t\t\t\tinstruction->cleared_flags.eflags = NMD_X86_EFLAGS_VM | NMD_X86_EFLAGS_IF;\n\t\t\t\telse if (op == 0x78 || op == 0x79) /* vmread,vmwrite */\n\t\t\t\t{\n\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_CF | NMD_X86_EFLAGS_ZF;\n\t\t\t\t\tinstruction->cleared_flags.eflags = NMD_X86_EFLAGS_PF | NMD_X86_EFLAGS_SF | NMD_X86_EFLAGS_OF;\n\t\t\t\t}\n\t\t\t\telse if (op == 0x02 || op == 0x03) /* lar,lsl */\n\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_ZF;\n\t\t\t\telse if (op == 0xa3 || op == 0xab || op == 0xb3 || op == 0xba || op == 0xbb) /* bt,bts,btc */\n\t\t\t\t{\n\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_CF;\n\t\t\t\t\tinstruction->undefined_flags.eflags = NMD_X86_EFLAGS_OF | NMD_X86_EFLAGS_SF | NMD_X86_EFLAGS_AF | NMD_X86_EFLAGS_PF;\n\t\t\t\t}\n\t\t\t\telse if (op == 0xa4 || op == 0xa5 || op == 0xac || op == 0xad || op == 0xbc) /* shld,shrd */\n\t\t\t\t{\n\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_CF | NMD_X86_EFLAGS_PF | NMD_X86_EFLAGS_ZF | NMD_X86_EFLAGS_SF;\n\t\t\t\t\tinstruction->undefined_flags.eflags = NMD_X86_EFLAGS_AF | NMD_X86_EFLAGS_OF;\n\t\t\t\t}\n\t\t\t\telse if (op == 0xaa) /* rsm */\n\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_CF | NMD_X86_EFLAGS_PF | NMD_X86_EFLAGS_AF | NMD_X86_EFLAGS_ZF | NMD_X86_EFLAGS_SF | NMD_X86_EFLAGS_TF | NMD_X86_EFLAGS_IF | NMD_X86_EFLAGS_DF | NMD_X86_EFLAGS_OF | NMD_X86_EFLAGS_IOPL | NMD_X86_EFLAGS_NT | NMD_X86_EFLAGS_RF | NMD_X86_EFLAGS_VM | NMD_X86_EFLAGS_AC | NMD_X86_EFLAGS_VIF | NMD_X86_EFLAGS_VIP | NMD_X86_EFLAGS_ID;\n\t\t\t\telse if ((op == 0xbc || op == 0xbd) && instruction->prefixes & NMD_X86_PREFIXES_REPEAT) /* tzcnt */\n\t\t\t\t{\n\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_CF | NMD_X86_EFLAGS_ZF;\n\t\t\t\t\tinstruction->undefined_flags.eflags = NMD_X86_EFLAGS_PF | NMD_X86_EFLAGS_AF | NMD_X86_EFLAGS_SF | NMD_X86_EFLAGS_OF;\n\t\t\t\t}\n\t\t\t\telse if (op == 0xbc || op == 0xbd) /* bsf */\n\t\t\t\t{\n\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_ZF;\n\t\t\t\t\tinstruction->undefined_flags.eflags = NMD_X86_EFLAGS_CF | NMD_X86_EFLAGS_PF | NMD_X86_EFLAGS_AF | NMD_X86_EFLAGS_SF | NMD_X86_EFLAGS_OF;\n\t\t\t\t}\n\t\t\t}\n#endif /* NMD_ASSEMBLY_DISABLE_DECODER_CPU_FLAGS */\n\n#ifndef NMD_ASSEMBLY_DISABLE_DECODER_GROUP\n\t\t\t/* Parse the instruction's group. */\n\t\t\tif (flags & NMD_X86_DECODER_FLAGS_GROUP)\n\t\t\t{\n\t\t\t\tif (_NMD_R(op) == 8)\n\t\t\t\t\tinstruction->group = NMD_GROUP_JUMP | NMD_GROUP_CONDITIONAL_BRANCH | NMD_GROUP_RELATIVE_ADDRESSING;\n\t\t\t\telse if ((op == 0x01 && modrm.fields.rm == 0b111 && (modrm.fields.mod == 0b00 || modrm.modrm == 0xf8)) || op == 0x06 || op == 0x08 || op == 0x09 || op == 0x30 || op == 0x32 || op == 0x33 || op == 0x35 || op == 0x37)\n\t\t\t\t\tinstruction->group = NMD_GROUP_PRIVILEGE;\n\t\t\t}\n#endif /* NMD_ASSEMBLY_DISABLE_DECODER_GROUP */\n\n#ifndef NMD_ASSEMBLY_DISABLE_DECODER_OPERANDS\n\t\t\tif (flags & NMD_X86_DECODER_FLAGS_OPERANDS)\n\t\t\t{\n\t\t\t\tif (op == 0x2 || op == 0x3 || (op >= 0x10 && op <= 0x17) || _NMD_R(op) == 2 || (_NMD_R(op) >= 4 && _NMD_R(op) <= 7 && op != 0x77) || op == 0xa3 || op == 0xab || op == 0xaf || (_NMD_R(op) >= 0xc && op != 0xc7 && op != 0xff))\n\t\t\t\t\tinstruction->num_operands = 2;\n\t\t\t\telse if (_NMD_R(op) == 9 || op == 0xc7)\n\t\t\t\t\tinstruction->num_operands = 1;\n\t\t\t\telse if (op == 0xa4 || op == 0xa5 || op == 0xc2 || (op >= 0xc4 && op <= 0xc6))\n\t\t\t\t\tinstruction->num_operands = 3;\n\n\t\t\t\tif (op == 0x05 || op == 0x07) /* syscall,sysret */\n\t\t\t\t{\n\t\t\t\t\tinstruction->num_operands = 5;\n\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[0], true, NMD_X86_OPERAND_ACTION_WRITE, _NMD_GET_IP());\n\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[1], true, op == 0x05 ? NMD_X86_OPERAND_ACTION_WRITE : NMD_X86_OPERAND_ACTION_READ, NMD_X86_REG_RCX);\n\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[2], true, op == 0x05 ? NMD_X86_OPERAND_ACTION_WRITE : NMD_X86_OPERAND_ACTION_READ, NMD_X86_REG_R11);\n\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[3], true, NMD_X86_OPERAND_ACTION_WRITE, NMD_X86_REG_CS);\n\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[4], true, NMD_X86_OPERAND_ACTION_WRITE, NMD_X86_REG_SS);\n\t\t\t\t}\n\t\t\t\telse if (op == 0x34 || op == 0x35) /* sysenter,sysexit */\n\t\t\t\t{\n\t\t\t\t\tinstruction->num_operands = op == 0x34 ? 2 : 4;\n\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[0], true, NMD_X86_OPERAND_ACTION_WRITE, _NMD_GET_IP());\n\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[1], true, NMD_X86_OPERAND_ACTION_WRITE, _NMD_GET_GPR(NMD_X86_REG_SP));\n\t\t\t\t\tif (op == 0x35)\n\t\t\t\t\t{\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[2], true, NMD_X86_OPERAND_ACTION_READ, _NMD_GET_GPR(NMD_X86_REG_CX));\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[3], true, NMD_X86_OPERAND_ACTION_READ, _NMD_GET_GPR(NMD_X86_REG_DX));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (_NMD_R(op) == 8) /* jCC rel32 */\n\t\t\t\t{\n\t\t\t\t\tinstruction->num_operands = 2;\n\t\t\t\t\t_NMD_SET_IMM_OPERAND(instruction->operands[0], false, NMD_X86_OPERAND_ACTION_READ, instruction->immediate);\n\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[1], true, NMD_X86_OPERAND_ACTION_READWRITE, _NMD_GET_IP());\n\t\t\t\t}\n\t\t\t\telse if (op == 0x31) /* rdtsc */\n\t\t\t\t{\n\t\t\t\t\tinstruction->num_operands = 2;\n\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[0], true, NMD_X86_OPERAND_ACTION_WRITE, NMD_X86_REG_EAX);\n\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[1], true, NMD_X86_OPERAND_ACTION_WRITE, NMD_X86_REG_EDX);\n\t\t\t\t}\n\t\t\t\telse if (op == 0xa2) /* cpuid */\n\t\t\t\t{\n\t\t\t\t\tinstruction->num_operands = 4;\n\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[0], true, NMD_X86_OPERAND_ACTION_READWRITE, NMD_X86_REG_EAX);\n\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[1], true, NMD_X86_OPERAND_ACTION_WRITE, NMD_X86_REG_EBX);\n\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[2], true, NMD_X86_OPERAND_ACTION_WRITE | NMD_X86_OPERAND_ACTION_CONDREAD, NMD_X86_REG_ECX);\n\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[3], true, NMD_X86_OPERAND_ACTION_WRITE, NMD_X86_REG_EDX);\n\t\t\t\t}\n\t\t\t\telse if (op == 0xa0 || op == 0xa8) /* push fs,push gs */\n\t\t\t\t{\n\t\t\t\t\tinstruction->num_operands = 3;\n\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[0], false, NMD_X86_OPERAND_ACTION_READ, op == 0xa0 ? NMD_X86_REG_FS : NMD_X86_REG_GS);\n\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[1], true, NMD_X86_OPERAND_ACTION_READWRITE, _NMD_GET_GPR(NMD_X86_REG_SP));\n\t\t\t\t\t_NMD_SET_MEM_OPERAND(instruction->operands[2], true, NMD_X86_OPERAND_ACTION_WRITE, NMD_X86_REG_SS, _NMD_GET_GPR(NMD_X86_REG_SP), NMD_X86_REG_NONE, 0, 0);\n\t\t\t\t}\n\t\t\t\telse if (op == 0x30 || op == 0x32 || op == 0x33) /* wrmsr,rdmsr,rdpmc */\n\t\t\t\t{\n\t\t\t\t\tinstruction->num_operands = 3;\n\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[0], true, op == 0x30 ? NMD_X86_OPERAND_ACTION_READ : NMD_X86_OPERAND_ACTION_WRITE, NMD_X86_REG_EAX);\n\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[1], true, op == 0x30 ? NMD_X86_OPERAND_ACTION_READ : NMD_X86_OPERAND_ACTION_WRITE, NMD_X86_REG_EDX);\n\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[2], true, NMD_X86_OPERAND_ACTION_READ, NMD_X86_REG_ECX);\n\t\t\t\t}\n\t\t\t\telse if (op == 0xa1 || op == 0xa9) /* pop fs,pop gs */\n\t\t\t\t{\n\t\t\t\t\tinstruction->num_operands = 3;\n\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[0], false, NMD_X86_OPERAND_ACTION_WRITE, op == 0xa1 ? NMD_X86_REG_FS : NMD_X86_REG_GS);\n\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[1], true, NMD_X86_OPERAND_ACTION_READWRITE, _NMD_GET_GPR(NMD_X86_REG_SP));\n\t\t\t\t\t_NMD_SET_MEM_OPERAND(instruction->operands[2], true, NMD_X86_OPERAND_ACTION_READ, NMD_X86_REG_SS, _NMD_GET_GPR(NMD_X86_REG_SP), NMD_X86_REG_NONE, 0, 0);\n\t\t\t\t}\n\t\t\t\telse if (op == 0x37) /* getsec */\n\t\t\t\t{\n\t\t\t\t\tinstruction->num_operands = 2;\n\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[0], true, NMD_X86_OPERAND_ACTION_READ | NMD_X86_OPERAND_ACTION_CONDWRITE, NMD_X86_REG_EAX);\n\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[1], true, NMD_X86_OPERAND_ACTION_READ, NMD_X86_REG_EBX);\n\t\t\t\t}\n\t\t\t\telse if (op == 0xaa) /* rsm */\n\t\t\t\t{\n\t\t\t\t\tinstruction->num_operands = 1;\n\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[0], true, NMD_X86_OPERAND_ACTION_WRITE, _NMD_GET_IP());\n\t\t\t\t}\n\t\t\t\telse if (op == 0x00)\n\t\t\t\t{\n\t\t\t\t\tif (instruction->modrm.fields.reg >= 0b010)\n\t\t\t\t\t\t_nmd_decode_operand_Ew(instruction, &instruction->operands[0]);\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_decode_operand_Ev(instruction, &instruction->operands[0]);\n\n\t\t\t\t\tinstruction->operands[0].action = (uint8_t)(instruction->modrm.fields.reg >= 0b010 ? NMD_X86_OPERAND_ACTION_READ : NMD_X86_OPERAND_ACTION_WRITE);\n\t\t\t\t}\n\t\t\t\telse if (op == 0x01)\n\t\t\t\t{\n\t\t\t\t\tif (instruction->modrm.fields.mod != 0b11)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_decode_modrm_upper32(instruction, &instruction->operands[0]);\n\t\t\t\t\t\tinstruction->operands[0].action = (uint8_t)(instruction->modrm.fields.reg >= 0b010 ? NMD_X86_OPERAND_ACTION_READ : NMD_X86_OPERAND_ACTION_WRITE);\n\t\t\t\t\t}\n\t\t\t\t\telse if (instruction->modrm.fields.reg == 0b100)\n\t\t\t\t\t\t_nmd_decode_operand_Rv(instruction, &instruction->operands[0]);\n\t\t\t\t\telse if (instruction->modrm.fields.reg == 0b110)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_decode_operand_Ew(instruction, &instruction->operands[0]);\n\t\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (instruction->modrm.fields.reg == 0b100)\n\t\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_WRITE;\n\t\t\t\t}\n\t\t\t\telse if (op == 0x02 || op == 0x03)\n\t\t\t\t{\n\t\t\t\t\t_nmd_decode_operand_Gv(instruction, &instruction->operands[0]);\n\t\t\t\t\t_nmd_decode_operand_Ew(instruction, &instruction->operands[1]);\n\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_WRITE;\n\t\t\t\t\tinstruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t}\n\t\t\t\telse if (op == 0x0d)\n\t\t\t\t{\n\t\t\t\t\t_nmd_decode_operand_Ev(instruction, &instruction->operands[0]);\n\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t}\n\t\t\t\telse if (_NMD_R(op) == 0x8)\n\t\t\t\t{\n\t\t\t\t\tinstruction->operands[0].type = NMD_X86_OPERAND_TYPE_IMMEDIATE;\n\t\t\t\t}\n\t\t\t\telse if (_NMD_R(op) == 9)\n\t\t\t\t{\n\t\t\t\t\t_nmd_decode_operand_Eb(instruction, &instruction->operands[0]);\n\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_WRITE;\n\t\t\t\t}\n\t\t\t\telse if (op == 0x17)\n\t\t\t\t{\n\t\t\t\t\t_nmd_decode_modrm_upper32(instruction, &instruction->operands[0]);\n\t\t\t\t\t_nmd_decode_operand_Vdq(instruction, &instruction->operands[1]);\n\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_WRITE;\n\t\t\t\t\tinstruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t}\n\t\t\t\telse if (op >= 0x20 && op <= 0x23)\n\t\t\t\t{\n\t\t\t\t\tinstruction->operands[0].type = instruction->operands[1].type = NMD_X86_OPERAND_TYPE_REGISTER;\n\t\t\t\t\tinstruction->operands[op < 0x22 ? 0 : 1].fields.reg = NMD_X86_REG_EAX + instruction->modrm.fields.rm;\n\t\t\t\t\tinstruction->operands[op < 0x22 ? 1 : 0].fields.reg = (uint8_t)((op % 2 == 0 ? NMD_X86_REG_CR0 : NMD_X86_REG_DR0) + instruction->modrm.fields.reg);\n\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_WRITE;\n\t\t\t\t\tinstruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t}\n\t\t\t\telse if (op == 0x29 || op == 0x2b || (op == 0x7f && instruction->simd_prefix))\n\t\t\t\t{\n\t\t\t\t\t_nmd_decode_operand_Wdq(instruction, &instruction->operands[0]);\n\t\t\t\t\t_nmd_decode_operand_Vdq(instruction, &instruction->operands[1]);\n\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_WRITE;\n\t\t\t\t\tinstruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t}\n\t\t\t\telse if (op == 0x2a || op == 0x2c || op == 0x2d)\n\t\t\t\t{\n\t\t\t\t\tif (op == 0x2a)\n\t\t\t\t\t\t_nmd_decode_operand_Vdq(instruction, &instruction->operands[0]);\n\t\t\t\t\telse if (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT || instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO)\n\t\t\t\t\t\t_nmd_decode_operand_Gy(instruction, &instruction->operands[0]);\n\t\t\t\t\telse if (op == 0x2d && instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t\t\t\t_nmd_decode_operand_Qq(instruction, &instruction->operands[0]);\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_decode_operand_Pq(instruction, &instruction->operands[0]);\n\n\t\t\t\t\tif (op == 0x2a)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT || instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO)\n\t\t\t\t\t\t\t_nmd_decode_operand_Ey(instruction, &instruction->operands[1]);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t_nmd_decode_operand_Qq(instruction, &instruction->operands[1]);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_decode_operand_Wdq(instruction, &instruction->operands[1]);\n\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_WRITE;\n\t\t\t\t\tinstruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t}\n\t\t\t\telse if (op == 0x50)\n\t\t\t\t{\n\t\t\t\t\t_nmd_decode_operand_Gy(instruction, &instruction->operands[0]);\n\t\t\t\t\t_nmd_decode_operand_Udq(instruction, &instruction->operands[1]);\n\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_WRITE;\n\t\t\t\t\tinstruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t}\n\t\t\t\telse if (_NMD_R(op) == 5 || (op >= 0x10 && op <= 0x16) || op == 0x28 || op == 0x2e || op == 0x2f || (op == 0x7e && instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT))\n\t\t\t\t{\n\t\t\t\t\t_nmd_decode_operand_Vdq(instruction, &instruction->operands[op == 0x11 || op == 0x13 ? 1 : 0]);\n\t\t\t\t\t_nmd_decode_operand_Wdq(instruction, &instruction->operands[op == 0x11 || op == 0x13 ? 0 : 1]);\n\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_WRITE;\n\t\t\t\t\tinstruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t}\n\t\t\t\telse if (op == 0x7e)\n\t\t\t\t{\n\t\t\t\t\t_nmd_decode_operand_Ey(instruction, &instruction->operands[0]);\n\t\t\t\t\tinstruction->operands[1].type = NMD_X86_OPERAND_TYPE_REGISTER;\n\t\t\t\t\tinstruction->operands[1].fields.reg = (uint8_t)((instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_REG_XMM0 : NMD_X86_REG_MM0) + instruction->modrm.fields.reg);\n\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_WRITE;\n\t\t\t\t\tinstruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t}\n\t\t\t\telse if (_NMD_R(op) == 6 || op == 0x70 || (op >= 0x74 && op <= 0x76) || (op >= 0x7c && op <= 0x7f))\n\t\t\t\t{\n\t\t\t\t\tif (!instruction->simd_prefix)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_decode_operand_Pq(instruction, &instruction->operands[op == 0x7f ? 1 : 0]);\n\n\t\t\t\t\t\tif (op == 0x6e)\n\t\t\t\t\t\t\t_nmd_decode_operand_Ey(instruction, &instruction->operands[1]);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t_nmd_decode_operand_Qq(instruction, &instruction->operands[op == 0x7f ? 0 : 1]);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_decode_operand_Vdq(instruction, &instruction->operands[0]);\n\n\t\t\t\t\t\tif (op == 0x6e)\n\t\t\t\t\t\t\t_nmd_decode_operand_Ey(instruction, &instruction->operands[1]);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t_nmd_decode_operand_Wdq(instruction, &instruction->operands[1]);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (op == 0x70)\n\t\t\t\t\t\tinstruction->operands[2].type = NMD_X86_OPERAND_TYPE_IMMEDIATE;\n\n\t\t\t\t\tinstruction->operands[0].action = (uint8_t)(((op >= 0x60 && op <= 0x6d) || (op >= 0x74 && op <= 0x76)) ? NMD_X86_OPERAND_ACTION_READWRITE : NMD_X86_OPERAND_ACTION_WRITE);\n\t\t\t\t\tinstruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t}\n\t\t\t\telse if (op >= 0x71 && op <= 0x73)\n\t\t\t\t{\n\t\t\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t\t\t\t_nmd_decode_operand_Udq(instruction, &instruction->operands[0]);\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_decode_operand_Qq(instruction, &instruction->operands[0]);\n\t\t\t\t\tinstruction->operands[1].type = NMD_X86_OPERAND_TYPE_IMMEDIATE;\n\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_READWRITE;\n\t\t\t\t\tinstruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t}\n\t\t\t\telse if (op == 0x78 || op == 0x79)\n\t\t\t\t{\n\t\t\t\t\tif (instruction->simd_prefix)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (op == 0x78)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ti = 0;\n\t\t\t\t\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO)\n\t\t\t\t\t\t\t\t_nmd_decode_operand_Vdq(instruction, &instruction->operands[i++]);\n\t\t\t\t\t\t\t_nmd_decode_operand_Udq(instruction, &instruction->operands[i + 0]);\n\t\t\t\t\t\t\tinstruction->operands[i + 1].type = instruction->operands[i + 2].type = NMD_X86_OPERAND_TYPE_IMMEDIATE;\n\t\t\t\t\t\t\t/* FIXME: We should not access the buffer from here\n\t\t\t\t\t\t\tinstruction->operands[i + 1].fields.imm = b[1];\n\t\t\t\t\t\t\tinstruction->operands[i + 2].fields.imm = b[2];\n\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t_nmd_decode_operand_Vdq(instruction, &instruction->operands[0]);\n\t\t\t\t\t\t\t_nmd_decode_operand_Wdq(instruction, &instruction->operands[1]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_decode_operand_Ey(instruction, &instruction->operands[op == 0x78 ? 0 : 1]);\n\t\t\t\t\t\t_nmd_decode_operand_Gy(instruction, &instruction->operands[op == 0x78 ? 1 : 0]);\n\t\t\t\t\t}\n\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_WRITE;\n\t\t\t\t\tinstruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t}\n\t\t\t\telse if (_NMD_R(op) == 0xa && (op % 8) < 2)\n\t\t\t\t{\n\t\t\t\t\tinstruction->operands[0].type = NMD_X86_OPERAND_TYPE_REGISTER;\n\t\t\t\t\tinstruction->operands[0].fields.reg = (uint8_t)(op > 0xa8 ? NMD_X86_REG_GS : NMD_X86_REG_FS);\n\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t}\n\t\t\t\telse if ((_NMD_R(op) == 0xa && ((op % 8) >= 3 && (op % 8) <= 5)) || op == 0xb3 || op == 0xbb)\n\t\t\t\t{\n\t\t\t\t\t_nmd_decode_operand_Ev(instruction, &instruction->operands[0]);\n\t\t\t\t\t_nmd_decode_operand_Gv(instruction, &instruction->operands[1]);\n\n\t\t\t\t\tif (_NMD_R(op) == 0xa)\n\t\t\t\t\t{\n\t\t\t\t\t\tif ((op % 8) == 4)\n\t\t\t\t\t\t\tinstruction->operands[2].type = NMD_X86_OPERAND_TYPE_IMMEDIATE;\n\t\t\t\t\t\telse if ((op % 8) == 5)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tinstruction->operands[2].type = NMD_X86_OPERAND_TYPE_REGISTER;\n\t\t\t\t\t\t\tinstruction->operands[2].fields.reg = NMD_X86_REG_CL;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_READWRITE;\n\t\t\t\t\tinstruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t}\n\t\t\t\telse if (op == 0xaf || op == 0xb8)\n\t\t\t\t{\n\t\t\t\t\t_nmd_decode_operand_Gv(instruction, &instruction->operands[0]);\n\t\t\t\t\t_nmd_decode_operand_Ev(instruction, &instruction->operands[1]);\n\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_READWRITE;\n\t\t\t\t\tinstruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t}\n\t\t\t\telse if (op == 0xba)\n\t\t\t\t{\n\t\t\t\t\t_nmd_decode_operand_Ev(instruction, &instruction->operands[0]);\n\t\t\t\t\tinstruction->operands[0].action = (uint8_t)(instruction->modrm.fields.reg <= 0b101 ? NMD_X86_OPERAND_ACTION_READ : NMD_X86_OPERAND_ACTION_READWRITE);\n\t\t\t\t\tinstruction->operands[1].type = NMD_X86_OPERAND_TYPE_IMMEDIATE;\n\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_WRITE;\n\t\t\t\t\tinstruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t}\n\t\t\t\telse if (_NMD_R(op) == 0xb && (op % 8) >= 6)\n\t\t\t\t{\n\t\t\t\t\t_nmd_decode_operand_Gv(instruction, &instruction->operands[0]);\n\t\t\t\t\tif ((op % 8) == 6)\n\t\t\t\t\t\t_nmd_decode_operand_Eb(instruction, &instruction->operands[1]);\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_decode_operand_Ew(instruction, &instruction->operands[1]);\n\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_WRITE;\n\t\t\t\t\tinstruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t}\n\t\t\t\telse if (_NMD_R(op) == 0x4 || (_NMD_R(op) == 0xb && ((op % 8) == 0x4 || (op % 8) == 0x5)))\n\t\t\t\t{\n\t\t\t\t\t_nmd_decode_operand_Gv(instruction, &instruction->operands[0]);\n\t\t\t\t\t_nmd_decode_operand_Ev(instruction, &instruction->operands[1]);\n\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_WRITE;\n\t\t\t\t\tinstruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t}\n\t\t\t\telse if ((_NMD_R(op) == 0xb || _NMD_R(op) == 0xc) && _NMD_C(op) < 2)\n\t\t\t\t{\n\t\t\t\t\tif (_NMD_C(op) == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_decode_operand_Eb(instruction, &instruction->operands[0]);\n\t\t\t\t\t\t_nmd_decode_operand_Gb(instruction, &instruction->operands[1]);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_decode_operand_Ev(instruction, &instruction->operands[0]);\n\t\t\t\t\t\t_nmd_decode_operand_Gv(instruction, &instruction->operands[1]);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (_NMD_R(op) == 0xb)\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_READ | NMD_X86_OPERAND_ACTION_CONDWRITE;\n\t\t\t\t\t\tinstruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tinstruction->operands[0].action = instruction->operands[1].action = NMD_X86_OPERAND_ACTION_READWRITE;\n\t\t\t\t}\n\t\t\t\telse if (op == 0xb2)\n\t\t\t\t{\n\t\t\t\t\t_nmd_decode_operand_Gv(instruction, &instruction->operands[0]);\n\t\t\t\t\t_nmd_decode_modrm_upper32(instruction, &instruction->operands[1]);\n\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_WRITE;\n\t\t\t\t\tinstruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t}\n\t\t\t\telse if (op == 0xc3)\n\t\t\t\t{\n\t\t\t\t\t_nmd_decode_modrm_upper32(instruction, &instruction->operands[0]);\n\t\t\t\t\t_nmd_decode_operand_Gy(instruction, &instruction->operands[1]);\n\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_WRITE;\n\t\t\t\t\tinstruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t}\n\t\t\t\telse if (op == 0xc2 || op == 0xc6)\n\t\t\t\t{\n\t\t\t\t\t_nmd_decode_operand_Vdq(instruction, &instruction->operands[0]);\n\t\t\t\t\t_nmd_decode_operand_Wdq(instruction, &instruction->operands[1]);\n\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_READWRITE;\n\t\t\t\t\tinstruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t\tinstruction->operands[2].type = NMD_X86_OPERAND_TYPE_IMMEDIATE;\n\t\t\t\t}\n\t\t\t\telse if (op == 0xc4)\n\t\t\t\t{\n\t\t\t\t\tif (instruction->prefixes == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t\t\t\t_nmd_decode_operand_Vdq(instruction, &instruction->operands[0]);\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_decode_operand_Pq(instruction, &instruction->operands[0]);\n\t\t\t\t\t_nmd_decode_operand_Ey(instruction, &instruction->operands[1]);\n\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_WRITE;\n\t\t\t\t\tinstruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t\tinstruction->operands[2].type = NMD_X86_OPERAND_TYPE_IMMEDIATE;\n\t\t\t\t}\n\t\t\t\telse if (op == 0xc5)\n\t\t\t\t{\n\t\t\t\t\t_nmd_decode_operand_Gd(instruction, &instruction->operands[0]);\n\t\t\t\t\tif (instruction->prefixes == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t\t\t\t_nmd_decode_operand_Udq(instruction, &instruction->operands[1]);\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_decode_operand_Nq(instruction, &instruction->operands[1]);\n\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_WRITE;\n\t\t\t\t\tinstruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t\tinstruction->operands[2].type = NMD_X86_OPERAND_TYPE_IMMEDIATE;\n\t\t\t\t}\n\t\t\t\telse if (op == 0xc7)\n\t\t\t\t{\n\t\t\t\t\tif (instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t\t_nmd_decode_operand_Ev(instruction, &instruction->operands[0]);\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_decode_modrm_upper32(instruction, &instruction->operands[0]);\n\t\t\t\t\tinstruction->operands[0].action = (uint8_t)(instruction->modrm.fields.reg == 0b001 ? (NMD_X86_OPERAND_ACTION_READ | NMD_X86_OPERAND_ACTION_CONDWRITE) : (instruction->modrm.fields.mod == 0b11 || !instruction->simd_prefix ? NMD_X86_OPERAND_ACTION_WRITE : NMD_X86_OPERAND_ACTION_READ));\n\t\t\t\t}\n\t\t\t\telse if (op >= 0xc8 && op <= 0xcf)\n\t\t\t\t{\n\t\t\t\t\tinstruction->operands[0].type = NMD_X86_OPERAND_TYPE_REGISTER;\n\t\t\t\t\tinstruction->operands[0].fields.reg = (uint8_t)((instruction->prefixes & (NMD_X86_PREFIXES_REX_W | NMD_X86_PREFIXES_REX_B)) == (NMD_X86_PREFIXES_REX_W | NMD_X86_PREFIXES_REX_B) ? NMD_X86_REG_R8 : (instruction->prefixes & NMD_X86_PREFIXES_REX_W ? NMD_X86_REG_RAX : (instruction->prefixes & NMD_X86_PREFIXES_REX_B ? NMD_X86_REG_R8D : NMD_X86_REG_EAX)) + (op % 8));\n\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_READWRITE;\n\t\t\t\t}\n\t\t\t\telse if (_NMD_R(op) >= 0xd)\n\t\t\t\t{\n\t\t\t\t\tif (op == 0xff)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_decode_operand_Gd(instruction, &instruction->operands[0]);\n\t\t\t\t\t\t_nmd_decode_memory_operand(instruction, &instruction->operands[1], NMD_X86_REG_EAX);\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xd6 && instruction->simd_prefix != NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t_nmd_decode_operand_Vdq(instruction, &instruction->operands[0]);\n\t\t\t\t\t\t\t_nmd_decode_operand_Qq(instruction, &instruction->operands[1]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t_nmd_decode_operand_Pq(instruction, &instruction->operands[0]);\n\t\t\t\t\t\t\t_nmd_decode_operand_Wdq(instruction, &instruction->operands[1]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tconst size_t first_operand_index = op == 0xe7 || op == 0xd6 ? 1 : 0;\n\t\t\t\t\t\tconst size_t second_operand_index = op == 0xe7 || op == 0xd6 ? 0 : 1;\n\n\t\t\t\t\t\tif (!instruction->simd_prefix)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (op == 0xd7)\n\t\t\t\t\t\t\t\t_nmd_decode_operand_Gd(instruction, &instruction->operands[0]);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t_nmd_decode_operand_Pq(instruction, &instruction->operands[first_operand_index]);\n\t\t\t\t\t\t\t_nmd_decode_operand_Qq(instruction, &instruction->operands[second_operand_index]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (op == 0xd7)\n\t\t\t\t\t\t\t\t_nmd_decode_operand_Gd(instruction, &instruction->operands[0]);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t_nmd_decode_operand_Vdq(instruction, &instruction->operands[first_operand_index]);\n\t\t\t\t\t\t\t_nmd_decode_operand_Wdq(instruction, &instruction->operands[second_operand_index]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_WRITE;\n\t\t\t\t\tinstruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t}\n\t\t\t}\n#endif /* NMD_ASSEMBLY_DISABLE_DECODER_OPERANDS */\n\t\t}\n\t}\n\telse /* 1 byte opcode */\n\t{\n\t\tinstruction->opcode_size = 1;\n\t\tinstruction->opcode = op;\n\t\tinstruction->opcode_map = NMD_X86_OPCODE_MAP_DEFAULT;\n\n\t\t/* Check for ModR/M, SIB and displacement. */\n\t\tif (_NMD_R(op) == 8 || _nmd_find_byte(_nmd_op1_modrm, sizeof(_nmd_op1_modrm), op) || (_NMD_R(op) < 4 && (_NMD_C(op) < 4 || (_NMD_C(op) >= 8 && _NMD_C(op) < 0xC))) || (_NMD_R(op) == 0xD && _NMD_C(op) >= 8) /* FIXME: We should not access the buffer directly from here || (remaining_size > 1 && ((nmd_x86_modrm*)(b + 1))->fields.mod != 0b11 && (op == 0xc4 || op == 0xc5 || op == 0x62)) */)\n\t\t{\n\t\t\tif (!_nmd_decode_modrm(&b, &buffer_size, instruction))\n\t\t\t\treturn false;\n\t\t}\n\n#ifndef NMD_ASSEMBLY_DISABLE_DECODER_EVEX\n\t\t/* Check if instruction is EVEX. */\n\t\tif (flags & NMD_X86_DECODER_FLAGS_EVEX && op == 0x62 && !instruction->has_modrm)\n\t\t{\n\t\t\tinstruction->encoding = NMD_X86_ENCODING_EVEX;\n\t\t\treturn false;\n\t\t}\n#endif /* NMD_ASSEMBLY_DISABLE_DECODER_EVEX */\n#if !defined(NMD_ASSEMBLY_DISABLE_DECODER_EVEX) && !defined(NMD_ASSEMBLY_DISABLE_DECODER_VEX)\n\t\telse\n#endif\n#ifndef NMD_ASSEMBLY_DISABLE_DECODER_VEX\n\t\t\t/* Check if instruction is VEX. */\n\t\t\tif (flags & NMD_X86_DECODER_FLAGS_VEX && (op == 0xc4 || op == 0xc5) && !instruction->has_modrm)\n\t\t\t{\n\t\t\t\tinstruction->encoding = NMD_X86_ENCODING_VEX;\n\n\t\t\t\tinstruction->vex.vex[0] = op;\n\n\t\t\t\tuint8_t byte1;\n\t\t\t\t_NMD_READ_BYTE(b, buffer_size, byte1);\n\n\t\t\t\tinstruction->vex.R = byte1 & 0b10000000;\n\t\t\t\tif (instruction->vex.vex[0] == 0xc4)\n\t\t\t\t{\n\t\t\t\t\tinstruction->vex.X = (byte1 & 0b01000000) == 0b01000000;\n\t\t\t\t\tinstruction->vex.B = (byte1 & 0b00100000) == 0b00100000;\n\t\t\t\t\tinstruction->vex.m_mmmm = (uint8_t)(byte1 & 0b00011111);\n\n\t\t\t\t\tuint8_t byte2;\n\t\t\t\t\t_NMD_READ_BYTE(b, buffer_size, byte2);\n\t\t\t\t\t\n\t\t\t\t\tinstruction->vex.W = (byte2 & 0b10000000) == 0b10000000;\n\t\t\t\t\tinstruction->vex.vvvv = (uint8_t)((byte2 & 0b01111000) >> 3);\n\t\t\t\t\tinstruction->vex.L = (byte2 & 0b00000100) == 0b00000100;\n\t\t\t\t\tinstruction->vex.pp = (uint8_t)(byte2 & 0b00000011);\n\n\t\t\t\t\t_NMD_READ_BYTE(b, buffer_size, op);\n\t\t\t\t\tinstruction->opcode = op;\n\n\t\t\t\t\tif (op == 0x0c || op == 0x0d || op == 0x40 || op == 0x41 || op == 0x17 || op == 0x21 || op == 0x42)\n                    {\n\t\t\t\t\t\tinstruction->imm_mask = NMD_X86_IMM8;\n                        _NMD_READ_BYTE(b, buffer_size, instruction->immediate);\n                    }\n\n#ifndef NMD_ASSEMBLY_DISABLE_DECODER_VALIDITY_CHECK\n\t\t\t\t\t/* Check if the instruction is invalid. */\n\t\t\t\t\tif (op == 0x0c && instruction->vex.m_mmmm != 3)\n\t\t\t\t\t\treturn false;\n#endif /* NMD_ASSEMBLY_DISABLE_DECODER_VALIDITY_CHECK */\n\n\n#ifndef NMD_ASSEMBLY_DISABLE_DECODER_INSTRUCTION_ID\n\t\t\t\t\t/*if(op == 0x0c)\n\t\t\t\t\t\tinstruction->id = NMD_X86_INSTR\n\t\t\t\t\t\t*/\n#endif /* NMD_ASSEMBLY_DISABLE_DECODER_INSTRUCTION_ID */\n\t\t\t\t}\n\t\t\t\telse /* 0xc5 */\n\t\t\t\t{\n\t\t\t\t\tinstruction->vex.vvvv = (uint8_t)(byte1 & 0b01111000);\n\t\t\t\t\tinstruction->vex.L = byte1 & 0b00000100;\n\t\t\t\t\tinstruction->vex.pp = (uint8_t)(byte1 & 0b00000011);\n\n\t\t\t\t\t_NMD_READ_BYTE(b, buffer_size, op);\n\t\t\t\t\tinstruction->opcode = op;\n\t\t\t\t}\n\n\t\t\t\tif (!_nmd_decode_modrm(&b, &buffer_size, instruction))\n\t\t\t\t\treturn false;\n\t\t\t}\n#endif /* NMD_ASSEMBLY_DISABLE_DECODER_VEX */\n#if !(defined(NMD_ASSEMBLY_DISABLE_DECODER_EVEX) && defined(NMD_ASSEMBLY_DISABLE_DECODER_VEX))\n\t\t\telse\n#endif\n\t\t\t{\n\t\t\t\tconst nmd_x86_modrm modrm = instruction->modrm;\n#ifndef NMD_ASSEMBLY_DISABLE_DECODER_VALIDITY_CHECK\n\t\t\t\t/* Check if the instruction is invalid. */\n\t\t\t\tif (flags & NMD_X86_DECODER_FLAGS_VALIDITY_CHECK)\n\t\t\t\t{\n\t\t\t\t\tif (op == 0xC6 || op == 0xC7)\n\t\t\t\t\t{\n\t\t\t\t\t\tif ((modrm.fields.reg != 0b000 && modrm.fields.reg != 0b111) || (modrm.fields.reg == 0b111 && (modrm.fields.mod != 0b11 || modrm.fields.rm != 0b000)))\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x8f)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (modrm.fields.reg != 0b000)\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xfe)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (modrm.fields.reg >= 0b010)\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xff)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (modrm.fields.reg == 0b111 || (modrm.fields.mod == 0b11 && (modrm.fields.reg == 0b011 || modrm.fields.reg == 0b101)))\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x8c)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (modrm.fields.reg >= 0b110)\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x8e)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (modrm.fields.reg == 0b001 || modrm.fields.reg >= 0b110)\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x62)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (mode == NMD_X86_MODE_64)\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x8d)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (modrm.fields.mod == 0b11)\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xc4 || op == 0xc5)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (mode == NMD_X86_MODE_64 && instruction->has_modrm && modrm.fields.mod != 0b11)\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op >= 0xd8 && op <= 0xdf)\n\t\t\t\t\t{\n\t\t\t\t\t\tswitch (op)\n\t\t\t\t\t\t{\n\t\t\t\t\t\tcase 0xd9:\n\t\t\t\t\t\t\tif ((modrm.fields.reg == 0b001 && modrm.fields.mod != 0b11) || (modrm.modrm > 0xd0 && modrm.modrm < 0xd8) || modrm.modrm == 0xe2 || modrm.modrm == 0xe3 || modrm.modrm == 0xe6 || modrm.modrm == 0xe7 || modrm.modrm == 0xef)\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 0xda:\n\t\t\t\t\t\t\tif (modrm.modrm >= 0xe0 && modrm.modrm != 0xe9)\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 0xdb:\n\t\t\t\t\t\t\tif (((modrm.fields.reg == 0b100 || modrm.fields.reg == 0b110) && modrm.fields.mod != 0b11) || (modrm.modrm >= 0xe5 && modrm.modrm <= 0xe7) || modrm.modrm >= 0xf8)\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 0xdd:\n\t\t\t\t\t\t\tif ((modrm.fields.reg == 0b101 && modrm.fields.mod != 0b11) || _NMD_R(modrm.modrm) == 0xf)\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 0xde:\n\t\t\t\t\t\t\tif (modrm.modrm == 0xd8 || (modrm.modrm >= 0xda && modrm.modrm <= 0xdf))\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 0xdf:\n\t\t\t\t\t\t\tif ((modrm.modrm >= 0xe1 && modrm.modrm <= 0xe7) || modrm.modrm >= 0xf8)\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if (mode == NMD_X86_MODE_64)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (op == 0x6 || op == 0x7 || op == 0xe || op == 0x16 || op == 0x17 || op == 0x1e || op == 0x1f || op == 0x27 || op == 0x2f || op == 0x37 || op == 0x3f || (op >= 0x60 && op <= 0x62) || op == 0x82 || op == 0xce || (op >= 0xd4 && op <= 0xd6))\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n#endif /* NMD_ASSEMBLY_DISABLE_DECODER_VALIDITY_CHECK */\n\n\t\t\t\t/* Check for immediate */\t\t\n\t\t\t\tif (_nmd_find_byte(_nmd_op1_imm32, sizeof(_nmd_op1_imm32), op) || (_NMD_R(op) < 4 && (_NMD_C(op) == 5 || _NMD_C(op) == 0xD)) || (_NMD_R(op) == 0xB && _NMD_C(op) >= 8) || (op == 0xF7 && modrm.fields.reg == 0b000)) /* imm32,16 */\n\t\t\t\t{\n\t\t\t\t\tif (_NMD_R(op) == 0xB && _NMD_C(op) >= 8)\n\t\t\t\t\t\tinstruction->imm_mask = (uint8_t)(instruction->prefixes & NMD_X86_PREFIXES_REX_W ? NMD_X86_IMM64 : (instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE || (mode == NMD_X86_MODE_16 && !(instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)) ? NMD_X86_IMM16 : NMD_X86_IMM32));\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif ((mode == NMD_X86_MODE_16 && instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE) || (mode != NMD_X86_MODE_16 && !(instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)))\n\t\t\t\t\t\t\tinstruction->imm_mask = NMD_X86_IMM32;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tinstruction->imm_mask = NMD_X86_IMM16;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (_NMD_R(op) == 7 || (_NMD_R(op) == 0xE && _NMD_C(op) < 8) || (_NMD_R(op) == 0xB && _NMD_C(op) < 8) || (_NMD_R(op) < 4 && (_NMD_C(op) == 4 || _NMD_C(op) == 0xC)) || (op == 0xF6 && modrm.fields.reg <= 0b001) || _nmd_find_byte(_nmd_op1_imm8, sizeof(_nmd_op1_imm8), op)) /* imm8 */\n\t\t\t\t\tinstruction->imm_mask = NMD_X86_IMM8;\n\t\t\t\telse if (_NMD_R(op) == 0xA && _NMD_C(op) < 4)\n\t\t\t\t\tinstruction->imm_mask = (uint8_t)(mode == NMD_X86_MODE_64 ? (instruction->prefixes & NMD_X86_PREFIXES_ADDRESS_SIZE_OVERRIDE ? NMD_X86_IMM32 : NMD_X86_IMM64) : (instruction->prefixes & NMD_X86_PREFIXES_ADDRESS_SIZE_OVERRIDE ? NMD_X86_IMM16 : NMD_X86_IMM32));\n\t\t\t\telse if (op == 0xEA || op == 0x9A) /* imm32,48 */\n\t\t\t\t{\n\t\t\t\t\tif (mode == NMD_X86_MODE_64)\n\t\t\t\t\t\treturn false;\n\t\t\t\t\tinstruction->imm_mask = (uint8_t)(instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_IMM32 : NMD_X86_IMM48);\n\t\t\t\t}\n\t\t\t\telse if (op == 0xC2 || op == 0xCA) /* imm16 */\n\t\t\t\t\tinstruction->imm_mask = NMD_X86_IMM16;\n\t\t\t\telse if (op == 0xC8) /* imm16 + imm8 */\n\t\t\t\t\tinstruction->imm_mask = NMD_X86_IMM16 | NMD_X86_IMM8;\n\t\t\t\t\n\t\t\t\t/* Make sure we can read 'instruction->imm_mask' bytes from the buffer */\n\t\t\t\tif (buffer_size < instruction->imm_mask)\n\t\t\t\t\treturn false;\n\n\t\t\t\t/* Copy 'instruction->imm_mask' bytes from the buffer */\n\t\t\t\tfor (i = 0; i < instruction->imm_mask; i++)\n\t\t\t\t\t((uint8_t*)(&instruction->immediate))[i] = b[i];\n\t\t\t\t\n\t\t\t\t/* Increment the buffer and decrement the buffer's size */\n\t\t\t\tb += instruction->imm_mask;\n\t\t\t\tbuffer_size -= instruction->imm_mask;\n\n\t\t\t\t/* Sign extend immediate for specific instructions */\n\t\t\t\tif (op == 0xe9 || op == 0xeb || op == 0xe8 || _NMD_R(op) == 7)\n\t\t\t\t{\n\t\t\t\t\tif (instruction->immediate & ((uint64_t)(1) << (instruction->imm_mask * 8 - 1)))\n\t\t\t\t\t\tinstruction->immediate |= 0xffffffffffffffff << (instruction->imm_mask * 8);\n\t\t\t\t}\n\t\t\t\telse if (op == 0x68 && mode == NMD_X86_MODE_64 && instruction->immediate & ((uint64_t)1<<31))\n\t\t\t\t\tinstruction->immediate |= 0xffffffff00000000;\n\n\t\t\t\t/* These are optional features */\n#ifndef NMD_ASSEMBLY_DISABLE_DECODER_INSTRUCTION_ID\n\t\t\t\tif (flags & NMD_X86_DECODER_FLAGS_INSTRUCTION_ID)\n\t\t\t\t{\n\t\t\t\t\tconst bool opszprfx = instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE;\n\t\t\t\t\tif ((op >= 0x88 && op <= 0x8c) || (op >= 0xa0 && op <= 0xa3) || _NMD_R(op) == 0xb || op == 0x8e)\n\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_MOV;\n\t\t\t\t\telse if (_NMD_R(op) == 5)\n\t\t\t\t\t\tinstruction->id = (uint16_t)((_NMD_C(op) < 8) ? NMD_X86_INSTRUCTION_PUSH : NMD_X86_INSTRUCTION_POP);\n\t\t\t\t\telse if (_NMD_R(op) < 4 && (op % 8 < 6))\n\t\t\t\t\t\tinstruction->id = (NMD_X86_INSTRUCTION_ADD + (_NMD_R(op) << 1) + (_NMD_C(op) >= 8 ? 1 : 0));\n\t\t\t\t\telse if (op >= 0x80 && op <= 0x84)\n\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_ADD + modrm.fields.reg;\n\t\t\t\t\telse if (op == 0xe8)\n\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_CALL;\n\t\t\t\t\telse if (op == 0xcc)\n\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_INT3;\n\t\t\t\t\telse if (op == 0x8d)\n\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_LEA;\n\t\t\t\t\telse if (_NMD_R(op) == 4)\n\t\t\t\t\t\tinstruction->id = (uint16_t)((_NMD_C(op) < 8) ? NMD_X86_INSTRUCTION_INC : NMD_X86_INSTRUCTION_DEC);\n\t\t\t\t\telse if (_NMD_R(op) == 7)\n\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_JO + _NMD_C(op);\n\t\t\t\t\telse if (op == 0xff)\n\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_INC + modrm.fields.reg;\n\t\t\t\t\telse if (op == 0xeb || op == 0xe9)\n\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_JMP;\n\t\t\t\t\telse if (op == 0x90)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (instruction->prefixes & NMD_X86_PREFIXES_REPEAT)\n\t\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_PAUSE;\n\t\t\t\t\t\telse if (instruction->prefixes & NMD_X86_PREFIXES_REX_B)\n\t\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_XCHG;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_NOP;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xc3 || op == 0xc2)\n\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_RET;\n\t\t\t\t\telse if ((op >= 0x91 && op <= 0x97) || op == 0x86 || op == 0x87)\n\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_XCHG;\n\t\t\t\t\telse if (op == 0xc0 || op == 0xc1 || (op >= 0xd0 && op <= 0xd3))\n\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_ROL + modrm.fields.reg;\n\t\t\t\t\telse if (_NMD_R(op) == 0x0f && (op % 8 < 6))\n\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_INT1 + (op - 0xf1);\n\t\t\t\t\telse if (op >= 0xd4 && op <= 0xd7)\n\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_AAM + (op - 0xd4);\n\t\t\t\t\telse if (op >= 0xe0 && op <= 0xe3)\n\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_LOOPNE + (op - 0xe0);\n\t\t\t\t\telse /* case 0x: instruction->id = NMD_X86_INSTRUCTION_; break; */\n\t\t\t\t\t{\n\t\t\t\t\t\tswitch (op)\n\t\t\t\t\t\t{\n\t\t\t\t\t\tcase 0x8f: instruction->id = NMD_X86_INSTRUCTION_POP; break;\n\t\t\t\t\t\tcase 0xfe: instruction->id = (uint16_t)(modrm.fields.reg == 0b000 ? NMD_X86_INSTRUCTION_INC : NMD_X86_INSTRUCTION_DEC); break;\n\t\t\t\t\t\tcase 0x84: case 0x85: case 0xa8: case 0xa9: instruction->id = NMD_X86_INSTRUCTION_TEST; break;\n\t\t\t\t\t\tcase 0xf6: case 0xf7: instruction->id = NMD_X86_INSTRUCTION_TEST + modrm.fields.reg; break;\n\t\t\t\t\t\tcase 0x69: case 0x6b: instruction->id = NMD_X86_INSTRUCTION_IMUL; break;\n\t\t\t\t\t\tcase 0x9a: instruction->id = NMD_X86_INSTRUCTION_CALL; break;\n\t\t\t\t\t\tcase 0x62: instruction->id = NMD_X86_INSTRUCTION_BOUND; break;\n\t\t\t\t\t\tcase 0x63: instruction->id = (uint16_t)(mode == NMD_X86_MODE_64 ? NMD_X86_INSTRUCTION_MOVSXD : NMD_X86_INSTRUCTION_ARPL); break;\n\t\t\t\t\t\tcase 0x68: case 0x6a: case 0x06: case 0x16: case 0x1e: case 0x0e: instruction->id = NMD_X86_INSTRUCTION_PUSH; break;\n\t\t\t\t\t\tcase 0x6c: instruction->id = NMD_X86_INSTRUCTION_INSB; break;\n\t\t\t\t\t\tcase 0x6d: instruction->id = (uint16_t)(opszprfx ? NMD_X86_INSTRUCTION_INSW : NMD_X86_INSTRUCTION_INSD); break;\n\t\t\t\t\t\tcase 0x6e: instruction->id = NMD_X86_INSTRUCTION_OUTSB; break;\n\t\t\t\t\t\tcase 0x6f: instruction->id = (uint16_t)(opszprfx ? NMD_X86_INSTRUCTION_OUTSW : NMD_X86_INSTRUCTION_OUTSD); break;\n\t\t\t\t\t\tcase 0xc4: instruction->id = NMD_X86_INSTRUCTION_LES; break;\n\t\t\t\t\t\tcase 0xc5: instruction->id = NMD_X86_INSTRUCTION_LDS; break;\n\t\t\t\t\t\tcase 0xc6: case 0xc7: instruction->id = (uint16_t)(modrm.fields.reg == 0b000 ? NMD_X86_INSTRUCTION_MOV : (instruction->opcode == 0xc6 ? NMD_X86_INSTRUCTION_XABORT : NMD_X86_INSTRUCTION_XBEGIN)); break;\n\t\t\t\t\t\tcase 0xc8: instruction->id = NMD_X86_INSTRUCTION_ENTER; break;\n\t\t\t\t\t\tcase 0xc9: instruction->id = NMD_X86_INSTRUCTION_LEAVE; break;\n\t\t\t\t\t\tcase 0xca: case 0xcb: instruction->id = NMD_X86_INSTRUCTION_RETF; break;\n\t\t\t\t\t\tcase 0xcd: instruction->id = NMD_X86_INSTRUCTION_INT; break;\n\t\t\t\t\t\tcase 0xce: instruction->id = NMD_X86_INSTRUCTION_INTO; break;\n\t\t\t\t\t\tcase 0xcf: \n\t\t\t\t\t\t\tif (instruction->rex_w_prefix)\n\t\t\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_IRETQ;\n\t\t\t\t\t\t\telse if (mode == NMD_X86_MODE_16)\n\t\t\t\t\t\t\t\tinstruction->id = (uint16_t)(opszprfx ? NMD_X86_INSTRUCTION_IRETD : NMD_X86_INSTRUCTION_IRET);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tinstruction->id = (uint16_t)(opszprfx ? NMD_X86_INSTRUCTION_IRET : NMD_X86_INSTRUCTION_IRETD);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 0xe4: case 0xe5: case 0xec: case 0xed: instruction->id = NMD_X86_INSTRUCTION_IN; break;\n\t\t\t\t\t\tcase 0xe6: case 0xe7: case 0xee: case 0xef: instruction->id = NMD_X86_INSTRUCTION_OUT; break;\n\t\t\t\t\t\tcase 0xea: instruction->id = NMD_X86_INSTRUCTION_LJMP; break;\n\n\t\t\t\t\t\tcase 0x9c:\n\t\t\t\t\t\t\tif (opszprfx)\n\t\t\t\t\t\t\t\tinstruction->id = (uint16_t)(mode == NMD_X86_MODE_16 ? NMD_X86_INSTRUCTION_PUSHFD : NMD_X86_INSTRUCTION_PUSHF);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tinstruction->id = (uint16_t)(mode == NMD_X86_MODE_16 ? NMD_X86_INSTRUCTION_PUSHF : (mode == NMD_X86_MODE_32 ? NMD_X86_INSTRUCTION_PUSHFD : NMD_X86_INSTRUCTION_PUSHFQ));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 0x9d:\n\t\t\t\t\t\t\tif (opszprfx)\n\t\t\t\t\t\t\t\tinstruction->id = (uint16_t)(mode == NMD_X86_MODE_16 ? NMD_X86_INSTRUCTION_POPFD : NMD_X86_INSTRUCTION_POPF);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tinstruction->id = (uint16_t)(mode == NMD_X86_MODE_16 ? NMD_X86_INSTRUCTION_POPF : (mode == NMD_X86_MODE_32 ? NMD_X86_INSTRUCTION_POPFD : NMD_X86_INSTRUCTION_POPFQ));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 0x60: instruction->id = _NMD_GET_BY_MODE_OPSZPRFX(mode, opszprfx, NMD_X86_INSTRUCTION_PUSHA, NMD_X86_INSTRUCTION_PUSHAD); break;\n\t\t\t\t\t\tcase 0x61: instruction->id = _NMD_GET_BY_MODE_OPSZPRFX(mode, opszprfx, NMD_X86_INSTRUCTION_POPA, NMD_X86_INSTRUCTION_POPAD); break;\n\t\t\t\t\t\tcase 0x07: case 0x17: case 0x1f: instruction->id = NMD_X86_INSTRUCTION_POP; break;\n\t\t\t\t\t\tcase 0x27: instruction->id = NMD_X86_INSTRUCTION_DAA; break;\n\t\t\t\t\t\tcase 0x37: instruction->id = NMD_X86_INSTRUCTION_AAA; break;\n\t\t\t\t\t\tcase 0x2f: instruction->id = NMD_X86_INSTRUCTION_DAS; break;\n\t\t\t\t\t\tcase 0x3f: instruction->id = NMD_X86_INSTRUCTION_AAS; break;\n\t\t\t\t\t\tcase 0x9b: instruction->id = NMD_X86_INSTRUCTION_FWAIT; break;\n\t\t\t\t\t\tcase 0x9e: instruction->id = NMD_X86_INSTRUCTION_SAHF; break;\n\t\t\t\t\t\tcase 0x9f: instruction->id = NMD_X86_INSTRUCTION_LAHF; break;\n\t\t\t\t\t\tcase 0xA4: instruction->id = NMD_X86_INSTRUCTION_MOVSB; break;\n\t\t\t\t\t\tcase 0xA5: instruction->id = _NMD_GET_BY_MODE_OPSZPRFX_W64(mode, opszprfx, instruction->rex_w_prefix, NMD_X86_INSTRUCTION_MOVSW, NMD_X86_INSTRUCTION_MOVSD, NMD_X86_INSTRUCTION_MOVSQ); break; /*(uint16_t)(instruction->rex_w_prefix ? NMD_X86_INSTRUCTION_MOVSQ : (opszprfx ? NMD_X86_INSTRUCTION_MOVSW : NMD_X86_INSTRUCTION_MOVSD)); break;*/\n\t\t\t\t\t\tcase 0xA6: instruction->id = NMD_X86_INSTRUCTION_CMPSB; break;\n\t\t\t\t\t\tcase 0xA7: instruction->id = _NMD_GET_BY_MODE_OPSZPRFX_W64(mode, opszprfx, instruction->rex_w_prefix, NMD_X86_INSTRUCTION_CMPSW, NMD_X86_INSTRUCTION_CMPSD, NMD_X86_INSTRUCTION_CMPSQ); break;\n\t\t\t\t\t\tcase 0xAA: instruction->id = NMD_X86_INSTRUCTION_STOSB; break;\n\t\t\t\t\t\tcase 0xAB: instruction->id = _NMD_GET_BY_MODE_OPSZPRFX_W64(mode, opszprfx, instruction->rex_w_prefix, NMD_X86_INSTRUCTION_STOSW, NMD_X86_INSTRUCTION_STOSD, NMD_X86_INSTRUCTION_STOSQ); break;\n\t\t\t\t\t\tcase 0xAC: instruction->id = NMD_X86_INSTRUCTION_LODSB; break;\n\t\t\t\t\t\tcase 0xAD: instruction->id = _NMD_GET_BY_MODE_OPSZPRFX_W64(mode, opszprfx, instruction->rex_w_prefix, NMD_X86_INSTRUCTION_LODSW, NMD_X86_INSTRUCTION_LODSD, NMD_X86_INSTRUCTION_LODSQ); break;\n\t\t\t\t\t\tcase 0xAE: instruction->id = NMD_X86_INSTRUCTION_SCASB; break;\n\t\t\t\t\t\tcase 0xAF: instruction->id = _NMD_GET_BY_MODE_OPSZPRFX_W64(mode, opszprfx, instruction->rex_w_prefix, NMD_X86_INSTRUCTION_SCASW, NMD_X86_INSTRUCTION_SCASD, NMD_X86_INSTRUCTION_SCASQ); break;\n\t\t\t\t\t\tcase 0x98:\n\t\t\t\t\t\t\tif(instruction->prefixes & NMD_X86_PREFIXES_REX_W)\n\t\t\t\t\t\t\t\tinstruction->id = (uint16_t)NMD_X86_INSTRUCTION_CDQE;\n\t\t\t\t\t\t\telse if(instruction->mode == NMD_X86_MODE_16)\n\t\t\t\t\t\t\t\tinstruction->id = (uint16_t)(opszprfx ? NMD_X86_INSTRUCTION_CWDE : NMD_X86_INSTRUCTION_CBW);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tinstruction->id = (uint16_t)(opszprfx ? NMD_X86_INSTRUCTION_CBW : NMD_X86_INSTRUCTION_CWDE);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 0x99:\n\t\t\t\t\t\t\tif (instruction->prefixes & NMD_X86_PREFIXES_REX_W)\n\t\t\t\t\t\t\t\tinstruction->id = (uint16_t)NMD_X86_INSTRUCTION_CQO;\n\t\t\t\t\t\t\telse if (instruction->mode == NMD_X86_MODE_16)\n\t\t\t\t\t\t\t\tinstruction->id = (uint16_t)(opszprfx ? NMD_X86_INSTRUCTION_CDQ : NMD_X86_INSTRUCTION_CWD);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tinstruction->id = (uint16_t)(opszprfx ? NMD_X86_INSTRUCTION_CWD : NMD_X86_INSTRUCTION_CDQ);\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t/* Floating-point opcodes. */\n#define _NMD_F_OP_GET_OFFSET() ((_NMD_R(modrm.modrm) - 0xc) << 1) + (_NMD_C(op) >= 8 ? 1 : 0)\n\t\t\t\t\t\tcase 0xd8: instruction->id = (NMD_X86_INSTRUCTION_FADD + (modrm.fields.mod == 0b11 ? _NMD_F_OP_GET_OFFSET() : modrm.fields.reg)); break;\n\t\t\t\t\t\tcase 0xd9:\n\t\t\t\t\t\t\tif (modrm.fields.mod == 0b11)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (modrm.modrm <= 0xcf)\n\t\t\t\t\t\t\t\t\tinstruction->id = (uint16_t)(modrm.modrm <= 0xc7 ? NMD_X86_INSTRUCTION_FLD : NMD_X86_INSTRUCTION_FXCH);\n\t\t\t\t\t\t\t\telse if (modrm.modrm >= 0xd8 && modrm.modrm <= 0xdf)\n\t\t\t\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_FSTPNCE;\n\t\t\t\t\t\t\t\telse if (modrm.modrm == 0xd0)\n\t\t\t\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_FNOP;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_FCHS + (modrm.modrm - 0xe0);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_FLD + modrm.fields.reg;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 0xda:\n\t\t\t\t\t\t\tif (modrm.fields.mod == 0b11)\n\t\t\t\t\t\t\t\tinstruction->id = ((modrm.modrm == 0xe9) ? NMD_X86_INSTRUCTION_FUCOMPP : NMD_X86_INSTRUCTION_FCMOVB + _NMD_F_OP_GET_OFFSET());\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_FIADD + modrm.fields.reg;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 0xdb:\n\t\t\t\t\t\t\tif (modrm.fields.mod == 0b11)\n\t\t\t\t\t\t\t\tinstruction->id = (modrm.modrm == 0xe2 ? NMD_X86_INSTRUCTION_FNCLEX : (modrm.modrm == 0xe2 ? NMD_X86_INSTRUCTION_FNINIT : NMD_X86_INSTRUCTION_FCMOVNB + _NMD_F_OP_GET_OFFSET()));\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tinstruction->id = (modrm.fields.reg == 0b101 ? NMD_X86_INSTRUCTION_FLD : (modrm.fields.reg == 0b111 ? NMD_X86_INSTRUCTION_FSTP : NMD_X86_INSTRUCTION_FILD + modrm.fields.reg));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 0xdc:\n\t\t\t\t\t\t\tif (modrm.fields.mod == 0b11)\n\t\t\t\t\t\t\t\tinstruction->id = (NMD_X86_INSTRUCTION_FADD + ((_NMD_R(modrm.modrm) - 0xc) << 1) + ((_NMD_C(modrm.modrm) >= 8 && _NMD_R(modrm.modrm) <= 0xd) ? 1 : 0));\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_FADD + modrm.fields.reg;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 0xdd:\n\t\t\t\t\t\t\tif (modrm.fields.mod == 0b11)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tswitch ((modrm.modrm - 0xc0) >> 3)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcase 0b000: instruction->id = NMD_X86_INSTRUCTION_FFREE; break;\n\t\t\t\t\t\t\t\tcase 0b001: instruction->id = NMD_X86_INSTRUCTION_FXCH; break;\n\t\t\t\t\t\t\t\tcase 0b010: instruction->id = NMD_X86_INSTRUCTION_FST; break;\n\t\t\t\t\t\t\t\tcase 0b011: instruction->id = NMD_X86_INSTRUCTION_FSTP; break;\n\t\t\t\t\t\t\t\tcase 0b100: instruction->id = NMD_X86_INSTRUCTION_FUCOM; break;\n\t\t\t\t\t\t\t\tcase 0b101: instruction->id = NMD_X86_INSTRUCTION_FUCOMP; break;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tswitch (modrm.fields.reg)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcase 0b000: instruction->id = NMD_X86_INSTRUCTION_FLD; break;\n\t\t\t\t\t\t\t\tcase 0b001: instruction->id = NMD_X86_INSTRUCTION_FISTTP; break;\n\t\t\t\t\t\t\t\tcase 0b010: instruction->id = NMD_X86_INSTRUCTION_FST; break;\n\t\t\t\t\t\t\t\tcase 0b011: instruction->id = NMD_X86_INSTRUCTION_FSTP; break;\n\t\t\t\t\t\t\t\tcase 0b100: instruction->id = NMD_X86_INSTRUCTION_FRSTOR; break;\n\t\t\t\t\t\t\t\tcase 0b110: instruction->id = NMD_X86_INSTRUCTION_FNSAVE; break;\n\t\t\t\t\t\t\t\tcase 0b111: instruction->id = NMD_X86_INSTRUCTION_FNSTSW; break;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 0xde:\n\t\t\t\t\t\t\tif (modrm.fields.mod == 0b11)\n\t\t\t\t\t\t\t\tinstruction->id = (modrm.modrm == 0xd9 ? NMD_X86_INSTRUCTION_FCOMPP : ((modrm.modrm >= 0xd0 && modrm.modrm <= 0xd7) ? NMD_X86_INSTRUCTION_FCOMP : NMD_X86_INSTRUCTION_FADDP + _NMD_F_OP_GET_OFFSET()));\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_FIADD + modrm.fields.reg;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 0xdf:\n\t\t\t\t\t\t\tif (modrm.fields.mod == 0b11)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (modrm.fields.reg == 0b000)\n\t\t\t\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_FFREEP;\n\t\t\t\t\t\t\t\telse if (modrm.fields.reg == 0b001)\n\t\t\t\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_FXCH;\n\t\t\t\t\t\t\t\telse if (modrm.fields.reg <= 3)\n\t\t\t\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_FSTP;\n\t\t\t\t\t\t\t\telse if (modrm.modrm == 0xe0)\n\t\t\t\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_FNSTSW;\n\t\t\t\t\t\t\t\telse if (modrm.fields.reg == 0b110)\n\t\t\t\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_FCOMIP;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tinstruction->id = NMD_X86_INSTRUCTION_FUCOMIP;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tinstruction->id = (modrm.fields.reg == 0b101 ? NMD_X86_INSTRUCTION_FILD : (modrm.fields.reg == 0b111 ? NMD_X86_INSTRUCTION_FISTP : (NMD_X86_INSTRUCTION_FILD + modrm.fields.reg)));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n#endif /* NMD_ASSEMBLY_DISABLE_DECODER_INSTRUCTION_ID */\n\n#ifndef NMD_ASSEMBLY_DISABLE_DECODER_CPU_FLAGS\n\t\t\t\tif (flags & NMD_X86_DECODER_FLAGS_CPU_FLAGS)\n\t\t\t\t{\n\t\t\t\t\tif (op == 0xcc || op == 0xcd) /* int3,int n */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->cleared_flags.eflags = NMD_X86_EFLAGS_TF | NMD_X86_EFLAGS_RF;\n\t\t\t\t\t\tinstruction->tested_flags.eflags = NMD_X86_EFLAGS_IOPL | NMD_X86_EFLAGS_VM;\n\t\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_IF | NMD_X86_EFLAGS_NT | NMD_X86_EFLAGS_VM | NMD_X86_EFLAGS_AC | NMD_X86_EFLAGS_VIF;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xce) /* into */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->cleared_flags.eflags = NMD_X86_EFLAGS_RF;\n\t\t\t\t\t\tinstruction->tested_flags.eflags = NMD_X86_EFLAGS_OF | NMD_X86_EFLAGS_IOPL | NMD_X86_EFLAGS_VM;\n\t\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_TF | NMD_X86_EFLAGS_IF | NMD_X86_EFLAGS_NT | NMD_X86_EFLAGS_VM | NMD_X86_EFLAGS_AC;\n\t\t\t\t\t}\n\t\t\t\t\telse if (_NMD_R(op) == 7) /* conditional jump */\n\t\t\t\t\t\t_nmd_decode_conditional_flag(instruction, _NMD_C(op));\n\t\t\t\t\telse if (_NMD_R(op) == 4 || ((op == 0xfe || op == 0xff) && modrm.fields.reg <= 0b001)) /* inc,dec */\n\t\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_OF | NMD_X86_EFLAGS_SF | NMD_X86_EFLAGS_ZF | NMD_X86_EFLAGS_AF | NMD_X86_EFLAGS_PF;\n\t\t\t\t\telse if (op <= 0x05 || (op >= 0x10 && op <= 0x15) || ((_NMD_R(op) == 1 || _NMD_R(op) == 2 || _NMD_R(op) == 3) && (_NMD_C(op) >= 0x8 && _NMD_C(op) <= 0x0d)) || ((op >= 0x80 && op <= 0x83) && (modrm.fields.reg == 0b000 || modrm.fields.reg == 0b010 || modrm.fields.reg == 0b011 || modrm.fields.reg == 0b010 || modrm.fields.reg == 0b101 || modrm.fields.reg == 0b111)) || (op == 0xa6 || op == 0xa7) || (op == 0xae || op == 0xaf)) /* add,adc,sbb,sub,cmp, cmps,cmpsb,cmpsw,cmpsd,cmpsq, scas,scasb,scasw,scasd */\n\t\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_OF | NMD_X86_EFLAGS_SF | NMD_X86_EFLAGS_ZF | NMD_X86_EFLAGS_AF | NMD_X86_EFLAGS_CF | NMD_X86_EFLAGS_PF;\n\t\t\t\t\telse if (op == 0x9c) /* pushf,pushfd,pushfq */\n\t\t\t\t\t\tinstruction->tested_flags.eflags = NMD_X86_EFLAGS_CF | NMD_X86_EFLAGS_PF | NMD_X86_EFLAGS_AF | NMD_X86_EFLAGS_ZF | NMD_X86_EFLAGS_SF | NMD_X86_EFLAGS_TF | NMD_X86_EFLAGS_IF | NMD_X86_EFLAGS_DF | NMD_X86_EFLAGS_OF | NMD_X86_EFLAGS_IOPL | NMD_X86_EFLAGS_NT | NMD_X86_EFLAGS_RF | NMD_X86_EFLAGS_VM | NMD_X86_EFLAGS_AC | NMD_X86_EFLAGS_VIF | NMD_X86_EFLAGS_VIP | NMD_X86_EFLAGS_ID;\n\t\t\t\t\telse if (op == 0x9d) /* popf,popfd,popfq */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_CF | NMD_X86_EFLAGS_PF | NMD_X86_EFLAGS_AF | NMD_X86_EFLAGS_ZF | NMD_X86_EFLAGS_SF | NMD_X86_EFLAGS_TF | NMD_X86_EFLAGS_IF | NMD_X86_EFLAGS_DF | NMD_X86_EFLAGS_OF | NMD_X86_EFLAGS_IOPL | NMD_X86_EFLAGS_NT | NMD_X86_EFLAGS_AC | NMD_X86_EFLAGS_VIF | NMD_X86_EFLAGS_ID;\n\t\t\t\t\t\tinstruction->tested_flags.eflags = NMD_X86_EFLAGS_IOPL | NMD_X86_EFLAGS_VM | NMD_X86_EFLAGS_VIP;\n\t\t\t\t\t\tinstruction->cleared_flags.eflags = NMD_X86_EFLAGS_RF;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xcf) /* iret,iretd,iretf */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_CF | NMD_X86_EFLAGS_PF | NMD_X86_EFLAGS_AF | NMD_X86_EFLAGS_ZF | NMD_X86_EFLAGS_SF | NMD_X86_EFLAGS_TF | NMD_X86_EFLAGS_IF | NMD_X86_EFLAGS_DF | NMD_X86_EFLAGS_OF | NMD_X86_EFLAGS_IOPL | NMD_X86_EFLAGS_NT | NMD_X86_EFLAGS_RF | NMD_X86_EFLAGS_VM | NMD_X86_EFLAGS_AC | NMD_X86_EFLAGS_VIF | NMD_X86_EFLAGS_VIP | NMD_X86_EFLAGS_ID;\n\t\t\t\t\t\tinstruction->tested_flags.eflags = NMD_X86_EFLAGS_IOPL | NMD_X86_EFLAGS_NT | NMD_X86_EFLAGS_VM;\n\t\t\t\t\t}\n\t\t\t\t\telse if ((op >= 0x08 && op <= 0x0d) || ((_NMD_R(op) == 2 || _NMD_R(op) == 3) && _NMD_C(op) <= 5) || ((op >= 0x80 && op <= 0x83) && (modrm.fields.reg == 0b001 || modrm.fields.reg == 0b100 || modrm.fields.reg == 0b110)) || (op == 0x84 || op == 0x85 || op == 0xa8 || op == 0xa9) || ((op == 0xf6 || op == 0xf7) && modrm.fields.reg == 0b000)) /* or,and,xor, test */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->cleared_flags.eflags = NMD_X86_EFLAGS_OF | NMD_X86_EFLAGS_CF;\n\t\t\t\t\t\tinstruction->undefined_flags.eflags = NMD_X86_EFLAGS_AF;\n\t\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_SF | NMD_X86_EFLAGS_ZF | NMD_X86_EFLAGS_PF;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x69 || op == 0x6b || ((op == 0xf6 || op == 0xf7) && (modrm.fields.reg == 0b100 || modrm.fields.reg == 0b101))) /* mul,imul */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_CF | NMD_X86_EFLAGS_OF;\n\t\t\t\t\t\tinstruction->undefined_flags.eflags = NMD_X86_EFLAGS_SF | NMD_X86_EFLAGS_ZF | NMD_X86_EFLAGS_AF | NMD_X86_EFLAGS_PF;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xf6 || op == 0xf7) /* Group 3 */\n\t\t\t\t\t{\n\t\t\t\t\t\tif (modrm.fields.reg == 0b011) /* neg */\n\t\t\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_CF | NMD_X86_EFLAGS_PF | NMD_X86_EFLAGS_AF | NMD_X86_EFLAGS_ZF | NMD_X86_EFLAGS_SF | NMD_X86_EFLAGS_OF;\n\t\t\t\t\t\telse if (modrm.fields.reg >= 0b110) /* div,idiv */\n\t\t\t\t\t\t\tinstruction->undefined_flags.eflags = NMD_X86_EFLAGS_CF | NMD_X86_EFLAGS_OF | NMD_X86_EFLAGS_SF | NMD_X86_EFLAGS_ZF | NMD_X86_EFLAGS_AF | NMD_X86_EFLAGS_PF;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xc0 || op == 0xc1 || (op >= 0xd0 && op <= 0xd3))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (modrm.fields.reg <= 0b011) /* rol,ror,rcl,rcr */\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_CF;\n\t\t\t\t\t\t\tinstruction->undefined_flags.eflags = NMD_X86_EFLAGS_OF;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse /* shl,shr,sar */\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_CF | NMD_X86_EFLAGS_SF | NMD_X86_EFLAGS_ZF | NMD_X86_EFLAGS_PF | NMD_X86_EFLAGS_OF;\n\t\t\t\t\t\t\tinstruction->undefined_flags.eflags = NMD_X86_EFLAGS_AF;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x27 || op == 0x2f) /* daa,das */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->tested_flags.eflags = NMD_X86_EFLAGS_CF | NMD_X86_EFLAGS_AF;\n\t\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_CF | NMD_X86_EFLAGS_AF | NMD_X86_EFLAGS_SF | NMD_X86_EFLAGS_ZF | NMD_X86_EFLAGS_PF;\n\t\t\t\t\t\tinstruction->undefined_flags.eflags = NMD_X86_EFLAGS_OF;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x37 || op == 0x3f) /* aaa,aas */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->tested_flags.eflags = NMD_X86_EFLAGS_AF;\n\t\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_AF | NMD_X86_EFLAGS_CF;\n\t\t\t\t\t\tinstruction->undefined_flags.eflags = NMD_X86_EFLAGS_OF | NMD_X86_EFLAGS_SF | NMD_X86_EFLAGS_ZF | NMD_X86_EFLAGS_PF;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x63 && mode != NMD_X86_MODE_64) /* arpl */\n\t\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_ZF;\n\t\t\t\t\telse if (op == 0x9b) /* fwait,wait */\n\t\t\t\t\t\tinstruction->undefined_flags.fpu_flags = NMD_X86_FPU_FLAGS_C0 | NMD_X86_FPU_FLAGS_C1 | NMD_X86_FPU_FLAGS_C2 | NMD_X86_FPU_FLAGS_C3;\n\t\t\t\t\telse if (op == 0x9e) /* sahf */\n\t\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_SF | NMD_X86_EFLAGS_ZF | NMD_X86_EFLAGS_AF | NMD_X86_EFLAGS_PF | NMD_X86_EFLAGS_CF;\n\t\t\t\t\telse if (op == 0x9f) /* lahf */\n\t\t\t\t\t\tinstruction->tested_flags.eflags = NMD_X86_EFLAGS_SF | NMD_X86_EFLAGS_ZF | NMD_X86_EFLAGS_AF | NMD_X86_EFLAGS_PF | NMD_X86_EFLAGS_CF;\n\t\t\t\t\telse if (op == 0xd4 || op == 0xd5) /* aam,aad */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_SF | NMD_X86_EFLAGS_ZF | NMD_X86_EFLAGS_PF;\n\t\t\t\t\t\tinstruction->undefined_flags.eflags = NMD_X86_EFLAGS_OF | NMD_X86_EFLAGS_AF | NMD_X86_EFLAGS_CF;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xd6) /* salc */\n\t\t\t\t\t\tinstruction->tested_flags.eflags = NMD_X86_EFLAGS_CF;\n\t\t\t\t\telse if (op >= 0xd8 && op <= 0xdf) /* escape opcodes */\n\t\t\t\t\t{\n\t\t\t\t\t\tif (op == 0xd8 || op == 0xdc)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (modrm.fields.reg == 0b000 || modrm.fields.reg == 0b001 || modrm.fields.reg == 0b100 || modrm.fields.reg == 0b101 || modrm.fields.reg == 0b110 || modrm.fields.reg == 0b111) /* fadd,fmul,fsub,fsubr,fdiv,fdivr */\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinstruction->modified_flags.fpu_flags = NMD_X86_FPU_FLAGS_C1;\n\t\t\t\t\t\t\t\tinstruction->undefined_flags.fpu_flags = NMD_X86_FPU_FLAGS_C0 | NMD_X86_FPU_FLAGS_C2 | NMD_X86_FPU_FLAGS_C3;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (modrm.fields.reg == 0b010 || modrm.fields.reg == 0b011) /* fcom,fcomp */\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinstruction->modified_flags.fpu_flags = NMD_X86_FPU_FLAGS_C0 | NMD_X86_FPU_FLAGS_C2 | NMD_X86_FPU_FLAGS_C3;\n\t\t\t\t\t\t\t\tinstruction->cleared_flags.fpu_flags = NMD_X86_FPU_FLAGS_C1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (op == 0xd9)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (modrm.fields.mod != 0b11)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (modrm.fields.reg == 0b000 || modrm.fields.reg == 0b010 || modrm.fields.reg == 0b011) /* fld,fst,fstp */\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tinstruction->modified_flags.fpu_flags = NMD_X86_FPU_FLAGS_C1;\n\t\t\t\t\t\t\t\t\tinstruction->undefined_flags.fpu_flags = NMD_X86_FPU_FLAGS_C0 | NMD_X86_FPU_FLAGS_C2 | NMD_X86_FPU_FLAGS_C3;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if (modrm.fields.reg == 0b100) /* fldenv */\n\t\t\t\t\t\t\t\t\tinstruction->modified_flags.fpu_flags = NMD_X86_FPU_FLAGS_C0 | NMD_X86_FPU_FLAGS_C1 | NMD_X86_FPU_FLAGS_C2 | NMD_X86_FPU_FLAGS_C3;\n\t\t\t\t\t\t\t\telse if (modrm.fields.reg == 0b101 || modrm.fields.reg == 0b110 || modrm.fields.reg == 0b111) /* fldcw,fstenv,fstcw */\n\t\t\t\t\t\t\t\t\tinstruction->undefined_flags.fpu_flags = NMD_X86_FPU_FLAGS_C0 | NMD_X86_FPU_FLAGS_C1 | NMD_X86_FPU_FLAGS_C2 | NMD_X86_FPU_FLAGS_C3;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (modrm.modrm < 0xc8) /* fld */\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tinstruction->modified_flags.fpu_flags = NMD_X86_FPU_FLAGS_C1;\n\t\t\t\t\t\t\t\t\tinstruction->undefined_flags.fpu_flags = NMD_X86_FPU_FLAGS_C0 | NMD_X86_FPU_FLAGS_C2 | NMD_X86_FPU_FLAGS_C3;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse /*if (modrm.modrm <= 0xcf)*/ /* fxch */\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tinstruction->cleared_flags.fpu_flags = NMD_X86_FPU_FLAGS_C1;\n\t\t\t\t\t\t\t\t\tinstruction->undefined_flags.fpu_flags = NMD_X86_FPU_FLAGS_C0 | NMD_X86_FPU_FLAGS_C2 | NMD_X86_FPU_FLAGS_C3;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (op == 0xda || op == 0xde)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (modrm.fields.mod != 0b11)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (modrm.fields.reg == 0b000 || modrm.fields.reg == 0b001 || modrm.fields.reg == 0b100 || modrm.fields.reg == 0b101 || modrm.fields.reg == 0b110 || modrm.fields.reg == 0b111) /* fiadd,fimul,fisub,fisubr,fidiv,fidivr */\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tinstruction->modified_flags.fpu_flags = NMD_X86_FPU_FLAGS_C1;\n\t\t\t\t\t\t\t\t\tinstruction->undefined_flags.fpu_flags = NMD_X86_FPU_FLAGS_C0 | NMD_X86_FPU_FLAGS_C2 | NMD_X86_FPU_FLAGS_C3;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse /*if (modrm.fields.reg == 0b010 || modrm.fields.reg == 0b011)*/ /* ficom,ficomp */\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tinstruction->cleared_flags.fpu_flags = NMD_X86_FPU_FLAGS_C1;\n\t\t\t\t\t\t\t\t\tinstruction->modified_flags.fpu_flags = NMD_X86_FPU_FLAGS_C0 | NMD_X86_FPU_FLAGS_C2 | NMD_X86_FPU_FLAGS_C3;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\n\t\t\t\t\t\t\t\tif ((op == 0xda && modrm.modrm == 0xe9) || (op == 0xde && modrm.modrm == 0xd9))\n\t\t\t\t\t\t\t\t\tinstruction->modified_flags.fpu_flags = NMD_X86_FPU_FLAGS_C0 | NMD_X86_FPU_FLAGS_C1 | NMD_X86_FPU_FLAGS_C2 | NMD_X86_FPU_FLAGS_C3;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tinstruction->modified_flags.fpu_flags = NMD_X86_FPU_FLAGS_C1;\n\t\t\t\t\t\t\t\t\tinstruction->undefined_flags.fpu_flags = NMD_X86_FPU_FLAGS_C0 | NMD_X86_FPU_FLAGS_C2 | NMD_X86_FPU_FLAGS_C3;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (op == 0xdb || op == 0xdd || op == 0xdf)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (modrm.fields.mod != 0b11)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (modrm.fields.reg == 0b000 || modrm.fields.reg == 0b010 || modrm.fields.reg == 0b011 || modrm.fields.reg == 0b101 || modrm.fields.reg == 0b111) /* fild,fist,fistp,fld,fstp */\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tinstruction->modified_flags.fpu_flags = NMD_X86_FPU_FLAGS_C1;\n\t\t\t\t\t\t\t\t\tinstruction->undefined_flags.fpu_flags = NMD_X86_FPU_FLAGS_C0 | NMD_X86_FPU_FLAGS_C2 | NMD_X86_FPU_FLAGS_C3;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if (modrm.fields.reg == 0b001) /* fisttp */\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tinstruction->cleared_flags.fpu_flags = NMD_X86_FPU_FLAGS_C1;\n\t\t\t\t\t\t\t\t\tinstruction->undefined_flags.fpu_flags = NMD_X86_FPU_FLAGS_C0 | NMD_X86_FPU_FLAGS_C2 | NMD_X86_FPU_FLAGS_C3;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (modrm.fields.reg <= 0b011) /* fcmovnb,fcmovne,fcmovnbe,fcmovnu */\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tinstruction->modified_flags.fpu_flags = NMD_X86_FPU_FLAGS_C1;\n\t\t\t\t\t\t\t\t\tinstruction->undefined_flags.fpu_flags = NMD_X86_FPU_FLAGS_C0 | NMD_X86_FPU_FLAGS_C2 | NMD_X86_FPU_FLAGS_C3;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if (modrm.modrm == 0xe0 || modrm.modrm == 0xe2) /* fstsw,fclex */\n\t\t\t\t\t\t\t\t\tinstruction->undefined_flags.fpu_flags = NMD_X86_FPU_FLAGS_C0 | NMD_X86_FPU_FLAGS_C1 | NMD_X86_FPU_FLAGS_C2 | NMD_X86_FPU_FLAGS_C3;\n\t\t\t\t\t\t\t\telse if (modrm.modrm == 0xe3) /* finit */\n\t\t\t\t\t\t\t\t\tinstruction->cleared_flags.fpu_flags = NMD_X86_FPU_FLAGS_C0 | NMD_X86_FPU_FLAGS_C1 | NMD_X86_FPU_FLAGS_C2 | NMD_X86_FPU_FLAGS_C3;\n\t\t\t\t\t\t\t\telse /* fucomi,fcomi */\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tinstruction->cleared_flags.fpu_flags = NMD_X86_FPU_FLAGS_C1;\n\t\t\t\t\t\t\t\t\tinstruction->undefined_flags.fpu_flags = NMD_X86_FPU_FLAGS_C0 | NMD_X86_FPU_FLAGS_C2 | NMD_X86_FPU_FLAGS_C3;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xf5) /* cmc */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_CF;\n\t\t\t\t\t\tinstruction->tested_flags.eflags = NMD_X86_EFLAGS_CF;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xf8) /* clc */\n\t\t\t\t\t\tinstruction->cleared_flags.eflags = NMD_X86_EFLAGS_CF;\n\t\t\t\t\telse if (op == 0xf9) /* stc */\n\t\t\t\t\t\tinstruction->set_flags.eflags = NMD_X86_EFLAGS_CF;\n\t\t\t\t\telse if (op == 0xfa || op == 0xfb) /* cli,sti */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->modified_flags.eflags = NMD_X86_EFLAGS_IF | NMD_X86_EFLAGS_VIF;\n\t\t\t\t\t\tinstruction->tested_flags.eflags = NMD_X86_EFLAGS_IOPL;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xfc) /* cld */\n\t\t\t\t\t\tinstruction->cleared_flags.eflags = NMD_X86_EFLAGS_DF;\n\t\t\t\t\telse if (op == 0xfd) /* std */\n\t\t\t\t\t\tinstruction->set_flags.eflags = NMD_X86_EFLAGS_DF;\n\t\t\t\t}\n#endif /* NMD_ASSEMBLY_DISABLE_DECODER_CPU_FLAGS */\n\n#ifndef NMD_ASSEMBLY_DISABLE_DECODER_GROUP\n\t\t\t\t/* Parse the instruction's group. */\n\t\t\t\tif (flags & NMD_X86_DECODER_FLAGS_GROUP)\n\t\t\t\t{\n\t\t\t\t\tif (_NMD_R(op) == 7 || op == 0xe3)\n\t\t\t\t\t\tinstruction->group = NMD_GROUP_JUMP | NMD_GROUP_CONDITIONAL_BRANCH | NMD_GROUP_RELATIVE_ADDRESSING;\n\t\t\t\t\telse if (op == 0xe9 || op == 0xea || op == 0xeb || (op == 0xff && (modrm.fields.reg == 0b100 || modrm.fields.reg == 0b101)))\n\t\t\t\t\t\tinstruction->group = NMD_GROUP_JUMP | NMD_GROUP_UNCONDITIONAL_BRANCH | (op == 0xe9 || op == 0xeb ? NMD_GROUP_RELATIVE_ADDRESSING : 0);\n\t\t\t\t\telse if (op == 0x9a || op == 0xe8 || (op == 0xff && (modrm.fields.reg == 0b010 || modrm.fields.reg == 0b011)))\n\t\t\t\t\t\tinstruction->group = NMD_GROUP_CALL | NMD_GROUP_UNCONDITIONAL_BRANCH | (op == 0xe8 ? NMD_GROUP_RELATIVE_ADDRESSING : 0);\n\t\t\t\t\telse if (op == 0xc2 || op == 0xc3 || op == 0xca || op == 0xcb)\n\t\t\t\t\t\tinstruction->group = NMD_GROUP_RET;\n\t\t\t\t\telse if ((op >= 0xcc && op <= 0xce) || op == 0xf1)\n\t\t\t\t\t\tinstruction->group = NMD_GROUP_INT;\n\t\t\t\t\telse if (op == 0xf4)\n\t\t\t\t\t\tinstruction->group = NMD_GROUP_PRIVILEGE;\n\t\t\t\t\telse if (op == 0xc7 && modrm.modrm == 0xf8)\n\t\t\t\t\t\tinstruction->group = NMD_GROUP_UNCONDITIONAL_BRANCH | NMD_GROUP_RELATIVE_ADDRESSING;\n\t\t\t\t\telse if (op >= 0xe0 && op <= 0xe2)\n\t\t\t\t\t\tinstruction->group = NMD_GROUP_CONDITIONAL_BRANCH | NMD_GROUP_RELATIVE_ADDRESSING;\n\t\t\t\t\telse if (op == 0x8d && mode == NMD_X86_MODE_64)\n\t\t\t\t\t\tinstruction->group = NMD_GROUP_RELATIVE_ADDRESSING;\n\t\t\t\t\telse if(op == 0xcf)\n\t\t\t\t\t\tinstruction->group = NMD_GROUP_RET | NMD_GROUP_INT;\n\t\t\t\t}\n#endif /* NMD_ASSEMBLY_DISABLE_DECODER_GROUP */\n\n#ifndef NMD_ASSEMBLY_DISABLE_DECODER_OPERANDS\n\t\t\t\tif (flags & NMD_X86_DECODER_FLAGS_OPERANDS)\n\t\t\t\t{\n\t\t\t\t\tif (op >= 0xd8 && op <= 0xdf)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (modrm.fields.mod == 0b11)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ((op == 0xd9 && (_NMD_R(modrm.modrm) == 0xc || (op >= 0xc8 && op <= 0xcf))) ||\n\t\t\t\t\t\t\t\t(op == 0xda && _NMD_R(modrm.modrm) <= 0xd) ||\n\t\t\t\t\t\t\t\t(op == 0xdb && (_NMD_R(modrm.modrm) <= 0xd || modrm.modrm >= 0xe8)) ||\n\t\t\t\t\t\t\t\t(op == 0xde && modrm.modrm != 0xd9) ||\n\t\t\t\t\t\t\t\t(op == 0xdf && modrm.modrm != 0xe0))\n\t\t\t\t\t\t\t\tinstruction->num_operands = 2;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tinstruction->num_operands = 1;\n\t\t\t\t\t}\n\t\t\t\t\telse if ((_NMD_R(op) < 4 && op % 8 <= 5) || (_NMD_R(op) >= 8 && _NMD_R(op) <= 0xa && op != 0x8f && op != 0x90 && !(op >= 0x98 && op <= 0x9f)) || op == 0x62 || op == 0x63 || (op >= 0x6c && op <= 0x6f) || op == 0xc0 || op == 0xc1 || (op >= 0xc4 && op <= 0xc8) || (op >= 0xd0 && op <= 0xd3) || (_NMD_R(op) == 0xe && op % 8 >= 4))\n\t\t\t\t\t\tinstruction->num_operands = 2;\n\t\t\t\t\telse if (_NMD_R(op) == 4 || op == 0x8f || op == 0x9a || op == 0xd4 || op == 0xd5 || (_NMD_R(op) == 0xe && op % 8 <= 3 && op != 0xe9))\n\t\t\t\t\t\tinstruction->num_operands = 1;\n\t\t\t\t\telse if (op == 0x69 || op == 0x6b)\n\t\t\t\t\t\tinstruction->num_operands = 3;\n\t\t\t\t\t\n\t\t\t\t\tconst bool opszprfx = instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE;\n\t\t\t\t\tif (_NMD_R(op) == 0xb) /* mov reg,imm */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->num_operands = 2;\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[0], false, NMD_X86_OPERAND_ACTION_WRITE, (op < 0xb8 ? (instruction->prefixes & NMD_X86_PREFIXES_REX_B ? NMD_X86_REG_R8B : NMD_X86_REG_AL) : (instruction->prefixes & NMD_X86_PREFIXES_REX_W ? (instruction->prefixes & NMD_X86_PREFIXES_REX_B ? NMD_X86_REG_R8 : NMD_X86_REG_RAX) : (instruction->prefixes & NMD_X86_PREFIXES_REX_B ? NMD_X86_REG_R8D : NMD_X86_REG_EAX))) + op % 8);\n\t\t\t\t\t\t_NMD_SET_IMM_OPERAND(instruction->operands[1], false, NMD_X86_OPERAND_ACTION_READ, instruction->immediate);\n\t\t\t\t\t}\n\t\t\t\t\telse if (_NMD_R(op) == 5) /* push reg,pop reg */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->num_operands = 3;\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[0], false, _NMD_C(op) < 8 ? NMD_X86_OPERAND_ACTION_READ : NMD_X86_OPERAND_ACTION_WRITE, (instruction->prefixes & NMD_X86_PREFIXES_REX_B ? (opszprfx ? NMD_X86_REG_R8W : NMD_X86_REG_R8) : (opszprfx ? (instruction->mode == NMD_X86_MODE_16 ? NMD_X86_REG_EAX : NMD_X86_REG_AX) : (NMD_X86_REG_AX + (instruction->mode >> 2) * 8))) + (op % 8));\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[1], true, NMD_X86_OPERAND_ACTION_READWRITE, _NMD_GET_GPR(NMD_X86_REG_SP));\n\t\t\t\t\t\t_NMD_SET_MEM_OPERAND(instruction->operands[2], true, _NMD_C(op) < 8 ? NMD_X86_OPERAND_ACTION_WRITE : NMD_X86_OPERAND_ACTION_READ, NMD_X86_REG_SS, _NMD_GET_GPR(NMD_X86_REG_SP), NMD_X86_REG_NONE, 0, 0);\n\t\t\t\t\t}\n\t\t\t\t\telse if (_NMD_R(op) == 7) /* jCC */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->num_operands = 2;\n\t\t\t\t\t\t_NMD_SET_IMM_OPERAND(instruction->operands[0], false, NMD_X86_OPERAND_ACTION_READ, instruction->immediate);\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[1], true, NMD_X86_OPERAND_ACTION_READWRITE, _NMD_GET_IP());\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xe9) /* jmp rel16,rel32 */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->num_operands = 2;\n\t\t\t\t\t\t_NMD_SET_IMM_OPERAND(instruction->operands[0], false, NMD_X86_OPERAND_ACTION_READ, instruction->immediate);\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[1], true, NMD_X86_OPERAND_ACTION_READWRITE, _NMD_GET_IP());\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x6a || op == 0x68) /* push imm8,push imm32/imm16 */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->num_operands = 3;\n\t\t\t\t\t\t_NMD_SET_IMM_OPERAND(instruction->operands[0], false, NMD_X86_OPERAND_ACTION_READ, instruction->immediate);\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[1], true, NMD_X86_OPERAND_ACTION_READWRITE, _NMD_GET_GPR(NMD_X86_REG_SP));\n\t\t\t\t\t\t_NMD_SET_MEM_OPERAND(instruction->operands[2], true, NMD_X86_OPERAND_ACTION_WRITE, NMD_X86_REG_SS, _NMD_GET_GPR(NMD_X86_REG_SP), NMD_X86_REG_NONE, 0, 0);\n\t\t\t\t\t}\n\t\t\t\t\telse if (_NMD_R(op) == 4) /* inc,dec*/\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->num_operands = 1;\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[0], false, NMD_X86_OPERAND_ACTION_READWRITE, _NMD_GET_BY_MODE_OPSZPRFX(mode, opszprfx, NMD_X86_REG_AX, NMD_X86_REG_EAX) + (op % 8));\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xcc || op == 0xf1 || op == 0xce) /* int3,int1,into */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->num_operands = 1;\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[0], true, NMD_X86_OPERAND_ACTION_WRITE, _NMD_GET_IP());\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xcd) /* int n */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->num_operands = 2;\n\t\t\t\t\t\t_NMD_SET_IMM_OPERAND(instruction->operands[0], false, NMD_X86_OPERAND_ACTION_READ, instruction->immediate);\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[1], true, NMD_X86_OPERAND_ACTION_WRITE, _NMD_GET_IP());\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xe8) /* call rel32 */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->num_operands = 4;\n\t\t\t\t\t\t_NMD_SET_IMM_OPERAND(instruction->operands[0], false, NMD_X86_OPERAND_ACTION_READ, instruction->immediate);\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[1], true, NMD_X86_OPERAND_ACTION_READWRITE, _NMD_GET_IP());\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[2], true, NMD_X86_OPERAND_ACTION_READWRITE, _NMD_GET_GPR(NMD_X86_REG_SP));\n\t\t\t\t\t\t_NMD_SET_MEM_OPERAND(instruction->operands[3], true, NMD_X86_OPERAND_ACTION_WRITE, NMD_X86_REG_SS, _NMD_GET_GPR(NMD_X86_REG_SP), NMD_X86_REG_NONE, 0, 0);\n\t\t\t\t\t}\n                    else if (_NMD_R(op) < 4 && _NMD_C(op) < 6) /* add,adc,and,xor,or,sbb,sub,cmp Eb,Gb / Ev,Gv / Gb,Eb / Gv,Ev / AL,lb / rAX,lz */\n\t\t\t\t\t{\n                        /*\n                        if (op % 8 == 0)\n                        {\n                            if (modrm.mod == 0b11)\n                            {\n                                \n                            }\n                            else\n                            {\n                                _nmd_decode_modrm_upper32(instruction, &instruction->operands[0]);\n                            }\n                        }\n                        */\n\t\t\t\t\t\tif (op % 8 == 0 || op % 8 == 2)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t_nmd_decode_operand_Eb(instruction, &instruction->operands[op % 8 == 0 ? 0 : 1]);\n\t\t\t\t\t\t\t_nmd_decode_operand_Gb(instruction, &instruction->operands[op % 8 == 0 ? 1 : 0]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (op % 8 == 1 || op % 8 == 3)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t_nmd_decode_operand_Ev(instruction, &instruction->operands[op % 8 == 1 ? 0 : 1]);\n\t\t\t\t\t\t\t_nmd_decode_operand_Gv(instruction, &instruction->operands[op % 8 == 1 ? 1 : 0]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (op % 8 == 4 || op % 8 == 5)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tinstruction->operands[0].type = NMD_X86_OPERAND_TYPE_REGISTER;\n\t\t\t\t\t\t\tif (op % 8 == 4)\n\t\t\t\t\t\t\t\tinstruction->operands[0].fields.reg = NMD_X86_REG_AL;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tinstruction->operands[0].fields.reg = (uint8_t)(instruction->rex_w_prefix ? NMD_X86_REG_RAX : (instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_REG_AX : NMD_X86_REG_EAX));\n\n\t\t\t\t\t\t\tinstruction->operands[1].type = NMD_X86_OPERAND_TYPE_IMMEDIATE;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tinstruction->operands[0].action = instruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t\t\tif (!(_NMD_R(op) == 3 && _NMD_C(op) >= 8))\n\t\t\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_READWRITE;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xc3 || op == 0xcb || op == 0xcf) /* ret,retf,iret,iretd,iretf */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->num_operands = 3;\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[0], true, NMD_X86_OPERAND_ACTION_WRITE, _NMD_GET_IP());\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[1], true, NMD_X86_OPERAND_ACTION_READWRITE, _NMD_GET_GPR(NMD_X86_REG_SP));\n\t\t\t\t\t\t_NMD_SET_MEM_OPERAND(instruction->operands[2], true, NMD_X86_OPERAND_ACTION_READ, NMD_X86_REG_SS, _NMD_GET_GPR(NMD_X86_REG_SP), NMD_X86_REG_NONE, 0, 0);\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xc2 || op == 0xca) /* ret imm16,retf imm16 */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->num_operands = 4;\n\t\t\t\t\t\t_NMD_SET_IMM_OPERAND(instruction->operands[0], false, NMD_X86_OPERAND_ACTION_READ, instruction->immediate);\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[1], true, NMD_X86_OPERAND_ACTION_WRITE, _NMD_GET_IP());\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[2], true, NMD_X86_OPERAND_ACTION_READWRITE, _NMD_GET_GPR(NMD_X86_REG_SP));\n\t\t\t\t\t\t_NMD_SET_MEM_OPERAND(instruction->operands[3], true, NMD_X86_OPERAND_ACTION_READ, NMD_X86_REG_SS, _NMD_GET_GPR(NMD_X86_REG_SP), NMD_X86_REG_NONE, 0, 0);\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xff && modrm.fields.reg == 6) /* push mem */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->num_operands = 3;\n\t\t\t\t\t\t_NMD_SET_MEM_OPERAND(instruction->operands[0], false, NMD_X86_OPERAND_ACTION_READ, NMD_X86_REG_DS, (instruction->prefixes& NMD_X86_PREFIXES_REX_B ? (opszprfx ? NMD_X86_REG_R8W : NMD_X86_REG_R8) : (opszprfx ? (instruction->mode == NMD_X86_MODE_16 ? NMD_X86_REG_EAX : NMD_X86_REG_AX) : (NMD_X86_REG_AX + (instruction->mode >> 2) * 8))) + modrm.fields.rm, NMD_X86_REG_NONE, 0, 0);\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[1], true, NMD_X86_OPERAND_ACTION_READWRITE, _NMD_GET_GPR(NMD_X86_REG_SP));\n\t\t\t\t\t\t_NMD_SET_MEM_OPERAND(instruction->operands[2], true, NMD_X86_OPERAND_ACTION_WRITE, NMD_X86_REG_SS, _NMD_GET_GPR(NMD_X86_REG_SP), NMD_X86_REG_NONE, 0, 0);\n\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x9c) /* pushf,pushfd,pushfq */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->num_operands = 2;\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[0], true, NMD_X86_OPERAND_ACTION_READWRITE, _NMD_GET_GPR(NMD_X86_REG_SP));\n\t\t\t\t\t\t_NMD_SET_MEM_OPERAND(instruction->operands[1], true, NMD_X86_OPERAND_ACTION_WRITE, NMD_X86_REG_SS, _NMD_GET_GPR(NMD_X86_REG_SP), NMD_X86_REG_NONE, 0, 0);\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x9d) /* popf,popfd,popfq */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->num_operands = 2;\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[0], true, NMD_X86_OPERAND_ACTION_READWRITE, _NMD_GET_GPR(NMD_X86_REG_SP));\n\t\t\t\t\t\t_NMD_SET_MEM_OPERAND(instruction->operands[1], true, NMD_X86_OPERAND_ACTION_READ, NMD_X86_REG_SS, _NMD_GET_GPR(NMD_X86_REG_SP), NMD_X86_REG_NONE, 0, 0);\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xc9) /* leave */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->num_operands = 3;\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[0], true, NMD_X86_OPERAND_ACTION_READWRITE, _NMD_GET_GPR(NMD_X86_REG_SP));\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[1], true, NMD_X86_OPERAND_ACTION_READWRITE, _NMD_GET_GPR(NMD_X86_REG_BP));\n\t\t\t\t\t\t_NMD_SET_MEM_OPERAND(instruction->operands[2], true, NMD_X86_OPERAND_ACTION_READ, NMD_X86_REG_SS, _NMD_GET_GPR(NMD_X86_REG_SP), NMD_X86_REG_NONE, 0, 0);\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x06 || op == 0x16 || op == 0x0e || op == 0x1e) /* push es,push ss,push ds,push cs */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->num_operands = 3;\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[0], false, NMD_X86_OPERAND_ACTION_READ, op == 0x06 ? NMD_X86_REG_ES : (op == 0x16 ? NMD_X86_REG_SS : (op == 0x1e ? NMD_X86_REG_DS : NMD_X86_REG_CS)));\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[1], true, NMD_X86_OPERAND_ACTION_READWRITE, _NMD_GET_GPR(NMD_X86_REG_SP));\n\t\t\t\t\t\t_NMD_SET_MEM_OPERAND(instruction->operands[2], true, NMD_X86_OPERAND_ACTION_WRITE, NMD_X86_REG_SS, _NMD_GET_GPR(NMD_X86_REG_SP), NMD_X86_REG_NONE, 0, 0);\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x07 || op == 0x17 || op == 0x1f) /* pop es,pop ss,pop ds */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->num_operands = 3;\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[0], false, NMD_X86_OPERAND_ACTION_WRITE, op == 0x07 ? NMD_X86_REG_ES : (op == 0x17 ? NMD_X86_REG_SS : NMD_X86_REG_DS));\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[1], true, NMD_X86_OPERAND_ACTION_READWRITE, _NMD_GET_GPR(NMD_X86_REG_SP));\n\t\t\t\t\t\t_NMD_SET_MEM_OPERAND(instruction->operands[2], true, NMD_X86_OPERAND_ACTION_READ, NMD_X86_REG_SS, _NMD_GET_GPR(NMD_X86_REG_SP), NMD_X86_REG_NONE, 0, 0);\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x60) /* pusha,pushad */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->num_operands = 10;\n\t\t\t\t\t\tconst uint32_t base_reg = _NMD_GET_BY_MODE_OPSZPRFX(mode, opszprfx, NMD_X86_REG_AX, NMD_X86_REG_EAX);\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[0], true, NMD_X86_OPERAND_ACTION_READ, base_reg + 0);\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[1], true, NMD_X86_OPERAND_ACTION_READ, base_reg + 1);\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[2], true, NMD_X86_OPERAND_ACTION_READ, base_reg + 2);\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[3], true, NMD_X86_OPERAND_ACTION_READ, base_reg + 3);\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[4], true, NMD_X86_OPERAND_ACTION_READ, base_reg + 4);\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[5], true, NMD_X86_OPERAND_ACTION_READ, base_reg + 5);\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[6], true, NMD_X86_OPERAND_ACTION_READ, base_reg + 6);\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[7], true, NMD_X86_OPERAND_ACTION_READ, base_reg + 7);\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[8], true, NMD_X86_OPERAND_ACTION_READWRITE, _NMD_GET_BY_MODE_OPSZPRFX(mode, opszprfx, NMD_X86_REG_SP, NMD_X86_REG_ESP));\n\t\t\t\t\t\t_NMD_SET_MEM_OPERAND(instruction->operands[9], true, NMD_X86_OPERAND_ACTION_WRITE, NMD_X86_REG_SS, _NMD_GET_BY_MODE_OPSZPRFX(mode, opszprfx, NMD_X86_REG_SP, NMD_X86_REG_ESP), NMD_X86_REG_NONE, 0, 0);\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x61) /* popa,popad */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->num_operands = 10;\n\t\t\t\t\t\tconst uint32_t base_reg = _NMD_GET_BY_MODE_OPSZPRFX(mode, opszprfx, NMD_X86_REG_AX, NMD_X86_REG_EAX);\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[0], true, NMD_X86_OPERAND_ACTION_WRITE, base_reg + 0);\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[1], true, NMD_X86_OPERAND_ACTION_WRITE, base_reg + 1);\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[2], true, NMD_X86_OPERAND_ACTION_WRITE, base_reg + 2);\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[3], true, NMD_X86_OPERAND_ACTION_WRITE, base_reg + 3);\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[4], true, NMD_X86_OPERAND_ACTION_WRITE, base_reg + 4);\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[5], true, NMD_X86_OPERAND_ACTION_WRITE, base_reg + 5);\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[6], true, NMD_X86_OPERAND_ACTION_WRITE, base_reg + 6);\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[7], true, NMD_X86_OPERAND_ACTION_WRITE, base_reg + 7);\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[8], true, NMD_X86_OPERAND_ACTION_READWRITE, _NMD_GET_BY_MODE_OPSZPRFX(mode, opszprfx, NMD_X86_REG_SP, NMD_X86_REG_ESP));\n\t\t\t\t\t\t_NMD_SET_MEM_OPERAND(instruction->operands[9], true, NMD_X86_OPERAND_ACTION_READ, NMD_X86_REG_SS, _NMD_GET_BY_MODE_OPSZPRFX(mode, opszprfx, NMD_X86_REG_SP, NMD_X86_REG_ESP), NMD_X86_REG_NONE, 0, 0);\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x27 || op == 0x2f) /* daa,das */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->num_operands = 1;\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[0], true, NMD_X86_OPERAND_ACTION_READWRITE, NMD_X86_REG_AL);\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x37 || op == 0x3f) /* aaa,aas */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->num_operands = 2;\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[0], true, NMD_X86_OPERAND_ACTION_READWRITE, NMD_X86_REG_AL);\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[1], true, NMD_X86_OPERAND_ACTION_READWRITE, NMD_X86_REG_AH);\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xd7) /* xlat */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->num_operands = 2;\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[0], true, NMD_X86_OPERAND_ACTION_WRITE, NMD_X86_REG_AL);\n\t\t\t\t\t\t_NMD_SET_MEM_OPERAND(instruction->operands[1], true, NMD_X86_OPERAND_ACTION_READ, NMD_X86_REG_DS, _NMD_GET_GPR(NMD_X86_REG_BX), NMD_X86_REG_AL, 1, 0);\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x9e || op == 0x9f) /* sahf,lahf */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->num_operands = 1;\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[0], true, op == 0x9e ? NMD_X86_OPERAND_ACTION_READ : NMD_X86_OPERAND_ACTION_WRITE, NMD_X86_REG_AH);\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x98) /* cbw,cwde,cdqe */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->num_operands = 2;\n\t\t\t\t\t\tconst NMD_X86_REG reg = instruction->mode == NMD_X86_MODE_64 && instruction->rex_w_prefix ? NMD_X86_REG_RAX : (((instruction->mode == NMD_X86_MODE_16 && instruction->simd_prefix & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE) || (instruction->mode != NMD_X86_MODE_16 && !(instruction->simd_prefix & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE))) ? NMD_X86_REG_EAX : NMD_X86_REG_AX);\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[0], true, NMD_X86_OPERAND_ACTION_WRITE, reg);\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[1], true, NMD_X86_OPERAND_ACTION_READ, reg-8);\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x99) /* cwd,cdq,cqo */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->num_operands = 2;\n\t\t\t\t\t\tconst NMD_X86_REG reg = instruction->mode == NMD_X86_MODE_64 && instruction->rex_w_prefix ? NMD_X86_REG_RAX : (((instruction->mode == NMD_X86_MODE_16 && instruction->simd_prefix & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE) || (instruction->mode != NMD_X86_MODE_16 && !(instruction->simd_prefix & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE))) ? NMD_X86_REG_EAX : NMD_X86_REG_AX);\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[0], true, NMD_X86_OPERAND_ACTION_WRITE, reg + 2);\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[1], true, NMD_X86_OPERAND_ACTION_READ, reg);\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xd6) /* salc */\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->num_operands = 1;\n\t\t\t\t\t\t_NMD_SET_REG_OPERAND(instruction->operands[0], true, NMD_X86_OPERAND_ACTION_WRITE, NMD_X86_REG_AL);\n\t\t\t\t\t}\n                    else if (op == 0xc7 && modrm.fields.reg == 0b000) /* mov Ev,lz */\n                    {\n                        instruction->num_operands = 2;\n                        if (modrm.fields.mod == 0b11)\n                        {\n                            const NMD_X86_REG reg = (NMD_X86_REG)(_NMD_GET_BY_MODE_OPSZPRFX_W64(mode, opszprfx, instruction->rex_w_prefix, NMD_X86_REG_AX, NMD_X86_REG_EAX, NMD_X86_REG_RAX) + modrm.fields.rm);\n                            _NMD_SET_REG_OPERAND(instruction->operands[0], false, NMD_X86_OPERAND_ACTION_WRITE, reg);\n                        }\n                        else\n                        {\n                            _nmd_decode_modrm_upper32(instruction, &instruction->operands[0]);\n                            instruction->operands[0].is_implicit = false;\n                            instruction->operands[0].action = NMD_X86_OPERAND_ACTION_WRITE;\n                        }\n                        _NMD_SET_IMM_OPERAND(instruction->operands[1], false, NMD_X86_OPERAND_ACTION_READ, instruction->immediate);\t\t\t\t\t\t\n                    }\n\t\t\t\t\telse if (op >= 0x84 && op <= 0x8b)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (op % 2 == 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t_nmd_decode_operand_Eb(instruction, &instruction->operands[op == 0x8a ? 1 : 0]);\n\t\t\t\t\t\t\t_nmd_decode_operand_Gb(instruction, &instruction->operands[op == 0x8a ? 0 : 1]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t_nmd_decode_operand_Ev(instruction, &instruction->operands[op == 0x8b ? 1 : 0]);\n\t\t\t\t\t\t\t_nmd_decode_operand_Gv(instruction, &instruction->operands[op == 0x8b ? 0 : 1]);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (op >= 0x88)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_WRITE;\n\t\t\t\t\t\t\tinstruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (op >= 0x86)\n\t\t\t\t\t\t\tinstruction->operands[0].action = instruction->operands[1].action = NMD_X86_OPERAND_ACTION_READWRITE;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op >= 0x80 && op <= 0x83)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (op % 2 == 0)\n\t\t\t\t\t\t\t_nmd_decode_operand_Eb(instruction, &instruction->operands[0]);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t_nmd_decode_operand_Ev(instruction, &instruction->operands[0]);\n\t\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_READWRITE;\n\t\t\t\t\t\tinstruction->operands[1].type = NMD_X86_OPERAND_TYPE_IMMEDIATE;\n\t\t\t\t\t}\n\t\t\t\t\telse if (_NMD_R(op) == 7 || op == 0x9a || op == 0xcd || op == 0xd4 || op == 0xd5)\n\t\t\t\t\t\tinstruction->operands[0].type = NMD_X86_OPERAND_TYPE_IMMEDIATE;\n\t\t\t\t\telse if (op == 0x90 && instruction->prefixes & NMD_X86_PREFIXES_REX_B)\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->operands[0].type = instruction->operands[1].type = NMD_X86_OPERAND_TYPE_REGISTER;\n\t\t\t\t\t\tinstruction->operands[0].fields.reg = (uint8_t)(instruction->prefixes & NMD_X86_PREFIXES_REX_W ? NMD_X86_REG_R8 : NMD_X86_REG_R8D);\n\t\t\t\t\t\tinstruction->operands[1].fields.reg = (uint8_t)(instruction->prefixes & NMD_X86_PREFIXES_REX_W ? NMD_X86_REG_RAX : NMD_X86_REG_EAX);\n\t\t\t\t\t}\n\t\t\t\t\telse if (_NMD_R(op) == 5)\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->operands[0].type = NMD_X86_OPERAND_TYPE_REGISTER;\n\t\t\t\t\t\tinstruction->operands[0].fields.reg = (uint8_t)((instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_REG_AX : (mode == NMD_X86_MODE_64 ? NMD_X86_REG_RAX : NMD_X86_REG_EAX)) + (op % 8));\n\t\t\t\t\t\tinstruction->operands[0].action = (uint8_t)(_NMD_C(op) < 8 ? NMD_X86_OPERAND_ACTION_READ : NMD_X86_OPERAND_ACTION_WRITE);\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x62)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_decode_operand_Gv(instruction, &instruction->operands[0]);\n\t\t\t\t\t\t_nmd_decode_modrm_upper32(instruction, &instruction->operands[1]);\n\t\t\t\t\t\tinstruction->operands[0].action = instruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x63)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (mode == NMD_X86_MODE_64)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t_nmd_decode_operand_Gv(instruction, &instruction->operands[0]);\n\t\t\t\t\t\t\t_nmd_decode_operand_Ev(instruction, &instruction->operands[1]);\n\t\t\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_WRITE;\n\t\t\t\t\t\t\tinstruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinstruction->operands[0].type = NMD_X86_OPERAND_TYPE_REGISTER;\n\t\t\t\t\t\t\t\tinstruction->operands[0].fields.reg = NMD_X86_REG_AX + instruction->modrm.fields.rm;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t_nmd_decode_modrm_upper32(instruction, &instruction->operands[0]);\n\n\t\t\t\t\t\t\tinstruction->operands[1].type = NMD_X86_OPERAND_TYPE_REGISTER;\n\t\t\t\t\t\t\tinstruction->operands[1].fields.reg = NMD_X86_REG_AX + instruction->modrm.fields.reg;\n\t\t\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_READWRITE;\n\t\t\t\t\t\t\tinstruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x69 || op == 0x6b)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_decode_operand_Gv(instruction, &instruction->operands[0]);\n\t\t\t\t\t\t_nmd_decode_operand_Ev(instruction, &instruction->operands[1]);\n\t\t\t\t\t\tinstruction->operands[2].type = NMD_X86_OPERAND_TYPE_IMMEDIATE;\n\t\t\t\t\t\tinstruction->operands[2].fields.imm = (int64_t)(instruction->immediate);\n\t\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_WRITE;\n\t\t\t\t\t\tinstruction->operands[1].action = instruction->operands[2].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x8c)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_decode_operand_Ev(instruction, &instruction->operands[0]);\n\t\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_WRITE;\n\t\t\t\t\t\tinstruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t\t\tinstruction->operands[1].type = NMD_X86_OPERAND_TYPE_REGISTER;\n\t\t\t\t\t\tinstruction->operands[1].fields.reg = NMD_X86_REG_ES + instruction->modrm.fields.reg;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x8d)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_decode_operand_Gv(instruction, &instruction->operands[0]);\n\t\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_WRITE;\n\t\t\t\t\t\tinstruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t\t\t_nmd_decode_modrm_upper32(instruction, &instruction->operands[1]);\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x8e)\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->operands[0].type = NMD_X86_OPERAND_TYPE_REGISTER;\n\t\t\t\t\t\tinstruction->operands[0].fields.reg = NMD_X86_REG_ES + instruction->modrm.fields.reg;\n\t\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_WRITE;\n\t\t\t\t\t\tinstruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t\t\t_nmd_decode_operand_Ew(instruction, &instruction->operands[1]);\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x8f)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_decode_operand_Ev(instruction, &instruction->operands[0]);\n\t\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_WRITE;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op >= 0x91 && op <= 0x97)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_decode_operand_Gv(instruction, &instruction->operands[0]);\n\t\t\t\t\t\tinstruction->operands[0].fields.reg = instruction->operands[0].fields.reg + _NMD_C(op);\n\t\t\t\t\t\tinstruction->operands[1].type = NMD_X86_OPERAND_TYPE_REGISTER;\n\t\t\t\t\t\tinstruction->operands[1].fields.reg = (uint8_t)(instruction->rex_w_prefix ? NMD_X86_REG_RAX : (instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE && mode != NMD_X86_MODE_16 ? NMD_X86_REG_AX : NMD_X86_REG_EAX));\n\t\t\t\t\t\tinstruction->operands[0].action = instruction->operands[1].action = NMD_X86_OPERAND_ACTION_READWRITE;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op >= 0xa0 && op <= 0xa3)\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->operands[op < 0xa2 ? 0 : 1].type = NMD_X86_OPERAND_TYPE_REGISTER;\n\t\t\t\t\t\tinstruction->operands[op < 0xa2 ? 0 : 1].fields.reg = (uint8_t)(op % 2 == 0 ? NMD_X86_REG_AL : (instruction->rex_w_prefix ? NMD_X86_REG_RAX : ((instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE && mode != NMD_X86_MODE_16) || (mode == NMD_X86_MODE_16 && !(instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)) ? NMD_X86_REG_AX : NMD_X86_REG_EAX)));\n\t\t\t\t\t\tinstruction->operands[op < 0xa2 ? 1 : 0].type = NMD_X86_OPERAND_TYPE_MEMORY;\n\t\t\t\t\t\t\n\t\t\t\t\t\t/* FIXME: We should not access the buffer from here\n\t\t\t\t\t\tinstruction->operands[op < 0xa2 ? 1 : 0].fields.mem.disp = (mode == NMD_X86_MODE_64) ? *(uint64_t*)(b + 1) : *(uint32_t*)(b + 1);\n\t\t\t\t\t\t*/\n\t\t\t\t\t\t\n\t\t\t\t\t\t_nmd_decode_operand_segment_reg(instruction, &instruction->operands[op < 0xa2 ? 1 : 0]);\n\t\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_WRITE;\n\t\t\t\t\t\tinstruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xa8 || op == 0xa9)\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->operands[0].type = NMD_X86_OPERAND_TYPE_REGISTER;\n\t\t\t\t\t\tinstruction->operands[0].fields.reg = (uint8_t)(op == 0xa8 ? NMD_X86_REG_AL : (instruction->rex_w_prefix ? NMD_X86_REG_RAX : ((instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE && mode != NMD_X86_MODE_16) || (mode == NMD_X86_MODE_16 && !(instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)) ? NMD_X86_REG_AX : NMD_X86_REG_EAX)));\n\t\t\t\t\t\tinstruction->operands[1].type = NMD_X86_OPERAND_TYPE_IMMEDIATE;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xc0 || op == 0xc1 || op == 0xc6)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!(op >= 0xc6 && instruction->modrm.fields.reg))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (op % 2 == 0)\n\t\t\t\t\t\t\t\t_nmd_decode_operand_Eb(instruction, &instruction->operands[0]);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t_nmd_decode_operand_Ev(instruction, &instruction->operands[0]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tinstruction->operands[op >= 0xc6 && instruction->modrm.fields.reg ? 0 : 1].type = NMD_X86_OPERAND_TYPE_IMMEDIATE;\n\t\t\t\t\t\tinstruction->operands[0].action = (uint8_t)(op <= 0xc1 ? NMD_X86_OPERAND_ACTION_READWRITE : NMD_X86_OPERAND_ACTION_WRITE);\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\telse if (op == 0xc4 || op == 0xc5)\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->operands[0].type = NMD_X86_OPERAND_TYPE_REGISTER;\n\t\t\t\t\t\tinstruction->operands[0].fields.reg = (uint8_t)((instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_REG_AX : NMD_X86_REG_EAX) + instruction->modrm.fields.reg);\n\t\t\t\t\t\t_nmd_decode_modrm_upper32(instruction, &instruction->operands[1]);\n\t\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_WRITE;\n\t\t\t\t\t\tinstruction->operands[1].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xc8)\n\t\t\t\t\t{\n\t\t\t\t\t\tinstruction->operands[0].type = instruction->operands[1].type = NMD_X86_OPERAND_TYPE_IMMEDIATE;\n\t\t\t\t\t\t/* FIXME: We should not access the buffer from here\n\t\t\t\t\t\tinstruction->operands[0].fields.imm = *(uint16_t*)(b + 1);\n\t\t\t\t\t\tinstruction->operands[1].fields.imm = b[3];\n\t\t\t\t\t\t*/\n\t\t\t\t\t}\n\t\t\t\t\telse if (op >= 0xd0 && op <= 0xd3)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (op % 2 == 0)\n\t\t\t\t\t\t\t_nmd_decode_operand_Eb(instruction, &instruction->operands[0]);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t_nmd_decode_operand_Ev(instruction, &instruction->operands[0]);\n\n\t\t\t\t\t\tif (op < 0xd2)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tinstruction->operands[1].type = NMD_X86_OPERAND_TYPE_IMMEDIATE;\n\t\t\t\t\t\t\tinstruction->operands[1].fields.imm = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tinstruction->operands[1].type = NMD_X86_OPERAND_TYPE_REGISTER;\n\t\t\t\t\t\t\tinstruction->operands[1].fields.reg = NMD_X86_REG_CL;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tinstruction->operands[0].action = NMD_X86_OPERAND_ACTION_READWRITE;\n\t\t\t\t\t}\n\t\t\t\t\telse if (op >= 0xd8 && op <= 0xdf)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (instruction->modrm.fields.mod != 0b11 ||\n\t\t\t\t\t\t\top == 0xd8 ||\n\t\t\t\t\t\t\t(op == 0xd9 && _NMD_C(instruction->modrm.modrm) == 0xc) ||\n\t\t\t\t\t\t\t(op == 0xda && _NMD_C(instruction->modrm.modrm) <= 0xd) ||\n\t\t\t\t\t\t\t(op == 0xdb && (_NMD_C(instruction->modrm.modrm) <= 0xd || instruction->modrm.modrm >= 0xe8)) ||\n\t\t\t\t\t\t\top == 0xdc ||\n\t\t\t\t\t\t\top == 0xdd ||\n\t\t\t\t\t\t\t(op == 0xde && instruction->modrm.modrm != 0xd9) ||\n\t\t\t\t\t\t\t(op == 0xdf && instruction->modrm.modrm != 0xe0))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tinstruction->operands[0].type = instruction->operands[1].type = NMD_X86_OPERAND_TYPE_REGISTER;\n\t\t\t\t\t\t\tinstruction->operands[0].is_implicit = true;\n\t\t\t\t\t\t\tinstruction->operands[0].fields.reg = NMD_X86_REG_ST0;\n\t\t\t\t\t\t\tinstruction->operands[1].fields.reg = NMD_X86_REG_ST0 + instruction->modrm.fields.reg;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if (_NMD_R(op) == 0xe)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (op % 8 < 4)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tinstruction->operands[0].type = NMD_X86_OPERAND_TYPE_IMMEDIATE;\n\t\t\t\t\t\t\tinstruction->operands[0].fields.imm = (int64_t)(instruction->immediate);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (op < 0xe8)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinstruction->operands[0].type = (uint8_t)(_NMD_C(op) < 6 ? NMD_X86_OPERAND_TYPE_REGISTER : NMD_X86_OPERAND_TYPE_IMMEDIATE);\n\t\t\t\t\t\t\t\tinstruction->operands[1].type = (uint8_t)(_NMD_C(op) < 6 ? NMD_X86_OPERAND_TYPE_IMMEDIATE : NMD_X86_OPERAND_TYPE_REGISTER);\n\t\t\t\t\t\t\t\tinstruction->operands[0].fields.imm = instruction->operands[1].fields.imm = (int64_t)(instruction->immediate);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinstruction->operands[0].type = instruction->operands[1].type = NMD_X86_OPERAND_TYPE_REGISTER;\n\t\t\t\t\t\t\t\tinstruction->operands[0].fields.reg = instruction->operands[1].fields.reg = NMD_X86_REG_DX;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (op % 2 == 0)\n\t\t\t\t\t\t\t\tinstruction->operands[op % 8 == 4 ? 0 : 1].fields.reg = NMD_X86_REG_AL;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tinstruction->operands[op % 8 == 5 ? 0 : 1].fields.reg = (uint8_t)((instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? NMD_X86_REG_AX : NMD_X86_REG_EAX) + instruction->modrm.fields.reg);\n\n\t\t\t\t\t\t\tinstruction->operands[op % 8 <= 5 ? 0 : 1].action = NMD_X86_OPERAND_ACTION_WRITE;\n\t\t\t\t\t\t\tinstruction->operands[op % 8 <= 5 ? 1 : 0].action = NMD_X86_OPERAND_ACTION_READ;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xf6 || op == 0xfe)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_decode_operand_Eb(instruction, &instruction->operands[0]);\n\t\t\t\t\t\tinstruction->operands[0].action = (uint8_t)(op == 0xfe && instruction->modrm.fields.reg >= 0b010 ? NMD_X86_OPERAND_ACTION_READ : NMD_X86_OPERAND_ACTION_READWRITE);\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xf7 || op == 0xff)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_decode_operand_Ev(instruction, &instruction->operands[0]);\n\t\t\t\t\t\tinstruction->operands[0].action = (uint8_t)(op == 0xff && instruction->modrm.fields.reg >= 0b010 ? NMD_X86_OPERAND_ACTION_READ : NMD_X86_OPERAND_ACTION_READWRITE);\n\t\t\t\t\t}\n\t\t\t\t}\n#endif /* NMD_ASSEMBLY_DISABLE_DECODER_OPERANDS */\n\t\t\t}\n\t}\n\n\tif (instruction->prefixes & NMD_X86_PREFIXES_LOCK)\n\t{\n\t\tif (!(instruction->has_modrm && instruction->modrm.fields.mod != 0b11 &&\n\t\t\t((instruction->opcode_size == 1 && (op == 0x86 || op == 0x87 || (_NMD_R(op) < 4 && (op % 8) < 2 && op < 0x38) || ((op >= 0x80 && op <= 0x83) && instruction->modrm.fields.reg != 0b111) || (op >= 0xfe && instruction->modrm.fields.reg < 2) || ((op == 0xf6 || op == 0xf7) && (instruction->modrm.fields.reg == 0b010 || instruction->modrm.fields.reg == 0b011)))) ||\n\t\t\t\t(instruction->opcode_size == 2 && (_nmd_find_byte(_nmd_two_opcodes, sizeof(_nmd_two_opcodes), op) || op == 0xab || (op == 0xba && instruction->modrm.fields.reg != 0b100) || (op == 0xc7 && instruction->modrm.fields.reg == 0b001))))))\n\t\t\treturn false;\n\t}\n\n\tinstruction->length = (uint8_t)((ptrdiff_t)(b) - (ptrdiff_t)(buffer));\n\tfor (i = 0; i < instruction->length; i++)\n\t\tinstruction->buffer[i] = ((const uint8_t* const)(buffer))[i];\n\n\tinstruction->valid = true;\n\n\treturn true;\n}\n\nNMD_ASSEMBLY_API bool _nmd_ldisasm_decode_modrm(const uint8_t** p_buffer, size_t* p_buffer_size, bool address_prefix, NMD_X86_MODE mode, nmd_x86_modrm* p_modrm)\n{\n\t_NMD_READ_BYTE(*p_buffer, *p_buffer_size, (*p_modrm).modrm);\n    \n\tbool has_sib = false;\n\tsize_t disp_size = 0;\n\n\tif (mode == NMD_X86_MODE_16)\n\t{\n\t\tif (p_modrm->fields.mod != 0b11)\n\t\t{\n\t\t\tif (p_modrm->fields.mod == 0b00)\n\t\t\t{\n\t\t\t\tif (p_modrm->fields.rm == 0b110)\n\t\t\t\t\tdisp_size = 2;\n\t\t\t}\n\t\t\telse\n\t\t\t\tdisp_size = p_modrm->fields.mod == 0b01 ? 1 : 2;\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (address_prefix && mode == NMD_X86_MODE_32)\n\t\t{\n\t\t\tif ((p_modrm->fields.mod == 0b00 && p_modrm->fields.rm == 0b110) || p_modrm->fields.mod == 0b10)\n\t\t\t\tdisp_size = 2;\n\t\t\telse if (p_modrm->fields.mod == 0b01)\n\t\t\t\tdisp_size = 1;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t/* Check for SIB byte */\n\t\t\tuint8_t sib = 0;\n\t\t\tif (p_modrm->modrm < 0xC0 && p_modrm->fields.rm == 0b100 && (!address_prefix || (address_prefix && mode == NMD_X86_MODE_64)))\n\t\t\t{\n\t\t\t\thas_sib = true;\n                _NMD_READ_BYTE(*p_buffer, *p_buffer_size, sib);\n\t\t\t}\n\n\t\t\tif (p_modrm->fields.mod == 0b01) /* disp8 (ModR/M) */\n\t\t\t\tdisp_size = 1;\n\t\t\telse if ((p_modrm->fields.mod == 0b00 && p_modrm->fields.rm == 0b101) || p_modrm->fields.mod == 0b10) /* disp16,32 (ModR/M) */\n\t\t\t\tdisp_size = (address_prefix && !(mode == NMD_X86_MODE_64 && address_prefix) ? 2 : 4);\n\t\t\telse if (has_sib && (sib & 0b111) == 0b101) /* disp8,32 (SIB) */\n\t\t\t\tdisp_size = (p_modrm->fields.mod == 0b01 ? 1 : 4);\n\t\t}\n\t}\n    \n    /* Make sure we can read 'instruction->disp_mask' bytes from the buffer */\n    if (*p_buffer_size < disp_size)\n\t\treturn false;\n    \n    /* Increment the buffer and decrement the buffer's size */\n\t*p_buffer += disp_size;\n\t*p_buffer_size -= disp_size;\n\n\treturn true;\n}\n\n/*\nReturns the length of the instruction if it is valid, zero otherwise.\nParameters:\n - buffer      [in] A pointer to a buffer containing an encoded instruction.\n - buffer_size [in] The size of the buffer in bytes.\n - mode        [in] The architecture mode. 'NMD_X86_MODE_32', 'NMD_X86_MODE_64' or 'NMD_X86_MODE_16'.\n*/\nNMD_ASSEMBLY_API size_t nmd_x86_ldisasm(const void* const buffer, size_t buffer_size, const NMD_X86_MODE mode)\n{\n\tbool operand_prefix = false;\n\tbool address_prefix = false;\n\tbool repeat_prefix = false;\n\tbool repeat_not_zero_prefix = false;\n\tbool rexW = false;\n\tbool lock_prefix = false;\n\tuint16_t simd_prefix = NMD_X86_PREFIXES_NONE;\n\tuint8_t opcode_size = 0;\n\tbool has_modrm = false;\n\tnmd_x86_modrm modrm;\n    modrm.modrm = 0;\n    \n    /* Security considerations for memory safety:\n\tThe contents of 'buffer' should be considered untrusted and decoded carefully.\n\t\n\t'buffer' should always point to the start of the buffer. We use the 'b'\n\tbuffer iterator to read data from the buffer, however before accessing it\n\tmake sure to check 'buffer_size' to see if we can safely access it. Then,\n\tafter reading data from the buffer we increment 'b' and decrement 'buffer_size'.\n\tHelper macros: _NMD_READ_BYTE()\n\t*/\n    \n    /* Set buffer iterator */\n\tconst uint8_t* b = (const uint8_t*)buffer;\n    \n    /*  Clamp 'buffer_size' to 15. We will only read up to 15 bytes(NMD_X86_MAXIMUM_INSTRUCTION_LENGTH) */\n\tif (buffer_size > 15)\n\t\tbuffer_size = 15;\n\n\t/* Decode legacy and REX prefixes */\n\tfor (; buffer_size > 0; b++, buffer_size--)\n\t{\n\t\tswitch (*b)\n\t\t{\n\t\tcase 0xF0: lock_prefix = true; continue;\n\t\tcase 0xF2: repeat_not_zero_prefix = true, simd_prefix = NMD_X86_PREFIXES_REPEAT_NOT_ZERO; continue;\n\t\tcase 0xF3: repeat_prefix = true, simd_prefix = NMD_X86_PREFIXES_REPEAT; continue;\n\t\tcase 0x2E: continue;\n\t\tcase 0x36: continue;\n\t\tcase 0x3E: continue;\n\t\tcase 0x26: continue;\n\t\tcase 0x64: continue;\n\t\tcase 0x65: continue;\n\t\tcase 0x66: operand_prefix = true, simd_prefix = NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE; continue;\n\t\tcase 0x67: address_prefix = true; continue;\n\t\tdefault:\n\t\t\tif (mode == NMD_X86_MODE_64 && _NMD_R(*b) == 4) /* REX prefixes [0x40,0x4f] */\n\t\t\t{\n\t\t\t\tif(_NMD_C(*b) & 0b1000)\n\t\t\t\t\trexW = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tbreak;\n\t}\n\n\t/* Calculate the number of prefixes based on how much the iterator moved */\n\tconst size_t num_prefixes = (uint8_t)((ptrdiff_t)(b)-(ptrdiff_t)(buffer));\n    \n    /* Opcode byte. This variable is used because 'op' is simpler than 'instruction->opcode' */\n\tuint8_t op;\n\t_NMD_READ_BYTE(b, buffer_size, op);\n    \n\tif (op == 0x0F) /* 2 or 3 byte opcode */\n\t{\n\t\t_NMD_READ_BYTE(b, buffer_size, op);\n        \n\t\tif (op == 0x38 || op == 0x3A) /* 3 byte opcode */\n\t\t{\n\t\t\tconst bool is_opcode_map38 = op == 0x38;\n\t\t\topcode_size = 3;\n            \n            _NMD_READ_BYTE(b, buffer_size, op);\n            \n\t\t\tif (!_nmd_ldisasm_decode_modrm(&b, &buffer_size, address_prefix, mode, &modrm))\n\t\t\t\treturn 0;\n\t\t\thas_modrm = true;\n\n\t\t\tif (is_opcode_map38)\n\t\t\t{\n#ifndef NMD_ASSEMBLY_DISABLE_LENGTH_DISASSEMBLER_VALIDITY_CHECK\n\t\t\t\tif (op == 0x36)\n\t\t\t\t{\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\telse if (op <= 0xb || (op >= 0x1c && op <= 0x1e))\n\t\t\t\t{\n\t\t\t\t\tif (simd_prefix == NMD_X86_PREFIXES_REPEAT || simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO)\n\t\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\telse if (op >= 0xc8 && op <= 0xcd)\n\t\t\t\t{\n\t\t\t\t\tif (simd_prefix)\n\t\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\telse if (op == 0x10 || op == 0x14 || op == 0x15 || op == 0x17 || (op >= 0x20 && op <= 0x25) || op == 0x28 || op == 0x29 || op == 0x2b || _NMD_R(op) == 3 || op == 0x40 || op == 0x41 || op == 0xcf || (op >= 0xdb && op <= 0xdf))\n\t\t\t\t{\n\t\t\t\t\tif (simd_prefix != NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\telse if (op == 0x2a || (op >= 0x80 && op <= 0x82))\n\t\t\t\t{\n\t\t\t\t\tif (modrm.fields.mod == 0b11 || simd_prefix != NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\telse if (op == 0xf0 || op == 0xf1)\n\t\t\t\t{\n\t\t\t\t\tif (modrm.fields.mod == 0b11 && (simd_prefix == NMD_X86_PREFIXES_NONE || simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE))\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\telse if (simd_prefix == NMD_X86_PREFIXES_REPEAT)\n\t\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\telse if (op == 0xf5 || op == 0xf8)\n\t\t\t\t{\n\t\t\t\t\tif (simd_prefix != NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE || modrm.fields.mod == 0b11)\n\t\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\telse if (op == 0xf6)\n\t\t\t\t{\n\t\t\t\t\tif (simd_prefix == NMD_X86_PREFIXES_NONE && modrm.fields.mod == 0b11)\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\telse if (simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO)\n\t\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\telse if (op == 0xf9)\n\t\t\t\t{\n\t\t\t\t\tif (simd_prefix != NMD_X86_PREFIXES_NONE || modrm.fields.mod == 0b11)\n\t\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\treturn 0;\n#endif /* NMD_ASSEMBLY_DISABLE_LENGTH_DISASSEMBLER_VALIDITY_CHECK */\n\t\t\t}\n\t\t\telse /* 0x3a */\n\t\t\t{\n                /* \"Read\" the immediate byte */\n                uint8_t imm;\n                _NMD_READ_BYTE(b, buffer_size, imm);\n                \n#ifndef NMD_ASSEMBLY_DISABLE_LENGTH_DISASSEMBLER_VALIDITY_CHECK\n\t\t\t\tif ((op >= 0x8 && op <= 0xe) || (op >= 0x14 && op <= 0x17) || (op >= 0x20 && op <= 0x22) || (op >= 0x40 && op <= 0x42) || op == 0x44 || (op >= 0x60 && op <= 0x63) || op == 0xdf || op == 0xce || op == 0xcf)\n\t\t\t\t{\n\t\t\t\t\tif (simd_prefix != NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\telse if (op == 0x0f || op == 0xcc)\n\t\t\t\t{\n\t\t\t\t\tif (simd_prefix)\n\t\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\treturn 0;\n#endif /* NMD_ASSEMBLY_DISABLE_LENGTH_DISASSEMBLER_VALIDITY_CHECK */\n\t\t\t}\n\t\t}\n\t\telse if (op == 0x0f) /* 3DNow! opcode map*/\n\t\t{\n#ifndef NMD_ASSEMBLY_DISABLE_LENGTH_DISASSEMBLER_3DNOW\n\t\t\tif (!_nmd_ldisasm_decode_modrm(&b, &buffer_size, address_prefix, mode, &modrm))\n\t\t\t\treturn false;\n\t\t\t\n            uint8_t imm;\n\t\t\t_NMD_READ_BYTE(b, buffer_size, imm);\n            \n#ifndef NMD_ASSEMBLY_DISABLE_LENGTH_DISASSEMBLER_VALIDITY_CHECK\n\t\t\tif (!_nmd_find_byte(_nmd_valid_3DNow_opcodes, sizeof(_nmd_valid_3DNow_opcodes), imm))\n\t\t\t\treturn false;\n#endif /*NMD_ASSEMBLY_DISABLE_LENGTH_DISASSEMBLER_VALIDITY_CHECK */\n#else /* NMD_ASSEMBLY_DISABLE_LENGTH_DISASSEMBLER_3DNOW */\n\t\t\treturn false;\n#endif /* NMD_ASSEMBLY_DISABLE_LENGTH_DISASSEMBLER_3DNOW */\n\t\t}\n\t\telse /* 2 byte opcode. */\n\t\t{\n\t\t\topcode_size = 2;\n\n\t\t\t/* Check for ModR/M, SIB and displacement */\n\t\t\tif (op >= 0x20 && op <= 0x23)\n            {\t\t\t\t\n                has_modrm = true;\n                _NMD_READ_BYTE(b, buffer_size, modrm.modrm);\n            }\n\t\t\telse if (op < 4 || (_NMD_R(op) != 3 && _NMD_R(op) > 0 && _NMD_R(op) < 7) || (op >= 0xD0 && op != 0xFF) || (_NMD_R(op) == 7 && _NMD_C(op) != 7) || _NMD_R(op) == 9 || _NMD_R(op) == 0xB || (_NMD_R(op) == 0xC && _NMD_C(op) < 8) || (_NMD_R(op) == 0xA && (op % 8) >= 3) || op == 0x0ff || op == 0x00 || op == 0x0d)\n\t\t\t{\n\t\t\t\tif (!_nmd_ldisasm_decode_modrm(&b, &buffer_size, address_prefix, mode, &modrm))\n\t\t\t\t\treturn 0;\n\t\t\t\thas_modrm = true;\n\t\t\t}\n\n#ifndef NMD_ASSEMBLY_DISABLE_LENGTH_DISASSEMBLER_VALIDITY_CHECK\n\t\t\tif (_nmd_find_byte(_nmd_invalid_op2, sizeof(_nmd_invalid_op2), op))\n\t\t\t\treturn 0;\n\t\t\telse if (op == 0xc7)\n\t\t\t{\n\t\t\t\tif ((!simd_prefix && (modrm.fields.mod == 0b11 ? modrm.fields.reg <= 0b101 : modrm.fields.reg == 0b000 || modrm.fields.reg == 0b010)) || (simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO && (modrm.fields.mod == 0b11 || modrm.fields.reg != 0b001)) || ((simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE || simd_prefix == NMD_X86_PREFIXES_REPEAT) && (modrm.fields.mod == 0b11 ? modrm.fields.reg <= (simd_prefix == NMD_X86_PREFIXES_REPEAT ? 0b110 : 0b101) : (modrm.fields.reg != 0b001 && modrm.fields.reg != 0b110))))\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t\telse if (op == 0x00)\n\t\t\t{\n\t\t\t\tif (modrm.fields.reg >= 0b110)\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t\telse if (op == 0x01)\n\t\t\t{\n\t\t\t\tif ((modrm.fields.mod == 0b11 ? (( (simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE || simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO || simd_prefix == NMD_X86_PREFIXES_REPEAT) && ((modrm.modrm >= 0xc0 && modrm.modrm <= 0xc5) || (modrm.modrm >= 0xc8 && modrm.modrm <= 0xcb) || (modrm.modrm >= 0xcf && modrm.modrm <= 0xd1) || (modrm.modrm >= 0xd4 && modrm.modrm <= 0xd7) || modrm.modrm == 0xee || modrm.modrm == 0xef || modrm.modrm == 0xfa || modrm.modrm == 0xfb)) || (modrm.fields.reg == 0b000 && modrm.fields.rm >= 0b110) || (modrm.fields.reg == 0b001 && modrm.fields.rm >= 0b100 && modrm.fields.rm <= 0b110) || (modrm.fields.reg == 0b010 && (modrm.fields.rm == 0b010 || modrm.fields.rm == 0b011)) || (modrm.fields.reg == 0b101 && modrm.fields.rm < 0b110 && (!repeat_prefix || (simd_prefix == NMD_X86_PREFIXES_REPEAT && (modrm.fields.rm != 0b000 && modrm.fields.rm != 0b010)))) || (modrm.fields.reg == 0b111 && (modrm.fields.rm > 0b101 || (mode != NMD_X86_MODE_64 && modrm.fields.rm == 0b000)))) : (!repeat_prefix && modrm.fields.reg == 0b101)))\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t\telse if (op == 0x1A || op == 0x1B)\n\t\t\t{\n\t\t\t\tif (modrm.fields.mod == 0b11)\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t\telse if (op == 0x20 || op == 0x22)\n\t\t\t{\n\t\t\t\tif (modrm.fields.reg == 0b001 || modrm.fields.reg >= 0b101)\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t\telse if (op >= 0x24 && op <= 0x27)\n\t\t\t\treturn 0;\n\t\t\telse if (op >= 0x3b && op <= 0x3f)\n\t\t\t\treturn 0;\n\t\t\telse if (_NMD_R(op) == 5)\n\t\t\t{\n\t\t\t\tif ((op == 0x50 && modrm.fields.mod != 0b11) || (simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE && (op == 0x52 || op == 0x53)) || (simd_prefix == NMD_X86_PREFIXES_REPEAT && (op == 0x50 || (op >= 0x54 && op <= 0x57))) || (repeat_not_zero_prefix && (op == 0x50 || (op >= 0x52 && op <= 0x57) || op == 0x5b)))\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t\telse if (_NMD_R(op) == 6)\n\t\t\t{\n\t\t\t\tif ((!(simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE || simd_prefix == NMD_X86_PREFIXES_REPEAT || simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO) && (op == 0x6c || op == 0x6d)) || (simd_prefix == NMD_X86_PREFIXES_REPEAT && op != 0x6f) || repeat_not_zero_prefix)\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t\telse if (op == 0x78 || op == 0x79)\n\t\t\t{\n\t\t\t\tif ((((simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE && op == 0x78) && !(modrm.fields.mod == 0b11 && modrm.fields.reg == 0b000)) || ((simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE || simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO) && modrm.fields.mod != 0b11)) || (simd_prefix == NMD_X86_PREFIXES_REPEAT))\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t\telse if (op == 0x7c || op == 0x7d)\n\t\t\t{\n\t\t\t\tif (simd_prefix == NMD_X86_PREFIXES_REPEAT || !(simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE || simd_prefix == NMD_X86_PREFIXES_REPEAT || simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO))\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t\telse if (op == 0x7e || op == 0x7f)\n\t\t\t{\n\t\t\t\tif (repeat_not_zero_prefix)\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t\telse if (op >= 0x71 && op <= 0x73)\n\t\t\t{\n\t\t\t\tif ((simd_prefix == NMD_X86_PREFIXES_REPEAT || simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO) || modrm.modrm <= 0xcf || (modrm.modrm >= 0xe8 && modrm.modrm <= 0xef))\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t\telse if (op == 0x73)\n\t\t\t{\n\t\t\t\tif (modrm.modrm >= 0xe0 && modrm.modrm <= 0xe8)\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t\telse if (op == 0xa6)\n\t\t\t{\n\t\t\t\tif (modrm.modrm != 0xc0 && modrm.modrm != 0xc8 && modrm.modrm != 0xd0)\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t\telse if (op == 0xa7)\n\t\t\t{\n\t\t\t\tif (!(modrm.fields.mod == 0b11 && modrm.fields.reg <= 0b101 && modrm.fields.rm == 0b000))\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t\telse if (op == 0xae)\n\t\t\t{\n\t\t\t\tif (((!simd_prefix && modrm.fields.mod == 0b11 && modrm.fields.reg <= 0b100) || (simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO && !(modrm.fields.mod == 0b11 && modrm.fields.reg == 0b110)) || (simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE && (modrm.fields.reg < 0b110 || (modrm.fields.mod == 0b11 && modrm.fields.reg == 0b111))) || (simd_prefix == NMD_X86_PREFIXES_REPEAT && (modrm.fields.reg != 0b100 && modrm.fields.reg != 0b110) && !(modrm.fields.mod == 0b11 && modrm.fields.reg == 0b101))))\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t\telse if (op == 0xb8)\n\t\t\t{\n\t\t\t\tif (!repeat_prefix)\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t\telse if (op == 0xba)\n\t\t\t{\n\t\t\t\tif (modrm.fields.reg <= 0b011)\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t\telse if (op == 0xd0)\n\t\t\t{\n\t\t\t\tif (!simd_prefix || simd_prefix == NMD_X86_PREFIXES_REPEAT)\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t\telse if (op == 0xe0)\n\t\t\t{\n\t\t\t\tif (simd_prefix == NMD_X86_PREFIXES_REPEAT || simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO)\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t\telse if (op == 0xf0)\n\t\t\t{\n\t\t\t\tif (simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO ? modrm.fields.mod == 0b11 : true)\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t\telse if (simd_prefix == NMD_X86_PREFIXES_REPEAT || simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO)\n\t\t\t{\n\t\t\t\tif ((op >= 0x13 && op <= 0x17 && !(op == 0x16 && simd_prefix == NMD_X86_PREFIXES_REPEAT)) || op == 0x28 || op == 0x29 || op == 0x2e || op == 0x2f || (op <= 0x76 && op >= 0x74))\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t\telse if (op == 0x71 || op == 0x72 || (op == 0x73 && !(simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)))\n\t\t\t{\n\t\t\t\tif ((modrm.modrm >= 0xd8 && modrm.modrm <= 0xdf) || modrm.modrm >= 0xf8)\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t\telse if (op >= 0xc3 && op <= 0xc6)\n\t\t\t{\n\t\t\t\tif ((op == 0xc5 && modrm.fields.mod != 0b11) || (simd_prefix == NMD_X86_PREFIXES_REPEAT || simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO) || (op == 0xc3 && simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE))\n\t\t\t\t\treturn 0;\n\t\t\t}\n\t\t\telse if (_NMD_R(op) >= 0xd && _NMD_C(op) != 0 && op != 0xff && ((_NMD_C(op) == 6 && _NMD_R(op) != 0xf) ? (!simd_prefix || (_NMD_R(op) == 0xD && (simd_prefix == NMD_X86_PREFIXES_REPEAT || simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO) ? modrm.fields.mod != 0b11 : false)) : (simd_prefix == NMD_X86_PREFIXES_REPEAT || simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO || ((_NMD_C(op) == 7 && _NMD_R(op) != 0xe) ? modrm.fields.mod != 0b11 : false))))\n\t\t\t\treturn 0;\n\t\t\telse if (has_modrm && modrm.fields.mod == 0b11)\n\t\t\t{\n\t\t\t\tif (op == 0xb2 || op == 0xb4 || op == 0xb5 || op == 0xc3 || op == 0xe7 || op == 0x2b || (simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE && (op == 0x12 || op == 0x16)) || (!(simd_prefix == NMD_X86_PREFIXES_REPEAT || simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO) && (op == 0x13 || op == 0x17)))\n\t\t\t\t\treturn 0;\n\t\t\t}\n#endif /* NMD_ASSEMBLY_DISABLE_LENGTH_DISASSEMBLER_VALIDITY_CHECK */\n\n            uint8_t imm_mask = 0;\n\t\t\tif (_NMD_R(op) == 8) /* imm32 */\n\t\t\t\timm_mask = _NMD_GET_BY_MODE_OPSZPRFX_F64(mode, operand_prefix, 2, 4, 4);\n\t\t\telse if ((_NMD_R(op) == 7 && _NMD_C(op) < 4) || op == 0xA4 || op == 0xC2 || (op > 0xC3 && op <= 0xC6) || op == 0xBA || op == 0xAC) /* imm8 */\n\t\t\t\timm_mask = 1;\n\t\t\telse if (op == 0x78 && (repeat_not_zero_prefix || operand_prefix)) /* imm8 + imm8 = \"imm16\" */\n\t\t\t\timm_mask = 2;\n            \n            /* Make sure we can \"read\" 'imm_mask' bytes from the buffer */\n            if (buffer_size < imm_mask)\n                return false;\n            \n            /* Increment the buffer and decrement the buffer's size */\n            b += imm_mask;\n            buffer_size -= imm_mask;\n\t\t}\n\t}\n\telse /* 1 byte opcode */\n\t{\n\t\topcode_size = 1;\n\n\t\t/* Check for ModR/M, SIB and displacement */\n\t\tif (_NMD_R(op) == 8 || _nmd_find_byte(_nmd_op1_modrm, sizeof(_nmd_op1_modrm), op) || (_NMD_R(op) < 4 && (_NMD_C(op) < 4 || (_NMD_C(op) >= 8 && _NMD_C(op) < 0xC))) || (_NMD_R(op) == 0xD && _NMD_C(op) >= 8)/* || ((op == 0xc4 || op == 0xc5) && remaining_size > 1 && ((nmd_x86_modrm*)(b + 1))->fields.mod != 0b11)*/)\n\t\t{\n\t\t\tif (!_nmd_ldisasm_decode_modrm(&b, &buffer_size, address_prefix, mode, &modrm))\n\t\t\t\treturn 0;\n\t\t\thas_modrm = true;\n\t\t}\n\n#ifndef NMD_ASSEMBLY_DISABLE_LENGTH_DISASSEMBLER_VALIDITY_CHECK\n\t\tif (op == 0xC6 || op == 0xC7)\n\t\t{\n\t\t\tif ((modrm.fields.reg != 0b000 && modrm.fields.reg != 0b111) || (modrm.fields.reg == 0b111 && (modrm.fields.mod != 0b11 || modrm.fields.rm != 0b000)))\n\t\t\t\treturn 0;\n\t\t}\n\t\telse if (op == 0x8f)\n\t\t{\n\t\t\tif (modrm.fields.reg != 0b000)\n\t\t\t\treturn 0;\n\t\t}\n\t\telse if (op == 0xfe)\n\t\t{\n\t\t\tif (modrm.fields.reg >= 0b010)\n\t\t\t\treturn 0;\n\t\t}\n\t\telse if (op == 0xff)\n\t\t{\n\t\t\tif (modrm.fields.reg == 0b111 || (modrm.fields.mod == 0b11 && (modrm.fields.reg == 0b011 || modrm.fields.reg == 0b101)))\n\t\t\t\treturn 0;\n\t\t}\n\t\telse if (op == 0x8c)\n\t\t{\n\t\t\tif (modrm.fields.reg >= 0b110)\n\t\t\t\treturn 0;\n\t\t}\n\t\telse if (op == 0x8e)\n\t\t{\n\t\t\tif (modrm.fields.reg == 0b001 || modrm.fields.reg >= 0b110)\n\t\t\t\treturn 0;\n\t\t}\n\t\telse if (op == 0x62)\n\t\t{\n\t\t\tif (mode == NMD_X86_MODE_64)\n\t\t\t\treturn 0;\n\t\t}\n\t\telse if (op == 0x8d)\n\t\t{\n\t\t\tif (modrm.fields.mod == 0b11)\n\t\t\t\treturn 0;\n\t\t}\n\t\telse if (op == 0xc4 || op == 0xc5)\n\t\t{\n\t\t\tif (mode == NMD_X86_MODE_64 && has_modrm && modrm.fields.mod != 0b11)\n\t\t\t\treturn 0;\n\t\t}\n\t\telse if (op >= 0xd8 && op <= 0xdf)\n\t\t{\n\t\t\tswitch (op)\n\t\t\t{\n\t\t\tcase 0xd9:\n\t\t\t\tif ((modrm.fields.reg == 0b001 && modrm.fields.mod != 0b11) || (modrm.modrm > 0xd0 && modrm.modrm < 0xd8) || modrm.modrm == 0xe2 || modrm.modrm == 0xe3 || modrm.modrm == 0xe6 || modrm.modrm == 0xe7 || modrm.modrm == 0xef)\n\t\t\t\t\treturn 0;\n\t\t\t\tbreak;\n\t\t\tcase 0xda:\n\t\t\t\tif (modrm.modrm >= 0xe0 && modrm.modrm != 0xe9)\n\t\t\t\t\treturn 0;\n\t\t\t\tbreak;\n\t\t\tcase 0xdb:\n\t\t\t\tif (((modrm.fields.reg == 0b100 || modrm.fields.reg == 0b110) && modrm.fields.mod != 0b11) || (modrm.modrm >= 0xe5 && modrm.modrm <= 0xe7) || modrm.modrm >= 0xf8)\n\t\t\t\t\treturn 0;\n\t\t\t\tbreak;\n\t\t\tcase 0xdd:\n\t\t\t\tif ((modrm.fields.reg == 0b101 && modrm.fields.mod != 0b11) || _NMD_R(modrm.modrm) == 0xf)\n\t\t\t\t\treturn 0;\n\t\t\t\tbreak;\n\t\t\tcase 0xde:\n\t\t\t\tif (modrm.modrm == 0xd8 || (modrm.modrm >= 0xda && modrm.modrm <= 0xdf))\n\t\t\t\t\treturn 0;\n\t\t\t\tbreak;\n\t\t\tcase 0xdf:\n\t\t\t\tif ((modrm.modrm >= 0xe1 && modrm.modrm <= 0xe7) || modrm.modrm >= 0xf8)\n\t\t\t\t\treturn 0;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\telse if (mode == NMD_X86_MODE_64)\n\t\t{\n\t\t\tif (op == 0x6 || op == 0x7 || op == 0xe || op == 0x16 || op == 0x17 || op == 0x1e || op == 0x1f || op == 0x27 || op == 0x2f || op == 0x37 || op == 0x3f || (op >= 0x60 && op <= 0x62) || op == 0x82 || op == 0xce || (op >= 0xd4 && op <= 0xd6))\n\t\t\t\treturn 0;\n\t\t}\n#endif /* NMD_ASSEMBLY_DISABLE_LENGTH_DISASSEMBLER_VALIDITY_CHECK */\n\n#ifndef NMD_ASSEMBLY_DISABLE_LENGTH_DISASSEMBLER_VEX\n\t\t/* Check if instruction is VEX */\n\t\tif ((op == 0xc4 || op == 0xc5) && !has_modrm)\n\t\t{\n\t\t\tconst uint8_t byte0 = op;\n            \n            uint8_t byte1;\n\t\t\t_NMD_READ_BYTE(b, buffer_size, byte1);\n\n\t\t\tif (byte0 == 0xc4)\n\t\t\t{\n\t\t\t\tuint8_t byte2;\n\t\t\t\t_NMD_READ_BYTE(b, buffer_size, byte2);\n\n                _NMD_READ_BYTE(b, buffer_size, op);\n\n\t\t\t\tif (op == 0x0c || op == 0x0d || op == 0x40 || op == 0x41 || op == 0x17 || op == 0x21 || op == 0x42)\n\t\t\t\t{\n                    uint8_t imm;\n                    _NMD_READ_BYTE(b, buffer_size, imm);\n                }\n\t\t\t}\n\t\t\telse /* 0xc5 */\n\t\t\t{\n\t\t\t\t_NMD_READ_BYTE(b, buffer_size, op);\n\t\t\t}\n\n\t\t\tif (!_nmd_ldisasm_decode_modrm(&b, &buffer_size, address_prefix, mode, &modrm))\n\t\t\t\treturn false;\n\t\t\thas_modrm = true;\n\t\t}\n\t\telse\n#endif /* NMD_ASSEMBLY_DISABLE_LENGTH_DISASSEMBLER_VEX */\n\n\t\t{\n\t\t\t/* Check for immediate */\n            uint8_t imm_mask = 0;\n\t\t\tif (_nmd_find_byte(_nmd_op1_imm32, sizeof(_nmd_op1_imm32), op) || (_NMD_R(op) < 4 && (_NMD_C(op) == 5 || _NMD_C(op) == 0xD)) || (_NMD_R(op) == 0xB && _NMD_C(op) >= 8) || (op == 0xF7 && modrm.fields.reg == 0b000)) /* imm32,16 */\n\t\t\t{\n\t\t\t\tif (_NMD_R(op) == 0xB && _NMD_C(op) >= 8)\n\t\t\t\t\timm_mask = rexW ? 8 : (operand_prefix || (mode == NMD_X86_MODE_16 && !operand_prefix) ? 2 : 4);\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif ((mode == NMD_X86_MODE_16 && operand_prefix) || (mode != NMD_X86_MODE_16 && !operand_prefix))\n\t\t\t\t\t\timm_mask = NMD_X86_IMM32;\n\t\t\t\t\telse\n\t\t\t\t\t\timm_mask = NMD_X86_IMM16;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (_NMD_R(op) == 7 || (_NMD_R(op) == 0xE && _NMD_C(op) < 8) || (_NMD_R(op) == 0xB && _NMD_C(op) < 8) || (_NMD_R(op) < 4 && (_NMD_C(op) == 4 || _NMD_C(op) == 0xC)) || (op == 0xF6 && modrm.fields.reg <= 0b001) || _nmd_find_byte(_nmd_op1_imm8, sizeof(_nmd_op1_imm8), op)) /* imm8 */\n\t\t\t\timm_mask = 1;\n\t\t\telse if (_NMD_R(op) == 0xA && _NMD_C(op) < 4)\n\t\t\t\timm_mask = (mode == NMD_X86_MODE_64) ? (address_prefix ? 4 : 8) : (address_prefix ? 2 : 4);\n\t\t\telse if (op == 0xEA || op == 0x9A) /* imm32,48 */\n\t\t\t{\n\t\t\t\tif (mode == NMD_X86_MODE_64)\n\t\t\t\t\treturn 0;\n\t\t\t\timm_mask = (operand_prefix ? 4 : 6);\n\t\t\t}\n\t\t\telse if (op == 0xC2 || op == 0xCA) /* imm16 */\n\t\t\t\timm_mask = 2;\n\t\t\telse if (op == 0xC8) /* imm16 + imm8 */\n\t\t\t\timm_mask = 3;\n            \n            /* Make sure we can \"read\" 'imm_mask' bytes from the buffer */\n            if (buffer_size < imm_mask)\n                return false;\n            \n            /* Increment the buffer and decrement the buffer's size */\n            b += imm_mask;\n            buffer_size -= imm_mask;\n\t\t}\n\t}\n\n\tif (lock_prefix)\n\t{\n\t\tif (!(has_modrm && modrm.fields.mod != 0b11 &&\n\t\t\t((opcode_size == 1 && (op == 0x86 || op == 0x87 || (_NMD_R(op) < 4 && (op % 8) < 2 && op < 0x38) || ((op >= 0x80 && op <= 0x83) && modrm.fields.reg != 0b111) || (op >= 0xfe && modrm.fields.reg < 2) || ((op == 0xf6 || op == 0xf7) && (modrm.fields.reg == 0b010 || modrm.fields.reg == 0b011)))) ||\n\t\t\t\t(opcode_size == 2 && (_nmd_find_byte(_nmd_two_opcodes, sizeof(_nmd_two_opcodes), op) || op == 0xab || (op == 0xba && modrm.fields.reg != 0b100) || (op == 0xc7 && modrm.fields.reg == 0b001))))))\n\t\t\treturn 0;\n\t}\n\n\treturn (size_t)((ptrdiff_t)(b) - (ptrdiff_t)(buffer));\n}\n\ntypedef struct\n{\n\tchar* buffer;\n\tconst nmd_x86_instruction* instruction;\n\tuint64_t runtime_address;\n\tuint32_t flags;\n} _nmd_string_info;\n\nNMD_ASSEMBLY_API void _nmd_append_string(_nmd_string_info* const si, const char* source)\n{\n\twhile (*source)\n\t\t*si->buffer++ = *source++;\n}\n\nNMD_ASSEMBLY_API void _nmd_append_number(_nmd_string_info* const si, uint64_t n)\n{\n\tsize_t buffer_offset;\n\tif (si->flags & NMD_X86_FORMAT_FLAGS_HEX)\n\t{\n\t\tsize_t num_digits = _NMD_GET_NUM_DIGITS_HEX(n);\n\t\tbuffer_offset = num_digits;\n\n\t\tconst bool condition = n > 9 || si->flags & NMD_X86_FORMAT_FLAGS_ENFORCE_HEX_ID;\n\t\tif (si->flags & NMD_X86_FORMAT_FLAGS_0X_PREFIX && condition)\n\t\t\t*si->buffer++ = '0', *si->buffer++ = 'x';\n\n\t\tconst uint8_t base_char = (uint8_t)(si->flags & NMD_X86_FORMAT_FLAGS_HEX_LOWERCASE ? 0x57 : 0x37);\n\t\tdo {\n\t\t\tsize_t num = n % 16;\n\t\t\t*(si->buffer + --num_digits) = (char)((num > 9 ? base_char : '0') + num);\n\t\t} while ((n /= 16) > 0);\n\n\t\tif (si->flags & NMD_X86_FORMAT_FLAGS_H_SUFFIX && condition)\n\t\t\t*(si->buffer + buffer_offset++) = 'h';\n\t}\n\telse\n\t{\n\t\tsize_t num_digits = _NMD_GET_NUM_DIGITS(n);\n\t\tbuffer_offset = num_digits + 1;\n\n\t\tdo {\n\t\t\t*(si->buffer + --num_digits) = (char)('0' + n % 10);\n\t\t} while ((n /= 10) > 0);\n\t}\n\n\tsi->buffer += buffer_offset;\n}\n\nNMD_ASSEMBLY_API void _nmd_append_signed_number(_nmd_string_info* const si, int64_t n, bool show_positive_sign)\n{\n\tif (n >= 0)\n\t{\n\t\tif (show_positive_sign)\n\t\t\t*si->buffer++ = '+';\n\n\t\t_nmd_append_number(si, (uint64_t)n);\n\t}\n\telse\n\t{\n\t\t*si->buffer++ = '-';\n\t\t_nmd_append_number(si, (uint64_t)(~n + 1));\n\t}\n}\n\nNMD_ASSEMBLY_API void _nmd_append_signed_number_memory_view(_nmd_string_info* const si)\n{\n\t_nmd_append_number(si, (si->instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? 0xFF00 : (si->instruction->mode == NMD_X86_MODE_64 ? 0xFFFFFFFFFFFFFF00 : 0xFFFFFF00)) | si->instruction->immediate);\n\tif (si->flags & NMD_X86_FORMAT_FLAGS_SIGNED_NUMBER_HINT_HEX)\n\t{\n\t\t*si->buffer++ = '(';\n\t\t_nmd_append_signed_number(si, (int8_t)(si->instruction->immediate), false);\n\t\t*si->buffer++ = ')';\n\t}\n\telse if (si->flags & NMD_X86_FORMAT_FLAGS_SIGNED_NUMBER_HINT_DEC)\n\t{\n\t\t*si->buffer++ = '(';\n\t\tconst uint32_t previous_mask = si->flags;\n\t\tsi->flags &= ~NMD_X86_FORMAT_FLAGS_HEX;\n\t\t_nmd_append_signed_number(si, (int8_t)(si->instruction->immediate), false);\n\t\tsi->flags = previous_mask;\n\t\t*si->buffer++ = ')';\n\t}\n}\n\nNMD_ASSEMBLY_API void _nmd_append_relative_address8(_nmd_string_info* const si)\n{\n\tif (si->runtime_address == NMD_X86_INVALID_RUNTIME_ADDRESS)\n\t{\n\t\t/* *si->buffer++ = '$'; */\n\t\t_nmd_append_signed_number(si, (int64_t)((int8_t)(si->instruction->immediate) + (int8_t)(si->instruction->length)), true);\n\t}\n\telse\n\t{\n\t\tuint64_t n;\n\t\tif (si->instruction->mode == NMD_X86_MODE_64)\n\t\t\tn = (uint64_t)((int64_t)(si->runtime_address + (uint64_t)si->instruction->length) + (int8_t)(si->instruction->immediate));\n\t\telse if (si->instruction->mode == NMD_X86_MODE_16)\n\t\t\tn = (uint16_t)((int16_t)(si->runtime_address + (uint64_t)si->instruction->length) + (int8_t)(si->instruction->immediate));\n\t\telse\n\t\t\tn = (uint32_t)((int32_t)(si->runtime_address + (uint64_t)si->instruction->length) + (int8_t)(si->instruction->immediate));\n\t\t_nmd_append_number(si, n);\n\t}\n}\n\nNMD_ASSEMBLY_API void _nmd_append_relative_address16_32(_nmd_string_info* const si)\n{\n\tif (si->runtime_address == NMD_X86_INVALID_RUNTIME_ADDRESS)\n\t{\n\t\t_nmd_append_signed_number(si, (int64_t)(si->instruction->immediate + si->instruction->length), true);\n\t}\n\telse\n    {\n        _nmd_append_number(si,(uint64_t)((int64_t)(si->runtime_address + (uint64_t)si->instruction->length) + (int64_t)((int32_t)(si->instruction->immediate))));\n    }\n    \n    /*\n\t\t_nmd_append_number(si, ((si->instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE && si->instruction->mode == NMD_X86_MODE_32) || (si->instruction->mode == NMD_X86_MODE_16 && !(si->instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)) ? 0xFFFF : 0xFFFFFFFFFFFFFFFF) & (si->instruction->mode == NMD_X86_MODE_64 ?\n\t\t\t(uint64_t)((int64_t)(si->runtime_address + (uint64_t)si->instruction->length) + (int64_t)((int32_t)(si->instruction->immediate))) :\n\t\t\t(uint64_t)((int64_t)(si->runtime_address + (uint64_t)si->instruction->length) + (int64_t)((int32_t)(si->instruction->immediate)))\n\t\t));\n    */\n}\n\nNMD_ASSEMBLY_API void _nmd_append_modrm_memory_prefix(_nmd_string_info* const si, const char* addr_specifier_reg)\n{\n#ifndef NMD_ASSEMBLY_DISABLE_FORMATTER_POINTER_SIZE\n\tif (si->flags & NMD_X86_FORMAT_FLAGS_POINTER_SIZE)\n\t{\n\t\t_nmd_append_string(si, addr_specifier_reg);\n\t\t_nmd_append_string(si, \" ptr \");\n\t}\n#endif /* NMD_ASSEMBLY_DISABLE_FORMATTER_POINTER_SIZE */\n\n\tif (!(si->flags & NMD_X86_FORMAT_FLAGS_ONLY_SEGMENT_OVERRIDE && !si->instruction->segment_override))\n\t{\n\t\tsize_t i = 0;\n\t\tif (si->instruction->segment_override)\n\t\t\ti = _nmd_get_bit_index(si->instruction->segment_override);\n\n\t\t_nmd_append_string(si, si->instruction->segment_override ? _nmd_segment_reg[i] : (!(si->instruction->prefixes & NMD_X86_PREFIXES_REX_B) && (si->instruction->modrm.fields.rm == 0b100 || si->instruction->modrm.fields.rm == 0b101) ? \"ss\" : \"ds\"));\n\t\t*si->buffer++ = ':';\n\t}\n}\n\nNMD_ASSEMBLY_API void _nmd_append_modrm16_upper(_nmd_string_info* const si)\n{\n\t*si->buffer++ = '[';\n\n\tif (!(si->instruction->modrm.fields.mod == 0b00 && si->instruction->modrm.fields.rm == 0b110))\n\t{\n\t\tconst char* addresses[] = { \"bx+si\", \"bx+di\", \"bp+si\", \"bp+di\", \"si\", \"di\", \"bp\", \"bx\" };\n\t\t_nmd_append_string(si, addresses[si->instruction->modrm.fields.rm]);\n\t}\n\n\tif (si->instruction->disp_mask != NMD_X86_DISP_NONE && (si->instruction->displacement != 0 || *(si->buffer - 1) == '['))\n\t{\n\t\tif (si->instruction->modrm.fields.mod == 0b00 && si->instruction->modrm.fields.rm == 0b110)\n\t\t\t_nmd_append_number(si, si->instruction->displacement);\n\t\telse\n\t\t{\n\t\t\tconst bool is_negative = si->instruction->displacement & (1U << (si->instruction->disp_mask * 8 - 1));\n\t\t\tif (*(si->buffer - 1) != '[')\n\t\t\t\t*si->buffer++ = is_negative ? '-' : '+';\n\n\t\t\tif (is_negative)\n\t\t\t{\n\t\t\t\tconst uint16_t mask = (uint16_t)(si->instruction->disp_mask == 2 ? 0xFFFF : 0xFF);\n\t\t\t\t_nmd_append_number(si, (uint64_t)(~si->instruction->displacement & mask) + 1);\n\t\t\t}\n\t\t\telse\n\t\t\t\t_nmd_append_number(si, si->instruction->displacement);\n\t\t}\n\t}\n\n\t*si->buffer++ = ']';\n}\n\nNMD_ASSEMBLY_API void _nmd_append_modrm32_upper(_nmd_string_info* const si)\n{\n\t*si->buffer++ = '[';\n\n\tif (si->instruction->has_sib)\n\t{\n\t\tif (si->instruction->sib.fields.base == 0b101)\n\t\t{\n\t\t\tif (si->instruction->modrm.fields.mod != 0b00)\n\t\t\t\t_nmd_append_string(si, si->instruction->mode == NMD_X86_MODE_64 && !(si->instruction->prefixes & NMD_X86_PREFIXES_ADDRESS_SIZE_OVERRIDE) ? (si->instruction->prefixes & NMD_X86_PREFIXES_REX_B ? \"r13\" : \"rbp\") : \"ebp\");\n\t\t}\n\t\telse\n\t\t\t_nmd_append_string(si, (si->instruction->mode == NMD_X86_MODE_64 && !(si->instruction->prefixes & NMD_X86_PREFIXES_ADDRESS_SIZE_OVERRIDE) ? (si->instruction->prefixes & NMD_X86_PREFIXES_REX_B ? _nmd_regrx : _nmd_reg64) : _nmd_reg32)[si->instruction->sib.fields.base]);\n\n\t\tif (si->instruction->sib.fields.index != 0b100)\n\t\t{\n\t\t\tif (!(si->instruction->sib.fields.base == 0b101 && si->instruction->modrm.fields.mod == 0b00))\n\t\t\t\t*si->buffer++ = '+';\n\t\t\t_nmd_append_string(si, (si->instruction->mode == NMD_X86_MODE_64 && !(si->instruction->prefixes & NMD_X86_PREFIXES_ADDRESS_SIZE_OVERRIDE) ? (si->instruction->prefixes & NMD_X86_PREFIXES_REX_X ? _nmd_regrx : _nmd_reg64) : _nmd_reg32)[si->instruction->sib.fields.index]);\n\t\t\tif (!(si->instruction->sib.fields.scale == 0b00 && !(si->flags & NMD_X86_FORMAT_FLAGS_SCALE_ONE)))\n\t\t\t\t*si->buffer++ = '*', *si->buffer++ = (char)('0' + (1 << si->instruction->sib.fields.scale));\n\t\t}\n\n\t\tif (si->instruction->prefixes & NMD_X86_PREFIXES_REX_X && si->instruction->sib.fields.index == 0b100)\n\t\t{\n\t\t\tif (*(si->buffer - 1) != '[')\n\t\t\t\t*si->buffer++ = '+';\n\t\t\t_nmd_append_string(si, \"r12\");\n\t\t\tif (!(si->instruction->sib.fields.scale == 0b00 && !(si->flags & NMD_X86_FORMAT_FLAGS_SCALE_ONE)))\n\t\t\t\t*si->buffer++ = '*', *si->buffer++ = (char)('0' + (1 << si->instruction->sib.fields.scale));\n\t\t}\n\t}\n\telse if (!(si->instruction->modrm.fields.mod == 0b00 && si->instruction->modrm.fields.rm == 0b101))\n\t{\n\t\tif ((si->instruction->prefixes & (NMD_X86_PREFIXES_ADDRESS_SIZE_OVERRIDE | NMD_X86_PREFIXES_REX_B)) == (NMD_X86_PREFIXES_ADDRESS_SIZE_OVERRIDE | NMD_X86_PREFIXES_REX_B) && si->instruction->mode == NMD_X86_MODE_64)\n\t\t\t_nmd_append_string(si, _nmd_regrx[si->instruction->modrm.fields.rm]), *si->buffer++ = 'd';\n\t\telse\n\t\t\t_nmd_append_string(si, (si->instruction->mode == NMD_X86_MODE_64 && !(si->instruction->prefixes & NMD_X86_PREFIXES_ADDRESS_SIZE_OVERRIDE) ? (si->instruction->prefixes & NMD_X86_PREFIXES_REX_B ? _nmd_regrx : _nmd_reg64) : _nmd_reg32)[si->instruction->modrm.fields.rm]);\n\t}\n\n\t/* Handle displacement. */\n\tif (si->instruction->disp_mask != NMD_X86_DISP_NONE && (si->instruction->displacement != 0 || *(si->buffer - 1) == '['))\n\t{\n\t\t/* Relative address. */\n\t\tif (si->instruction->modrm.fields.rm == 0b101 && si->instruction->mode == NMD_X86_MODE_64 && si->instruction->modrm.fields.mod == 0b00 && si->runtime_address != NMD_X86_INVALID_RUNTIME_ADDRESS)\n\t\t{\n\t\t\tif (si->instruction->prefixes & NMD_X86_PREFIXES_ADDRESS_SIZE_OVERRIDE)\n\t\t\t\t_nmd_append_number(si, (uint64_t)((int64_t)(si->runtime_address + (uint64_t)si->instruction->length) + (int64_t)si->instruction->displacement));\n\t\t\telse\n\t\t\t\t_nmd_append_number(si, (uint64_t)((int64_t)(si->runtime_address + si->instruction->length) + (int64_t)((int32_t)si->instruction->displacement)));\n\t\t}\n\t\telse if (si->instruction->modrm.fields.mod == 0b00 && ((si->instruction->sib.fields.base == 0b101 && si->instruction->sib.fields.index == 0b100) || si->instruction->modrm.fields.rm == 0b101) && *(si->buffer - 1) == '[')\n\t\t\t_nmd_append_number(si, si->instruction->mode == NMD_X86_MODE_64 ? 0xFFFFFFFF00000000 | si->instruction->displacement : si->instruction->displacement);\n\t\telse\n\t\t{\n\t\t\tif (si->instruction->modrm.fields.rm == 0b101 && si->instruction->mode == NMD_X86_MODE_64 && si->instruction->modrm.fields.mod == 0b00)\n\t\t\t\t_nmd_append_string(si, si->instruction->prefixes & NMD_X86_PREFIXES_ADDRESS_SIZE_OVERRIDE ? \"eip\" : \"rip\");\n\n\t\t\tconst bool is_negative = si->instruction->displacement & (1 << (si->instruction->disp_mask * 8 - 1));\n\t\t\tif (*(si->buffer - 1) != '[')\n\t\t\t\t*si->buffer++ = is_negative ? '-' : '+';\n\n\t\t\tif (is_negative)\n\t\t\t{\n\t\t\t\tconst uint32_t mask = (uint32_t)(si->instruction->disp_mask == 4 ? -1 : (1 << (si->instruction->disp_mask * 8)) - 1);\n\t\t\t\t_nmd_append_number(si, (uint64_t)(~si->instruction->displacement & mask) + 1);\n\t\t\t}\n\t\t\telse\n\t\t\t\t_nmd_append_number(si, si->instruction->displacement);\n\t\t}\n\t}\n\n\t*si->buffer++ = ']';\n}\n\nNMD_ASSEMBLY_API void _nmd_append_modrm_upper(_nmd_string_info* const si, const char* addr_specifier_reg)\n{\n\t_nmd_append_modrm_memory_prefix(si, addr_specifier_reg);\n\n\tif ((si->instruction->mode == NMD_X86_MODE_16 && !(si->instruction->prefixes & NMD_X86_PREFIXES_ADDRESS_SIZE_OVERRIDE)) || (si->instruction->prefixes & NMD_X86_PREFIXES_ADDRESS_SIZE_OVERRIDE && si->instruction->mode == NMD_X86_MODE_32))\n\t\t_nmd_append_modrm16_upper(si);\n\telse\n\t\t_nmd_append_modrm32_upper(si);\n}\n\nNMD_ASSEMBLY_API void _nmd_append_modrm_upper_without_address_specifier(_nmd_string_info* const si)\n{\n\tif ((si->instruction->mode == NMD_X86_MODE_16 && !(si->instruction->prefixes & NMD_X86_PREFIXES_ADDRESS_SIZE_OVERRIDE)) || (si->instruction->prefixes & NMD_X86_PREFIXES_ADDRESS_SIZE_OVERRIDE && si->instruction->mode == NMD_X86_MODE_32))\n\t\t_nmd_append_modrm16_upper(si);\n\telse\n\t\t_nmd_append_modrm32_upper(si);\n}\n\nNMD_ASSEMBLY_API void _nmd_append_Nq(_nmd_string_info* const si)\n{\n\t*si->buffer++ = 'm', *si->buffer++ = 'm';\n\t*si->buffer++ = (char)('0' + si->instruction->modrm.fields.rm);\n}\n\nNMD_ASSEMBLY_API void _nmd_append_Pq(_nmd_string_info* const si)\n{\n\t*si->buffer++ = 'm', *si->buffer++ = 'm';\n\t*si->buffer++ = (char)('0' + si->instruction->modrm.fields.reg);\n}\n\nNMD_ASSEMBLY_API void _nmd_append_avx_register_reg(_nmd_string_info* const si)\n{\n\t*si->buffer++ = si->instruction->vex.L ? 'y' : 'x';\n\t_nmd_append_Pq(si);\n}\n\nNMD_ASSEMBLY_API void _nmd_append_avx_vvvv_register(_nmd_string_info* const si)\n{\n\t*si->buffer++ = si->instruction->vex.L ? 'y' : 'x';\n\t*si->buffer++ = 'm', *si->buffer++ = 'm';\n\tif ((15 - si->instruction->vex.vvvv) > 9)\n\t\t*si->buffer++ = '1', *si->buffer++ = (char)(0x26 + (15 - si->instruction->vex.vvvv));\n\telse\n\t\t*si->buffer++ = (char)('0' + (15 - si->instruction->vex.vvvv));\n}\n\nNMD_ASSEMBLY_API void _nmd_append_Vdq(_nmd_string_info* const si)\n{\n\t*si->buffer++ = 'x';\n\t_nmd_append_Pq(si);\n}\n\nNMD_ASSEMBLY_API void _nmd_append_Vqq(_nmd_string_info* const si)\n{\n\t*si->buffer++ = 'y';\n\t_nmd_append_Pq(si);\n}\n\nNMD_ASSEMBLY_API void _nmd_append_Vx(_nmd_string_info* const si)\n{\n\tif (si->instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t_nmd_append_Vdq(si);\n\telse\n\t\t_nmd_append_Vqq(si);\n}\n\nNMD_ASSEMBLY_API void _nmd_append_Udq(_nmd_string_info* const si)\n{\n\t*si->buffer++ = 'x';\n\t_nmd_append_Nq(si);\n}\n\nNMD_ASSEMBLY_API void _nmd_append_Uqq(_nmd_string_info* const si)\n{\n\t*si->buffer++ = 'y';\n\t_nmd_append_Nq(si);\n}\n\nNMD_ASSEMBLY_API void _nmd_append_Ux(_nmd_string_info* const si)\n{\n\tif (si->instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t_nmd_append_Udq(si);\n\telse\n\t\t_nmd_append_Uqq(si);\n}\n\nNMD_ASSEMBLY_API void _nmd_append_Qq(_nmd_string_info* const si)\n{\n\tif (si->instruction->modrm.fields.mod == 0b11)\n\t\t_nmd_append_Nq(si);\n\telse\n\t\t_nmd_append_modrm_upper(si, \"qword\");\n}\n\nNMD_ASSEMBLY_API void _nmd_append_Ev(_nmd_string_info* const si)\n{\n\tif (si->instruction->modrm.fields.mod == 0b11)\n\t{\n\t\tif (si->instruction->prefixes & NMD_X86_PREFIXES_REX_B)\n\t\t{\n\t\t\t_nmd_append_string(si, _nmd_regrx[si->instruction->modrm.fields.rm]);\n\t\t\tif (!(si->instruction->prefixes & NMD_X86_PREFIXES_REX_W))\n\t\t\t\t*si->buffer++ = 'd';\n\t\t}\n\t\telse\n\t\t\t_nmd_append_string(si, ((si->instruction->rex_w_prefix ? _nmd_reg64 : (si->instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE && si->instruction->mode != NMD_X86_MODE_16) || (si->instruction->mode == NMD_X86_MODE_16 && !(si->instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)) ? _nmd_reg16 : _nmd_reg32))[si->instruction->modrm.fields.rm]);\n\t}\n\telse\n\t\t_nmd_append_modrm_upper(si, (si->instruction->rex_w_prefix) ? \"qword\" : ((si->instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE && si->instruction->mode != NMD_X86_MODE_16) || (si->instruction->mode == NMD_X86_MODE_16 && !(si->instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)) ? \"word\" : \"dword\"));\n}\n\nNMD_ASSEMBLY_API void _nmd_append_Ey(_nmd_string_info* const si)\n{\n\tif (si->instruction->modrm.fields.mod == 0b11)\n\t\t_nmd_append_string(si, (si->instruction->rex_w_prefix ? _nmd_reg64 : _nmd_reg32)[si->instruction->modrm.fields.rm]);\n\telse\n\t\t_nmd_append_modrm_upper(si, si->instruction->rex_w_prefix ? \"qword\" : \"dword\");\n}\n\nNMD_ASSEMBLY_API void _nmd_append_Eb(_nmd_string_info* const si)\n{\n\tif (si->instruction->modrm.fields.mod == 0b11)\n\t{\n\t\tif (si->instruction->prefixes & NMD_X86_PREFIXES_REX_B)\n\t\t\t_nmd_append_string(si, _nmd_regrx[si->instruction->modrm.fields.rm]), *si->buffer++ = 'b';\n\t\telse\n\t\t\t_nmd_append_string(si, (si->instruction->has_rex ? _nmd_reg8_x64 : _nmd_reg8)[si->instruction->modrm.fields.rm]);\n\t}\n\telse\n\t\t_nmd_append_modrm_upper(si, \"byte\");\n}\n\nNMD_ASSEMBLY_API void _nmd_append_Ew(_nmd_string_info* const si)\n{\n\tif (si->instruction->modrm.fields.mod == 0b11)\n\t\t_nmd_append_string(si, _nmd_reg16[si->instruction->modrm.fields.rm]);\n\telse\n\t\t_nmd_append_modrm_upper(si, \"word\");\n}\n\nNMD_ASSEMBLY_API void _nmd_append_Ed(_nmd_string_info* const si)\n{\n\tif (si->instruction->modrm.fields.mod == 0b11)\n\t\t_nmd_append_string(si, _nmd_reg32[si->instruction->modrm.fields.rm]);\n\telse\n\t\t_nmd_append_modrm_upper(si, \"dword\");\n}\n\nNMD_ASSEMBLY_API void _nmd_append_Eq(_nmd_string_info* const si)\n{\n\tif (si->instruction->modrm.fields.mod == 0b11)\n\t\t_nmd_append_string(si, _nmd_reg64[si->instruction->modrm.fields.rm]);\n\telse\n\t\t_nmd_append_modrm_upper(si, \"qword\");\n}\n\nNMD_ASSEMBLY_API void _nmd_append_Rv(_nmd_string_info* const si)\n{\n\t_nmd_append_string(si, (si->instruction->rex_w_prefix ? _nmd_reg64 : (si->instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? _nmd_reg16 : _nmd_reg32))[si->instruction->modrm.fields.rm]);\n}\n\nNMD_ASSEMBLY_API void _nmd_append_Gv(_nmd_string_info* const si)\n{\n\tif (si->instruction->prefixes & NMD_X86_PREFIXES_REX_R)\n\t{\n\t\t_nmd_append_string(si, _nmd_regrx[si->instruction->modrm.fields.reg]);\n\t\tif (!(si->instruction->prefixes & NMD_X86_PREFIXES_REX_W))\n\t\t\t*si->buffer++ = 'd';\n\t}\n\telse\n\t\t_nmd_append_string(si, ((si->instruction->rex_w_prefix) ? _nmd_reg64 : ((si->instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE && si->instruction->mode != NMD_X86_MODE_16) || (si->instruction->mode == NMD_X86_MODE_16 && !(si->instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)) ? _nmd_reg16 : _nmd_reg32))[si->instruction->modrm.fields.reg]);\n}\n\nNMD_ASSEMBLY_API void _nmd_append_Gy(_nmd_string_info* const si)\n{\n\t_nmd_append_string(si, (si->instruction->rex_w_prefix ? _nmd_reg64 : _nmd_reg32)[si->instruction->modrm.fields.reg]);\n}\n\nNMD_ASSEMBLY_API void _nmd_append_Gb(_nmd_string_info* const si)\n{\n\tif (si->instruction->prefixes & NMD_X86_PREFIXES_REX_R)\n\t\t_nmd_append_string(si, _nmd_regrx[si->instruction->modrm.fields.reg]), *si->buffer++ = 'b';\n\telse\n\t\t_nmd_append_string(si, (si->instruction->has_rex ? _nmd_reg8_x64 : _nmd_reg8)[si->instruction->modrm.fields.reg]);\n}\n\nNMD_ASSEMBLY_API void _nmd_append_Gw(_nmd_string_info* const si)\n{\n\t_nmd_append_string(si, _nmd_reg16[si->instruction->modrm.fields.reg]);\n}\n\nNMD_ASSEMBLY_API void _nmd_append_W(_nmd_string_info* const si)\n{\n\tif (si->instruction->modrm.fields.mod == 0b11)\n\t\t_nmd_append_string(si, \"xmm\"), *si->buffer++ = (char)('0' + si->instruction->modrm.fields.rm);\n\telse\n\t\t_nmd_append_modrm_upper(si, \"xmmword\");\n}\n\n#ifndef NMD_ASSEMBLY_DISABLE_FORMATTER_ATT_SYNTAX\nNMD_ASSEMBLY_API char* _nmd_format_operand_to_att(char* operand, _nmd_string_info* si)\n{\n\tchar* next_operand = (char*)_nmd_strchr(operand, ',');\n\tconst char* operand_end = next_operand ? next_operand : si->buffer;\n\n\t/* Memory operand. */\n\tconst char* memory_operand = _nmd_strchr(operand, '[');\n\tif (memory_operand && memory_operand < operand_end)\n\t{\n\t\tmemory_operand++;\n\t\tconst char* segment_reg = _nmd_strchr(operand, ':');\n\t\tif (segment_reg)\n\t\t{\n\t\t\tif (segment_reg == operand + 2)\n\t\t\t\t_nmd_insert_char(operand, '%'), si->buffer++, operand += 4;\n\t\t\telse\n\t\t\t{\n\t\t\t\t*operand++ = '%';\n\t\t\t\t*operand++ = *(segment_reg - 2);\n\t\t\t\t*operand++ = 's';\n\t\t\t\t*operand++ = ':';\n\t\t\t}\n\t\t}\n\n\t\t/* Handle displacement. */\n\t\tchar* displacement = operand;\n\t\tdo\n\t\t{\n\t\t\tdisplacement++;\n\t\t\tdisplacement = (char*)_nmd_find_number(displacement, operand_end);\n\t\t} while (displacement && ((*(displacement - 1) != '+' && *(displacement - 1) != '-' && *(displacement - 1) != '[') || !_nmd_is_number(displacement, operand_end - 2)));\n\n\t\tbool is_there_base_or_index = true;\n\t\tchar memory_operand_buffer[96];\n\n\t\tif (displacement)\n\t\t{\n\t\t\tif (*(displacement - 1) != '[')\n\t\t\t\tdisplacement--;\n\t\t\telse\n\t\t\t\tis_there_base_or_index = false;\n\n\t\t\tchar* i = (char*)memory_operand;\n\t\t\tchar* j = memory_operand_buffer;\n\t\t\tfor (; i < displacement; i++, j++)\n\t\t\t\t*j = *i;\n\t\t\t*j = '\\0';\n\n\t\t\tif (*displacement == '+')\n\t\t\t\tdisplacement++;\n\n\t\t\tfor (; *displacement != ']'; displacement++, operand++)\n\t\t\t\t*operand = *displacement;\n\t\t}\n\n\t\t/* Handle base, index and scale. */\n\t\tif (is_there_base_or_index)\n\t\t{\n\t\t\t*operand++ = '(';\n\n\t\t\tchar* base_or_index = operand;\n\t\t\tif (displacement)\n\t\t\t{\n\t\t\t\tchar* s = memory_operand_buffer;\n\t\t\t\tfor (; *s; s++, operand++)\n\t\t\t\t\t*operand = *s;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfor (; *memory_operand != ']'; operand++, memory_operand++)\n\t\t\t\t\t*operand = *memory_operand;\n\t\t\t}\n\n\t\t\t_nmd_insert_char(base_or_index, '%');\n\t\t\toperand++;\n\t\t\t*operand++ = ')';\n\n\t\t\tfor (; *base_or_index != ')'; base_or_index++)\n\t\t\t{\n\t\t\t\tif (*base_or_index == '+' || *base_or_index == '*')\n\t\t\t\t{\n\t\t\t\t\tif (*base_or_index == '+')\n\t\t\t\t\t\t_nmd_insert_char(base_or_index + 1, '%'), operand++;\n\t\t\t\t\t*base_or_index = ',';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\toperand = base_or_index;\n\t\t\toperand++;\n\t\t}\n\n\t\tif (next_operand)\n\t\t{\n\t\t\t/* Move second operand to the left until the comma. */\n\t\t\toperand_end = _nmd_strchr(operand, ',');\n\t\t\tfor (; *operand_end != '\\0'; operand++, operand_end++)\n\t\t\t\t*operand = *operand_end;\n\n\t\t\t*operand = '\\0';\n\n\t\t\toperand_end = operand;\n\t\t\twhile (*operand_end != ',')\n\t\t\t\toperand_end--;\n\t\t}\n\t\telse\n\t\t\t*operand = '\\0', operand_end = operand;\n\n\t\tsi->buffer = operand;\n\n\t\treturn (char*)operand_end;\n\t}\n\telse /* Immediate or register operand. */\n\t{\n\t\t_nmd_insert_char(operand, _nmd_is_number(operand, operand_end) ? '$' : '%');\n\t\tsi->buffer++;\n\t\treturn (char*)operand_end + 1;\n\t}\n}\n#endif /* NMD_ASSEMBLY_DISABLE_FORMATTER_ATT_SYNTAX */\n\n/*\nFormats an instruction. This function may cause a crash if you modify 'instruction' manually.\nParameters:\n - instruction     [in]  A pointer to a variable of type 'nmd_x86_instruction' describing the instruction to be formatted.\n - buffer          [out] A pointer to buffer that receives the string. The buffer's recommended size is 128 bytes.\n - runtime_address [in]  The instruction's runtime address. You may use 'NMD_X86_INVALID_RUNTIME_ADDRESS'.\n - flags           [in]  A mask of 'NMD_X86_FORMAT_FLAGS_XXX' that specifies how the function should format the instruction. If uncertain, use 'NMD_X86_FORMAT_FLAGS_DEFAULT'.\n*/\nNMD_ASSEMBLY_API void nmd_x86_format(const nmd_x86_instruction* instruction, char* buffer, uint64_t runtime_address, uint32_t flags)\n{\n\tif (!instruction->valid)\n\t{\n\t\tbuffer[0] = '\\0';\n\t\treturn;\n\t}\n\n\t_nmd_string_info si;\n\tsi.buffer = buffer;\n\tsi.instruction = instruction;\n\tsi.runtime_address = runtime_address;\n\tsi.flags = flags;\n\n#ifndef NMD_ASSEMBLY_DISABLE_FORMATTER_BYTES\n\tif (flags & NMD_X86_FORMAT_FLAGS_BYTES)\n\t{\n\t\tsize_t i = 0;\n\t\tfor (; i < instruction->length; i++)\n\t\t{\n\t\t\tuint8_t num = instruction->buffer[i] >> 4;\n\t\t\t*si.buffer++ = (char)((num > 9 ? 0x37 : '0') + num);\n\t\t\tnum = instruction->buffer[i] & 0xf;\n\t\t\t*si.buffer++ = (char)((num > 9 ? 0x37 : '0') + num);\n\t\t\t*si.buffer++ = ' ';\n\t\t}\n\n\t\tconst size_t num_padding_bytes = instruction->length < NMD_X86_FORMATTER_NUM_PADDING_BYTES ? (NMD_X86_FORMATTER_NUM_PADDING_BYTES - instruction->length) : 0;\n\t\tfor (i = 0; i < num_padding_bytes * 3; i++)\n\t\t\t*si.buffer++ = ' ';\n\t}\n#endif /* NMD_ASSEMBLY_DISABLE_FORMATTER_BYTES */\n\n\tconst uint8_t op = instruction->opcode;\n\n\tif (instruction->prefixes & (NMD_X86_PREFIXES_REPEAT | NMD_X86_PREFIXES_REPEAT_NOT_ZERO) && (instruction->prefixes & NMD_X86_PREFIXES_LOCK || ((op == 0x86 || op == 0x87) && instruction->modrm.fields.mod != 0b11)))\n\t\t_nmd_append_string(&si, instruction->repeat_prefix ? \"xrelease \" : \"xacquire \");\n\telse if (instruction->prefixes & NMD_X86_PREFIXES_REPEAT_NOT_ZERO && (instruction->opcode_size == 1 && (op == 0xc2 || op == 0xc3 || op == 0xe8 || op == 0xe9 || _NMD_R(op) == 7 || (op == 0xff && (instruction->modrm.fields.reg == 0b010 || instruction->modrm.fields.reg == 0b100)))))\n\t\t_nmd_append_string(&si, \"bnd \");\n\n\tif (instruction->prefixes & NMD_X86_PREFIXES_LOCK)\n\t\t_nmd_append_string(&si, \"lock \");\n\n\tconst bool opszprfx = instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE;\n\n\tif (instruction->opcode_map == NMD_X86_OPCODE_MAP_DEFAULT)\n\t{\n#ifndef NMD_ASSEMBLY_DISABLE_FORMATTER_EVEX\n\t\tif (instruction->encoding == NMD_X86_ENCODING_EVEX)\n\t\t{\n\n\t\t}\n#endif /* NMD_ASSEMBLY_DISABLE_FORMATTER_EVEX */\n\n#if !defined(NMD_ASSEMBLY_DISABLE_FORMATTER_EVEX) && !defined(NMD_ASSEMBLY_DISABLE_FORMATTER_VEX)\n\t\telse\n#endif\n#ifndef NMD_ASSEMBLY_DISABLE_FORMATTER_VEX\n\t\t\tif (instruction->encoding == NMD_X86_ENCODING_VEX)\n\t\t\t{\n\t\t\t\tif (instruction->vex.vex[0] == 0xc4)\n\t\t\t\t{\n\t\t\t\t\tif (instruction->opcode == 0x0c || instruction->opcode == 0x0d || instruction->opcode == 0x4a || instruction->opcode == 0x4b)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_append_string(&si, instruction->opcode == 0x0c ? \"vblendps\" : (instruction->opcode == 0x0c ? \"vblendpd\" : (instruction->opcode == 0x4a ? \"vblendvps\" : \"vblendvpd\")));\n\t\t\t\t\t\t*si.buffer++ = ' ';\n\n\t\t\t\t\t\t_nmd_append_avx_register_reg(&si);\n\t\t\t\t\t\t*si.buffer++ = ',';\n\n\t\t\t\t\t\t_nmd_append_avx_vvvv_register(&si);\n\t\t\t\t\t\t*si.buffer++ = ',';\n\n\t\t\t\t\t\t_nmd_append_W(&si);\n\t\t\t\t\t\t*si.buffer++ = ',';\n\n\t\t\t\t\t\tif(instruction->opcode <= 0x0d)\n\t\t\t\t\t\t\t_nmd_append_number(&si, instruction->immediate);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t_nmd_append_string(&si, \"xmm\");\n\t\t\t\t\t\t\t*si.buffer++ = (char)('0' + ((instruction->immediate & 0xf0) >> 4) % 8);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if (instruction->opcode == 0x40 || instruction->opcode == 0x41)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_append_string(&si, instruction->opcode == 0x40 ? \"vdpps\" : \"vdppd\");\n\t\t\t\t\t\t*si.buffer++ = ' ';\n\n\t\t\t\t\t\t_nmd_append_avx_register_reg(&si);\n\t\t\t\t\t\t*si.buffer++ = ',';\n\n\t\t\t\t\t\t_nmd_append_avx_vvvv_register(&si);\n\t\t\t\t\t\t*si.buffer++ = ',';\n\n\t\t\t\t\t\t_nmd_append_W(&si);\n\t\t\t\t\t\t*si.buffer++ = ',';\n\n\t\t\t\t\t\t_nmd_append_number(&si, instruction->immediate);\n\t\t\t\t\t}\n\t\t\t\t\telse if (instruction->opcode == 0x17)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_append_string(&si, \"vextractps \");\n\n\t\t\t\t\t\t_nmd_append_Ev(&si);\n\t\t\t\t\t\t*si.buffer++ = ',';\n\n\t\t\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t\t\t*si.buffer++ = ',';\n\n\t\t\t\t\t\t_nmd_append_number(&si, instruction->immediate);\n\t\t\t\t\t}\n\t\t\t\t\telse if (instruction->opcode == 0x21)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_append_string(&si, \"vinsertps \");\n\n\t\t\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t\t\t*si.buffer++ = ',';\n\n\t\t\t\t\t\t_nmd_append_avx_vvvv_register(&si);\n\t\t\t\t\t\t*si.buffer++ = ',';\n\n\t\t\t\t\t\t_nmd_append_W(&si);\n\t\t\t\t\t\t*si.buffer++ = ',';\n\n\t\t\t\t\t\t_nmd_append_number(&si, instruction->immediate);\n\t\t\t\t\t}\n\t\t\t\t\telse if (instruction->opcode == 0x2a)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_append_string(&si, \"vmovntdqa \");\n\n\t\t\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t\t\t*si.buffer++ = ',';\n\n\t\t\t\t\t\t_nmd_append_modrm_upper_without_address_specifier(&si);\n\t\t\t\t\t}\n\t\t\t\t\telse if (instruction->opcode == 0x42)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_append_string(&si, \"vmpsadbw \");\n\n\t\t\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t\t\t*si.buffer++ = ',';\n\n\t\t\t\t\t\t_nmd_append_avx_vvvv_register(&si);\n\t\t\t\t\t\t*si.buffer++ = ',';\n\n\t\t\t\t\t\tif (si.instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t\t\t_nmd_append_string(&si, \"xmm\"), *si.buffer++ = (char)('0' + si.instruction->modrm.fields.rm);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t_nmd_append_modrm_upper_without_address_specifier(&si);\n\t\t\t\t\t\t*si.buffer++ = ',';\n\n\t\t\t\t\t\t_nmd_append_number(&si, instruction->immediate);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n#endif /* NMD_ASSEMBLY_DISABLE_FORMATTER_VEX */\n\t\t\t\n#if (!defined(NMD_ASSEMBLY_DISABLE_FORMATTER_EVEX) || !defined(NMD_ASSEMBLY_DISABLE_FORMATTER_VEX)) && !defined(NMD_ASSEMBLY_DISABLE_FORMATTER_3DNOW)\n\t\telse\n#endif\n#ifndef NMD_ASSEMBLY_DISABLE_FORMATTER_3DNOW\n\t\tif (instruction->encoding == NMD_X86_ENCODING_3DNOW)\n\t\t{\n\t\t\tconst char* mnemonic = 0;\n\t\t\tswitch (instruction->opcode)\n\t\t\t{\n\t\t\tcase 0x0c: mnemonic = \"pi2fw\"; break;\n\t\t\tcase 0x0d: mnemonic = \"pi2fd\"; break;\n\t\t\tcase 0x1c: mnemonic = \"pf2iw\"; break;\n\t\t\tcase 0x1d: mnemonic = \"pf2id\"; break;\n\t\t\tcase 0x8a: mnemonic = \"pfnacc\"; break;\n\t\t\tcase 0x8e: mnemonic = \"pfpnacc\"; break;\n\t\t\tcase 0x90: mnemonic = \"pfcmpge\"; break;\n\t\t\tcase 0x94: mnemonic = \"pfmin\"; break;\n\t\t\tcase 0x96: mnemonic = \"pfrcp\"; break;\n\t\t\tcase 0x97: mnemonic = \"pfrsqrt\"; break;\n\t\t\tcase 0x9a: mnemonic = \"pfsub\"; break;\n\t\t\tcase 0x9e: mnemonic = \"pfadd\"; break;\n\t\t\tcase 0xa0: mnemonic = \"pfcmpgt\"; break;\n\t\t\tcase 0xa4: mnemonic = \"pfmax\"; break;\n\t\t\tcase 0xa6: mnemonic = \"pfrcpit1\"; break;\n\t\t\tcase 0xa7: mnemonic = \"pfrsqit1\"; break;\n\t\t\tcase 0xaa: mnemonic = \"pfsubr\"; break;\n\t\t\tcase 0xae: mnemonic = \"pfacc\"; break;\n\t\t\tcase 0xb0: mnemonic = \"pfcmpeq\"; break;\n\t\t\tcase 0xb4: mnemonic = \"pfmul\"; break;\n\t\t\tcase 0xb6: mnemonic = \"pfrcpit2\"; break;\n\t\t\tcase 0xb7: mnemonic = \"pmulhrw\"; break;\n\t\t\tcase 0xbb: mnemonic = \"pswapd\"; break;\n\t\t\tcase 0xbf: mnemonic = \"pavgusb\"; break;\n\t\t\tdefault: return;\n\t\t\t}\n\n\t\t\t_nmd_append_string(&si, mnemonic);\n\t\t\t*si.buffer++ = ' ';\n\n\t\t\t_nmd_append_Pq(&si);\n\t\t\t*si.buffer++ = ',';\n\t\t\t_nmd_append_Qq(&si);\n\t\t}\n#endif /* NMD_ASSEMBLY_DISABLE_FORMATTER_3DNOW */\n\n#if !defined(NMD_ASSEMBLY_DISABLE_FORMATTER_EVEX) || !defined(NMD_ASSEMBLY_DISABLE_FORMATTER_VEX) || !defined(NMD_ASSEMBLY_DISABLE_FORMATTER_3DNOW)\n\t\t\telse /*if (instruction->encoding == INSTRUCTION_ENCODING_LEGACY) */\n#endif\n\t\t\t{\n\t\t\t\tif (op >= 0x88 && op <= 0x8c) /* mov [88,8c] */\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, \"mov \");\n\t\t\t\t\tif (op == 0x8b)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_append_Gv(&si);\n\t\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t\t_nmd_append_Ev(&si);\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x89)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_append_Ev(&si);\n\t\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t\t_nmd_append_Gv(&si);\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x88)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_append_Eb(&si);\n\t\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t\t_nmd_append_Gb(&si);\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x8a)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_append_Gb(&si);\n\t\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t\t_nmd_append_Eb(&si);\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0x8c)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (si.instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t\t\t_nmd_append_string(&si, (si.instruction->rex_w_prefix ? _nmd_reg64 : (si.instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE || instruction->mode == NMD_X86_MODE_16 ? _nmd_reg16 : _nmd_reg32))[si.instruction->modrm.fields.rm]);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t_nmd_append_modrm_upper(&si, \"word\");\n\n\t\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t\t_nmd_append_string(&si, _nmd_segment_reg[instruction->modrm.fields.reg]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (op == 0x68 || op == 0x6A) /* push */\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, \"push \");\n\t\t\t\t\tif (op == 0x6a)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (flags & NMD_X86_FORMAT_FLAGS_SIGNED_NUMBER_MEMORY_VIEW && instruction->immediate >= 0x80)\n\t\t\t\t\t\t\t_nmd_append_signed_number_memory_view(&si);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t_nmd_append_signed_number(&si, (int8_t)instruction->immediate, false);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_append_number(&si, instruction->immediate);\n\t\t\t\t}\n\t\t\t\telse if (op == 0xff) /* Opcode extensions Group 5 */\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, _nmd_opcode_extensions_grp5[instruction->modrm.fields.reg]);\n\t\t\t\t\t*si.buffer++ = ' ';\n\t\t\t\t\tif (instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t\t_nmd_append_string(&si, (si.instruction->rex_w_prefix ? _nmd_reg64 : (opszprfx ? _nmd_reg16 : _nmd_reg32))[si.instruction->modrm.fields.rm]);\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_append_modrm_upper(&si, (instruction->modrm.fields.reg == 0b011 || instruction->modrm.fields.reg == 0b101) ? \"fword\" : (instruction->mode == NMD_X86_MODE_64 && ((instruction->modrm.fields.reg >= 0b010 && instruction->modrm.fields.reg <= 0b110) || (instruction->prefixes & NMD_X86_PREFIXES_REX_W && instruction->modrm.fields.reg <= 0b010)) ? \"qword\" : (opszprfx ? \"word\" : \"dword\")));\n\t\t\t\t}\n\t\t\t\telse if (_NMD_R(op) < 4 && (_NMD_C(op) < 6 || (_NMD_C(op) >= 8 && _NMD_C(op) < 0xE))) /* add,adc,and,xor,or,sbb,sub,cmp */\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, _nmd_op1_opcode_map_mnemonics[_NMD_R((_NMD_C(op) > 6 ? op + 0x40 : op))]);\n\t\t\t\t\t*si.buffer++ = ' ';\n\n\t\t\t\t\tswitch (op % 8)\n\t\t\t\t\t{\n\t\t\t\t\tcase 0:\n\t\t\t\t\t\t_nmd_append_Eb(&si);\n\t\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t\t_nmd_append_Gb(&si);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\t_nmd_append_Ev(&si);\n\t\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t\t_nmd_append_Gv(&si);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\t_nmd_append_Gb(&si);\n\t\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t\t_nmd_append_Eb(&si);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 3:\n\t\t\t\t\t\t_nmd_append_Gv(&si);\n\t\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t\t_nmd_append_Ev(&si);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 4:\n\t\t\t\t\t\t_nmd_append_string(&si, \"al,\");\n\t\t\t\t\t\t_nmd_append_number(&si, instruction->immediate);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 5:\n\t\t\t\t\t\t_nmd_append_string(&si, instruction->rex_w_prefix ? \"rax\" : (opszprfx ? \"ax\" : \"eax\"));\n\t\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t\t_nmd_append_number(&si, instruction->immediate);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (_NMD_R(op) == 4 || _NMD_R(op) == 5) /* inc,dec,push,pop [0x40, 0x5f] */\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, _NMD_C(op) < 8 ? (_NMD_R(op) == 4 ? \"inc \" : \"push \") : (_NMD_R(op) == 4 ? \"dec \" : \"pop \"));\n\t\t\t\t\t_nmd_append_string(&si, (instruction->prefixes & NMD_X86_PREFIXES_REX_B ? (opszprfx ? _nmd_regrxw : _nmd_regrx) : (opszprfx ? (instruction->mode == NMD_X86_MODE_16 ? _nmd_reg32 : _nmd_reg16) : ((instruction->mode == NMD_X86_MODE_32 ? _nmd_reg32 : (instruction->mode == NMD_X86_MODE_64 ? _nmd_reg64 : _nmd_reg16)))))[op % 8]);\n\t\t\t\t}\n\t\t\t\telse if (op >= 0x80 && op < 0x84) /* add,adc,and,xor,or,sbb,sub,cmp [80,83] */\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, _nmd_opcode_extensions_grp1[instruction->modrm.fields.reg]);\n\t\t\t\t\t*si.buffer++ = ' ';\n\t\t\t\t\tif (op == 0x80 || op == 0x82)\n\t\t\t\t\t\t_nmd_append_Eb(&si);\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_append_Ev(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\tif (op == 0x83)\n\t\t\t\t\t{\n\t\t\t\t\t\tif ((instruction->modrm.fields.reg == 0b001 || instruction->modrm.fields.reg == 0b100 || instruction->modrm.fields.reg == 0b110) && instruction->immediate >= 0x80)\n\t\t\t\t\t\t\t_nmd_append_number(&si, (instruction->prefixes & NMD_X86_PREFIXES_REX_W ? 0xFFFFFFFFFFFFFF00 : (instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE || instruction->mode == NMD_X86_MODE_16 ? 0xFF00 : 0xFFFFFF00)) | instruction->immediate);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t_nmd_append_signed_number(&si, (int8_t)(instruction->immediate), false);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_append_number(&si, instruction->immediate);\n\t\t\t\t}\n\t\t\t\telse if (op == 0xe8 || op == 0xe9 || op == 0xeb) /* call,jmp */\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, op == 0xe8 ? \"call \" : \"jmp \");\n\t\t\t\t\tif (op == 0xeb)\n\t\t\t\t\t\t_nmd_append_relative_address8(&si);\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_append_relative_address16_32(&si);\n\t\t\t\t}\n\t\t\t\telse if (op >= 0xA0 && op < 0xA4) /* mov [a0, a4] */\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, \"mov \");\n\t\t\t\t\tif (op == 0xa0)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_append_string(&si, \"al,\");\n\t\t\t\t\t\t_nmd_append_modrm_memory_prefix(&si, \"byte\");\n\t\t\t\t\t\t*si.buffer++ = '[';\n\t\t\t\t\t\t_nmd_append_number(&si, (instruction->prefixes & NMD_X86_PREFIXES_ADDRESS_SIZE_OVERRIDE || instruction->mode == NMD_X86_MODE_16 ? 0xFFFF : 0xFFFFFFFFFFFFFFFF) & instruction->immediate);\n\t\t\t\t\t\t*si.buffer++ = ']';\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xa1)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_append_string(&si, instruction->rex_w_prefix ? \"rax,\" : (opszprfx ? \"ax,\" : \"eax,\"));\n\t\t\t\t\t\t_nmd_append_modrm_memory_prefix(&si, instruction->rex_w_prefix ? \"qword\" : (opszprfx ? \"word\" : \"dword\"));\n\t\t\t\t\t\t*si.buffer++ = '[';\n\t\t\t\t\t\t_nmd_append_number(&si, (instruction->prefixes & NMD_X86_PREFIXES_ADDRESS_SIZE_OVERRIDE || instruction->mode == NMD_X86_MODE_16 ? 0xFFFF : 0xFFFFFFFFFFFFFFFF) & instruction->immediate);\n\t\t\t\t\t\t*si.buffer++ = ']';\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xa2)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_append_modrm_memory_prefix(&si, \"byte\");\n\t\t\t\t\t\t*si.buffer++ = '[';\n\t\t\t\t\t\t_nmd_append_number(&si, (instruction->prefixes & NMD_X86_PREFIXES_ADDRESS_SIZE_OVERRIDE || instruction->mode == NMD_X86_MODE_16 ? 0xFFFF : 0xFFFFFFFFFFFFFFFF) & instruction->immediate);\n\t\t\t\t\t\t_nmd_append_string(&si, \"],al\");\n\t\t\t\t\t}\n\t\t\t\t\telse if (op == 0xa3)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_append_modrm_memory_prefix(&si, instruction->rex_w_prefix ? \"qword\" : (opszprfx ? \"word\" : \"dword\"));\n\t\t\t\t\t\t*si.buffer++ = '[';\n\t\t\t\t\t\t_nmd_append_number(&si, (instruction->prefixes & NMD_X86_PREFIXES_ADDRESS_SIZE_OVERRIDE || instruction->mode == NMD_X86_MODE_16 ? 0xFFFF : 0xFFFFFFFFFFFFFFFF) & instruction->immediate);\n\t\t\t\t\t\t_nmd_append_string(&si, \"],\");\n\t\t\t\t\t\t_nmd_append_string(&si, instruction->rex_w_prefix ? \"rax\" : (opszprfx ? \"ax\" : \"eax\"));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(op == 0xcc) /* int3 */\n\t\t\t\t\t_nmd_append_string(&si, \"int3\");\n\t\t\t\telse if (op == 0x8d) /* lea */\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, \"lea \");\n\t\t\t\t\t_nmd_append_Gv(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_modrm_upper_without_address_specifier(&si);\n\t\t\t\t}\n\t\t\t\telse if (op == 0x8f) /* pop */\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, \"pop \");\n\t\t\t\t\tif (instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t\t_nmd_append_string(&si, (opszprfx ? _nmd_reg16 : _nmd_reg32)[instruction->modrm.fields.rm]);\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_append_modrm_upper(&si, instruction->mode == NMD_X86_MODE_64 && !(instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE) ? \"qword\" : (opszprfx ? \"word\" : \"dword\"));\n\t\t\t\t}\n\t\t\t\telse if (_NMD_R(op) == 7) /* conditional jump [70,7f]*/\n\t\t\t\t{\n\t\t\t\t\t*si.buffer++ = 'j';\n\t\t\t\t\t_nmd_append_string(&si, _nmd_condition_suffixes[_NMD_C(op)]);\n\t\t\t\t\t*si.buffer++ = ' ';\n\t\t\t\t\t_nmd_append_relative_address8(&si);\n\t\t\t\t}\n\t\t\t\telse if (op == 0xa8) /* test */\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, \"test al,\");\n\t\t\t\t\t_nmd_append_number(&si, instruction->immediate);\n\t\t\t\t}\n\t\t\t\telse if (op == 0xa9) /* test */\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, instruction->rex_w_prefix ? \"test rax\" : (opszprfx ? \"test ax\" : \"test eax\"));\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_number(&si, instruction->immediate);\n\t\t\t\t}\n\t\t\t\telse if (op == 0x90)\n\t\t\t\t{\n\t\t\t\t\tif (instruction->prefixes & NMD_X86_PREFIXES_REPEAT)\n\t\t\t\t\t\t_nmd_append_string(&si, \"pause\");\n\t\t\t\t\telse if (instruction->prefixes & NMD_X86_PREFIXES_REX_B)\n\t\t\t\t\t\t_nmd_append_string(&si, instruction->prefixes & NMD_X86_PREFIXES_REX_W ? \"xchg r8,rax\" : \"xchg r8d,eax\");\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_append_string(&si, \"nop\");\n\t\t\t\t}\n\t\t\t\telse if(op == 0xc3)\n\t\t\t\t\t_nmd_append_string(&si, \"ret\");\n\t\t\t\telse if (_NMD_R(op) == 0xb) /* mov [b0, bf] */\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, \"mov \");\n\t\t\t\t\tif (instruction->prefixes & NMD_X86_PREFIXES_REX_B)\n\t\t\t\t\t\t_nmd_append_string(&si, _nmd_regrx[op % 8]), * si.buffer++ = _NMD_C(op) < 8 ? 'b' : 'd';\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_append_string(&si, (_NMD_C(op) < 8 ? (instruction->has_rex ? _nmd_reg8_x64 : _nmd_reg8) : (instruction->rex_w_prefix ? _nmd_reg64 : (opszprfx ? _nmd_reg16 : _nmd_reg32)))[op % 8]);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_number(&si, instruction->immediate);\n\t\t\t\t}\n\t\t\t\telse if (op == 0xfe) /* inc,dec */\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, instruction->modrm.fields.reg == 0b000 ? \"inc \" : \"dec \");\n\t\t\t\t\t_nmd_append_Eb(&si);\n\t\t\t\t}\n\t\t\t\telse if (op == 0xf6 || op == 0xf7) /* test,test,not,neg,mul,imul,div,idiv */\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, _nmd_opcode_extensions_grp3[instruction->modrm.fields.reg]);\n\t\t\t\t\t*si.buffer++ = ' ';\n\t\t\t\t\tif (op == 0xf6)\n\t\t\t\t\t\t_nmd_append_Eb(&si);\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_append_Ev(&si);\n\n\t\t\t\t\tif (instruction->modrm.fields.reg <= 0b001)\n\t\t\t\t\t{\n\t\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t\t_nmd_append_number(&si, instruction->immediate);\n\t\t\t\t\t}\n\t\t\t\t}\t\t\t\t\n\t\t\t\telse if (op == 0x69 || op == 0x6B)\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, \"imul \");\n\t\t\t\t\t_nmd_append_Gv(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_Ev(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\tif (op == 0x6b)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (si.flags & NMD_X86_FORMAT_FLAGS_SIGNED_NUMBER_MEMORY_VIEW && instruction->immediate >= 0x80)\n\t\t\t\t\t\t\t_nmd_append_signed_number_memory_view(&si);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t_nmd_append_signed_number(&si, (int8_t)instruction->immediate, false);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_append_number(&si, instruction->immediate);\n\t\t\t\t}\n\t\t\t\telse if (op >= 0x84 && op <= 0x87)\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, op > 0x85 ? \"xchg \" : \"test \");\n\t\t\t\t\tif (op % 2 == 0)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_append_Eb(&si);\n\t\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t\t_nmd_append_Gb(&si);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_append_Ev(&si);\n\t\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t\t_nmd_append_Gv(&si);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (op == 0x8e)\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, \"mov \");\n\t\t\t\t\t_nmd_append_string(&si, _nmd_segment_reg[instruction->modrm.fields.reg]);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_Ew(&si);\n\t\t\t\t}\n\t\t\t\telse if (op >= 0x91 && op <= 0x97)\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, \"xchg \");\n\t\t\t\t\tif (instruction->prefixes & NMD_X86_PREFIXES_REX_B)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_append_string(&si, _nmd_regrx[_NMD_C(op)]);\n\t\t\t\t\t\tif (!(instruction->prefixes & NMD_X86_PREFIXES_REX_W))\n\t\t\t\t\t\t\t*si.buffer++ = 'd';\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_append_string(&si, (instruction->prefixes & NMD_X86_PREFIXES_REX_W ? _nmd_reg64 : (opszprfx ? _nmd_reg16 : _nmd_reg32))[_NMD_C(op)]);\n\t\t\t\t\t_nmd_append_string(&si, (instruction->prefixes & NMD_X86_PREFIXES_REX_W ? \",rax\" : (opszprfx ? \",ax\" : \",eax\")));\n\t\t\t\t}\n\t\t\t\telse if (op == 0x9A)\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, \"call far \");\n\t\t\t\t\t_nmd_append_number(&si, (uint64_t)(*(uint16_t*)((char*)(&instruction->immediate) + (instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? 2 : 4))));\n\t\t\t\t\t*si.buffer++ = ':';\n\t\t\t\t\t_nmd_append_number(&si, (uint64_t)(opszprfx ? *((uint16_t*)(&instruction->immediate)) : *((uint32_t*)(&instruction->immediate))));\n\t\t\t\t}\n\t\t\t\telse if ((op >= 0x6c && op <= 0x6f) || (op >= 0xa4 && op <= 0xa7) || (op >= 0xaa && op <= 0xaf))\n\t\t\t\t{\n\t\t\t\t\tif (instruction->prefixes & NMD_X86_PREFIXES_REPEAT)\n\t\t\t\t\t\t_nmd_append_string(&si, \"rep \");\n\t\t\t\t\telse if (instruction->prefixes & NMD_X86_PREFIXES_REPEAT_NOT_ZERO)\n\t\t\t\t\t\t_nmd_append_string(&si, \"repne \");\n\n\t\t\t\t\tconst char* str = 0;\n\t\t\t\t\tswitch (op)\n\t\t\t\t\t{\n\t\t\t\t\tcase 0x6c: case 0x6d: str = \"ins\"; break;\n\t\t\t\t\tcase 0x6e: case 0x6f: str = \"outs\"; break;\n\t\t\t\t\tcase 0xa4: case 0xa5: str = \"movs\"; break;\n\t\t\t\t\tcase 0xa6: case 0xa7: str = \"cmps\"; break;\n\t\t\t\t\tcase 0xaa: case 0xab: str = \"stos\"; break;\n\t\t\t\t\tcase 0xac: case 0xad: str = \"lods\"; break;\n\t\t\t\t\tcase 0xae: case 0xaf: str = \"scas\"; break;\n\t\t\t\t\t}\n\t\t\t\t\t_nmd_append_string(&si, str);\n\t\t\t\t\t*si.buffer++ = (op % 2 == 0) ? 'b' : (opszprfx ? 'w' : 'd');\n\t\t\t\t}\n\t\t\t\telse if (op == 0xC0 || op == 0xC1 || (_NMD_R(op) == 0xd && _NMD_C(op) < 4))\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, _nmd_opcode_extensions_grp2[instruction->modrm.fields.reg]);\n\t\t\t\t\t*si.buffer++ = ' ';\n\t\t\t\t\tif (op % 2 == 0)\n\t\t\t\t\t\t_nmd_append_Eb(&si);\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_append_Ev(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\tif (_NMD_R(op) == 0xc)\n\t\t\t\t\t\t_nmd_append_number(&si, instruction->immediate);\n\t\t\t\t\telse if (_NMD_C(op) < 2)\n\t\t\t\t\t\t_nmd_append_number(&si, 1);\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_append_string(&si, \"cl\");\n\t\t\t\t}\n\t\t\t\telse if (op == 0xc2)\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, \"ret \");\n\t\t\t\t\t_nmd_append_number(&si, instruction->immediate);\n\t\t\t\t}\n\t\t\t\telse if (op >= 0xe0 && op <= 0xe3)\n\t\t\t\t{\n\t\t\t\t\tconst char* mnemonics[] = { \"loopne\", \"loope\", \"loop\" };\n\t\t\t\t\t_nmd_append_string(&si, op == 0xe3 ? (instruction->mode == NMD_X86_MODE_64 ? \"jrcxz\" : \"jecxz\") : mnemonics[_NMD_C(op)]);\n\t\t\t\t\t*si.buffer++ = ' ';\n\t\t\t\t\t_nmd_append_relative_address8(&si);\n\t\t\t\t}\n\t\t\t\telse if (op == 0xea)\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, \"jmp far \");\n\t\t\t\t\t_nmd_append_number(&si, (uint64_t)(*(uint16_t*)(((uint8_t*)(&instruction->immediate) + 4))));\n\t\t\t\t\t*si.buffer++ = ':';\n\t\t\t\t\t_nmd_append_number(&si, (uint64_t)(*(uint32_t*)(&instruction->immediate)));\n\t\t\t\t}\n\t\t\t\telse if (op == 0xca)\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, \"retf \");\n\t\t\t\t\t_nmd_append_number(&si, instruction->immediate);\n\t\t\t\t}\n\t\t\t\telse if (op == 0xcd)\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, \"int \");\n\t\t\t\t\t_nmd_append_number(&si, instruction->immediate);\n\t\t\t\t}\n\t\t\t\telse if (op == 0x63)\n\t\t\t\t{\n\t\t\t\t\tif (instruction->mode == NMD_X86_MODE_64)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_append_string(&si, \"movsxd \");\n\t\t\t\t\t\t_nmd_append_string(&si, (instruction->mode == NMD_X86_MODE_64 ? (instruction->prefixes & NMD_X86_PREFIXES_REX_R ? _nmd_regrx : _nmd_reg64) : (opszprfx ? _nmd_reg16 : _nmd_reg32))[instruction->modrm.fields.reg]);\n\t\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t\tif (instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (instruction->prefixes & NMD_X86_PREFIXES_REX_B)\n\t\t\t\t\t\t\t\t_nmd_append_string(&si, _nmd_regrx[instruction->modrm.fields.rm]), * si.buffer++ = 'd';\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t_nmd_append_string(&si, ((instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE && instruction->mode == NMD_X86_MODE_32) || (instruction->mode == NMD_X86_MODE_16 && !(instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)) ? _nmd_reg16 : _nmd_reg32)[instruction->modrm.fields.rm]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t_nmd_append_modrm_upper(&si, (instruction->rex_w_prefix && !(instruction->prefixes & NMD_X86_PREFIXES_REX_W)) ? \"qword\" : ((instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE && instruction->mode == NMD_X86_MODE_32) || (instruction->mode == NMD_X86_MODE_16 && !(instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)) ? \"word\" : \"dword\"));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_append_string(&si, \"arpl \");\n\t\t\t\t\t\t_nmd_append_Ew(&si);\n\t\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t\t_nmd_append_Gw(&si);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (op == 0xc4 || op == 0xc5)\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, op == 0xc4 ? \"les\" : \"lds\");\n\t\t\t\t\t*si.buffer++ = ' ';\n\t\t\t\t\t_nmd_append_Gv(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\tif (si.instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t\t_nmd_append_string(&si, (si.instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? _nmd_reg16 : _nmd_reg32)[si.instruction->modrm.fields.rm]);\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_append_modrm_upper(&si, si.instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? \"dword\" : \"fword\");\n\t\t\t\t}\n\t\t\t\telse if (op == 0xc6 || op == 0xc7)\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, instruction->modrm.fields.reg == 0b000 ? \"mov \" : (op == 0xc6 ? \"xabort \" : \"xbegin \"));\n\t\t\t\t\tif (instruction->modrm.fields.reg == 0b111)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (op == 0xc6)\n\t\t\t\t\t\t\t_nmd_append_number(&si, instruction->immediate);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t_nmd_append_relative_address16_32(&si);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (op == 0xc6)\n\t\t\t\t\t\t\t_nmd_append_Eb(&si);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t_nmd_append_Ev(&si);\n\t\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t\t_nmd_append_number(&si, instruction->immediate);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (op == 0xc8)\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, \"enter \");\n\t\t\t\t\t_nmd_append_number(&si, (uint64_t)(*(uint16_t*)(&instruction->immediate)));\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_number(&si, (uint64_t)(*((uint8_t*)(&instruction->immediate) + 2)));\n\t\t\t\t}\t\t\t\t\n\t\t\t\telse if (op == 0xd4)\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, \"aam \");\n\t\t\t\t\t_nmd_append_number(&si, instruction->immediate);\n\t\t\t\t}\n\t\t\t\telse if (op == 0xd5)\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, \"aad \");\n\t\t\t\t\t_nmd_append_number(&si, instruction->immediate);\n\t\t\t\t}\n\t\t\t\telse if (op >= 0xd8 && op <= 0xdf)\n\t\t\t\t{\n\t\t\t\t\t*si.buffer++ = 'f';\n\n\t\t\t\t\tif (instruction->modrm.modrm < 0xc0)\n\t\t\t\t\t{\n\t\t\t\t\t\t_nmd_append_string(&si, _nmd_escape_opcodes[_NMD_C(op) - 8][instruction->modrm.fields.reg]);\n\t\t\t\t\t\t*si.buffer++ = ' ';\n\t\t\t\t\t\tswitch (op)\n\t\t\t\t\t\t{\n\t\t\t\t\t\tcase 0xd8: case 0xda: _nmd_append_modrm_upper(&si, \"dword\"); break;\n\t\t\t\t\t\tcase 0xd9: _nmd_append_modrm_upper(&si, instruction->modrm.fields.reg & 0b100 ? (instruction->modrm.fields.reg & 0b001 ? \"word\" : (instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? \"m14\" : \"m28\")) : \"dword\"); break;\n\t\t\t\t\t\tcase 0xdb: _nmd_append_modrm_upper(&si, instruction->modrm.fields.reg & 0b100 ? \"tbyte\" : \"dword\"); break;\n\t\t\t\t\t\tcase 0xdc: _nmd_append_modrm_upper(&si, \"qword\"); break;\n\t\t\t\t\t\tcase 0xdd: _nmd_append_modrm_upper(&si, instruction->modrm.fields.reg & 0b100 ? ((instruction->modrm.fields.reg & 0b111) == 0b111 ? \"word\" : \"byte\") : \"qword\"); break;\n\t\t\t\t\t\tcase 0xde: _nmd_append_modrm_upper(&si, \"word\"); break;\n\t\t\t\t\t\tcase 0xdf: _nmd_append_modrm_upper(&si, instruction->modrm.fields.reg & 0b100 ? (instruction->modrm.fields.reg & 0b001 ? \"qword\" : \"tbyte\") : \"word\"); break;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tswitch (op)\n\t\t\t\t\t\t{\n\t\t\t\t\t\tcase 0xd8:\n\t\t\t\t\t\t\t_nmd_append_string(&si, _nmd_escape_opcodesD8[(_NMD_R(instruction->modrm.modrm) - 0xc) * 2 + (_NMD_C(instruction->modrm.modrm) > 7 ? 1 : 0)]);\n\t\t\t\t\t\t\t_nmd_append_string(&si, \" st(0),st(\");\n\t\t\t\t\t\t\t*si.buffer++ = (char)('0' + instruction->modrm.modrm % 8), * si.buffer++ = ')';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 0xd9:\n\t\t\t\t\t\t\tif (_NMD_R(instruction->modrm.modrm) == 0xc)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t_nmd_append_string(&si, _NMD_C(instruction->modrm.modrm) < 8 ? \"ld\" : \"xch\");\n\t\t\t\t\t\t\t\t_nmd_append_string(&si, \" st(0),st(\");\n\t\t\t\t\t\t\t\t*si.buffer++ = (char)('0' + instruction->modrm.modrm % 8), * si.buffer++ = ')';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (instruction->modrm.modrm >= 0xd8 && instruction->modrm.modrm <= 0xdf)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t_nmd_append_string(&si, \"stpnce st(\");\n\t\t\t\t\t\t\t\t*si.buffer++ = (char)('0' + instruction->modrm.modrm % 8);\n\t\t\t\t\t\t\t\t_nmd_append_string(&si, \"),st(0)\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tconst char* str = 0;\n\t\t\t\t\t\t\t\tswitch (instruction->modrm.modrm)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcase 0xd0: str = \"nop\"; break;\n\t\t\t\t\t\t\t\tcase 0xe0: str = \"chs\"; break;\n\t\t\t\t\t\t\t\tcase 0xe1: str = \"abs\"; break;\n\t\t\t\t\t\t\t\tcase 0xe4: str = \"tst\"; break;\n\t\t\t\t\t\t\t\tcase 0xe5: str = \"xam\"; break;\n\t\t\t\t\t\t\t\tcase 0xe8: str = \"ld1\"; break;\n\t\t\t\t\t\t\t\tcase 0xe9: str = \"ldl2t\"; break;\n\t\t\t\t\t\t\t\tcase 0xea: str = \"ldl2e\"; break;\n\t\t\t\t\t\t\t\tcase 0xeb: str = \"ldpi\"; break;\n\t\t\t\t\t\t\t\tcase 0xec: str = \"ldlg2\"; break;\n\t\t\t\t\t\t\t\tcase 0xed: str = \"ldln2\"; break;\n\t\t\t\t\t\t\t\tcase 0xee: str = \"ldz\"; break;\n\t\t\t\t\t\t\t\tcase 0xf0: str = \"2xm1\"; break;\n\t\t\t\t\t\t\t\tcase 0xf1: str = \"yl2x\"; break;\n\t\t\t\t\t\t\t\tcase 0xf2: str = \"ptan\"; break;\n\t\t\t\t\t\t\t\tcase 0xf3: str = \"patan\"; break;\n\t\t\t\t\t\t\t\tcase 0xf4: str = \"xtract\"; break;\n\t\t\t\t\t\t\t\tcase 0xf5: str = \"prem1\"; break;\n\t\t\t\t\t\t\t\tcase 0xf6: str = \"decstp\"; break;\n\t\t\t\t\t\t\t\tcase 0xf7: str = \"incstp\"; break;\n\t\t\t\t\t\t\t\tcase 0xf8: str = \"prem\"; break;\n\t\t\t\t\t\t\t\tcase 0xf9: str = \"yl2xp1\"; break;\n\t\t\t\t\t\t\t\tcase 0xfa: str = \"sqrt\"; break;\n\t\t\t\t\t\t\t\tcase 0xfb: str = \"sincos\"; break;\n\t\t\t\t\t\t\t\tcase 0xfc: str = \"rndint\"; break;\n\t\t\t\t\t\t\t\tcase 0xfd: str = \"scale\"; break;\n\t\t\t\t\t\t\t\tcase 0xfe: str = \"sin\"; break;\n\t\t\t\t\t\t\t\tcase 0xff: str = \"cos\"; break;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t_nmd_append_string(&si, str);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 0xda:\n\t\t\t\t\t\t\tif (instruction->modrm.modrm == 0xe9)\n\t\t\t\t\t\t\t\t_nmd_append_string(&si, \"ucompp\");\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tconst char* mnemonics[4] = { \"cmovb\", \"cmovbe\", \"cmove\", \"cmovu\" };\n\t\t\t\t\t\t\t\t_nmd_append_string(&si, mnemonics[(_NMD_R(instruction->modrm.modrm) - 0xc) + (_NMD_C(instruction->modrm.modrm) > 7 ? 2 : 0)]);\n\t\t\t\t\t\t\t\t_nmd_append_string(&si, \" st(0),st(\");\n\t\t\t\t\t\t\t\t*si.buffer++ = (char)('0' + instruction->modrm.modrm % 8);\n\t\t\t\t\t\t\t\t*si.buffer++ = ')';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 0xdb:\n\t\t\t\t\t\t\tif (_NMD_R(instruction->modrm.modrm) == 0xe && _NMD_C(instruction->modrm.modrm) < 8)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tconst char* mnemonics[] = { \"eni8087_nop\", \"disi8087_nop\", \"nclex\", \"ninit\", \"setpm287_nop\" };\n\t\t\t\t\t\t\t\t_nmd_append_string(&si, mnemonics[_NMD_C(instruction->modrm.modrm)]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (instruction->modrm.modrm >= 0xe0)\n\t\t\t\t\t\t\t\t\t_nmd_append_string(&si, instruction->modrm.modrm < 0xf0 ? \"ucomi\" : \"comi\");\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t_nmd_append_string(&si, \"cmovn\");\n\t\t\t\t\t\t\t\t\tif (instruction->modrm.modrm < 0xc8)\n\t\t\t\t\t\t\t\t\t\t*si.buffer++ = 'b';\n\t\t\t\t\t\t\t\t\telse if (instruction->modrm.modrm < 0xd0)\n\t\t\t\t\t\t\t\t\t\t*si.buffer++ = 'e';\n\t\t\t\t\t\t\t\t\telse if (instruction->modrm.modrm >= 0xd8)\n\t\t\t\t\t\t\t\t\t\t*si.buffer++ = 'u';\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\t_nmd_append_string(&si, \"be\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t_nmd_append_string(&si, \" st(0),st(\");\n\t\t\t\t\t\t\t\t*si.buffer++ = (char)('0' + instruction->modrm.modrm % 8);\n\t\t\t\t\t\t\t\t*si.buffer++ = ')';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 0xdc:\n\t\t\t\t\t\t\tif (_NMD_R(instruction->modrm.modrm) == 0xc)\n\t\t\t\t\t\t\t\t_nmd_append_string(&si, _NMD_C(instruction->modrm.modrm) > 7 ? \"mul\" : \"add\");\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t_nmd_append_string(&si, _NMD_R(instruction->modrm.modrm) == 0xd ? \"com\" : (_NMD_R(instruction->modrm.modrm) == 0xe ? \"subr\" : \"div\"));\n\t\t\t\t\t\t\t\tif (_NMD_R(instruction->modrm.modrm) == 0xd && _NMD_C(instruction->modrm.modrm) >= 8)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tif (_NMD_R(instruction->modrm.modrm) >= 8)\n\t\t\t\t\t\t\t\t\t\t*si.buffer++ = 'p';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tif (_NMD_R(instruction->modrm.modrm) < 8)\n\t\t\t\t\t\t\t\t\t\t*si.buffer++ = 'r';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (_NMD_R(instruction->modrm.modrm) == 0xd)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t_nmd_append_string(&si, \" st(0),st(\");\n\t\t\t\t\t\t\t\t*si.buffer++ = (char)('0' + instruction->modrm.modrm % 8);\n\t\t\t\t\t\t\t\t*si.buffer++ = ')';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t_nmd_append_string(&si, \" st(\");\n\t\t\t\t\t\t\t\t*si.buffer++ = (char)('0' + instruction->modrm.modrm % 8);\n\t\t\t\t\t\t\t\t_nmd_append_string(&si, \"),st(0)\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 0xdd:\n\t\t\t\t\t\t\tif (_NMD_R(instruction->modrm.modrm) == 0xc)\n\t\t\t\t\t\t\t\t_nmd_append_string(&si, _NMD_C(instruction->modrm.modrm) < 8 ? \"free\" : \"xch\");\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t_nmd_append_string(&si, instruction->modrm.modrm < 0xe0 ? \"st\" : \"ucom\");\n\t\t\t\t\t\t\t\tif (_NMD_C(instruction->modrm.modrm) >= 8)\n\t\t\t\t\t\t\t\t\t*si.buffer++ = 'p';\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_nmd_append_string(&si, \" st(\");\n\t\t\t\t\t\t\t*si.buffer++ = (char)('0' + instruction->modrm.modrm % 8);\n\t\t\t\t\t\t\t*si.buffer++ = ')';\n\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 0xde:\n\t\t\t\t\t\t\tif (instruction->modrm.modrm == 0xd9)\n\t\t\t\t\t\t\t\t_nmd_append_string(&si, \"compp\");\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (instruction->modrm.modrm >= 0xd0 && instruction->modrm.modrm <= 0xd7)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t_nmd_append_string(&si, \"comp st(0),st(\");\n\t\t\t\t\t\t\t\t\t*si.buffer++ = (char)('0' + instruction->modrm.modrm % 8);\n\t\t\t\t\t\t\t\t\t*si.buffer++ = ')';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tif (_NMD_R(instruction->modrm.modrm) == 0xc)\n\t\t\t\t\t\t\t\t\t\t_nmd_append_string(&si, _NMD_C(instruction->modrm.modrm) < 8 ? \"add\" : \"mul\");\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t_nmd_append_string(&si, instruction->modrm.modrm < 0xf0 ? \"sub\" : \"div\");\n\t\t\t\t\t\t\t\t\t\tif (_NMD_R(instruction->modrm.modrm) < 8 || (_NMD_R(instruction->modrm.modrm) >= 0xe && _NMD_C(instruction->modrm.modrm) < 8))\n\t\t\t\t\t\t\t\t\t\t\t*si.buffer++ = 'r';\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t_nmd_append_string(&si, \"p st(\");\n\t\t\t\t\t\t\t\t\t*si.buffer++ = (char)('0' + instruction->modrm.modrm % 8);\n\t\t\t\t\t\t\t\t\t_nmd_append_string(&si, \"),st(0)\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 0xdf:\n\t\t\t\t\t\t\tif (instruction->modrm.modrm == 0xe0)\n\t\t\t\t\t\t\t\t_nmd_append_string(&si, \"nstsw ax\");\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (instruction->modrm.modrm >= 0xe8)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tif (instruction->modrm.modrm < 0xf0)\n\t\t\t\t\t\t\t\t\t\t*si.buffer++ = 'u';\n\t\t\t\t\t\t\t\t\t_nmd_append_string(&si, \"comip\");\n\t\t\t\t\t\t\t\t\t_nmd_append_string(&si, \" st(0),st(\");\n\t\t\t\t\t\t\t\t\t*si.buffer++ = (char)('0' + instruction->modrm.modrm % 8);\n\t\t\t\t\t\t\t\t\t*si.buffer++ = ')';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t_nmd_append_string(&si, instruction->modrm.modrm < 0xc8 ? \"freep\" : (instruction->modrm.modrm >= 0xd0 ? \"stp\" : \"xch\"));\n\t\t\t\t\t\t\t\t\t_nmd_append_string(&si, \" st(\");\n\t\t\t\t\t\t\t\t\t*si.buffer++ = (char)('0' + instruction->modrm.modrm % 8);\n\t\t\t\t\t\t\t\t\t*si.buffer++ = ')';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (op == 0xe4 || op == 0xe5)\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, \"in \");\n\t\t\t\t\t_nmd_append_string(&si, op == 0xe4 ? \"al\" : (opszprfx ? \"ax\" : \"eax\"));\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_number(&si, instruction->immediate);\n\t\t\t\t}\n\t\t\t\telse if (op == 0xe6 || op == 0xe7)\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, \"out \");\n\t\t\t\t\t_nmd_append_number(&si, instruction->immediate);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_string(&si, op == 0xe6 ? \"al\" : (opszprfx ? \"ax\" : \"eax\"));\n\t\t\t\t}\t\t\t\t\n\t\t\t\telse if (op == 0xec || op == 0xed)\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, \"in \");\n\t\t\t\t\t_nmd_append_string(&si, op == 0xec ? \"al\" : (opszprfx ? \"ax\" : \"eax\"));\n\t\t\t\t\t_nmd_append_string(&si, \",dx\");\n\t\t\t\t}\n\t\t\t\telse if (op == 0xee || op == 0xef)\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, \"out dx,\");\n\t\t\t\t\t_nmd_append_string(&si, op == 0xee ? \"al\" : (opszprfx ? \"ax\" : \"eax\"));\n\t\t\t\t}\n\t\t\t\telse if (op == 0x62)\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, \"bound \");\n\t\t\t\t\t_nmd_append_Gv(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_modrm_upper(&si, opszprfx ? \"dword\" : \"qword\");\n\t\t\t\t}\n\t\t\t\telse /* Try to parse all opcodes not parsed by the checks above. */\n\t\t\t\t{\n\t\t\t\t\tconst char* str = 0;\n\t\t\t\t\tswitch (instruction->opcode)\n\t\t\t\t\t{\n\t\t\t\t\tcase 0x9c: \n\t\t\t\t\t{\n\t\t\t\t\t\tif (opszprfx)\n\t\t\t\t\t\t\tstr = (instruction->mode == NMD_X86_MODE_16) ? \"pushfd\" : \"pushf\";\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tstr = (instruction->mode == NMD_X86_MODE_16) ? \"pushf\" : ((instruction->mode == NMD_X86_MODE_32) ? \"pushfd\" : \"pushfq\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 0x9d:\n\t\t\t\t\t{\n\t\t\t\t\t\tif (opszprfx)\n\t\t\t\t\t\t\tstr = (instruction->mode == NMD_X86_MODE_16) ? \"popfd\" : \"popf\";\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tstr = (instruction->mode == NMD_X86_MODE_16) ? \"popf\" : ((instruction->mode == NMD_X86_MODE_32) ? \"popfd\" : \"popfq\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 0x60: str = _NMD_GET_BY_MODE_OPSZPRFX(instruction->mode, opszprfx, \"pusha\", \"pushad\"); break;\n\t\t\t\t\tcase 0x61: str = _NMD_GET_BY_MODE_OPSZPRFX(instruction->mode, opszprfx, \"popa\", \"popad\"); break;\n\t\t\t\t\tcase 0xcb: str = \"retf\"; break;\n\t\t\t\t\tcase 0xc9: str = \"leave\"; break;\n\t\t\t\t\tcase 0xf1: str = \"int1\"; break;\n\t\t\t\t\tcase 0x06: str = \"push es\"; break;\n\t\t\t\t\tcase 0x16: str = \"push ss\"; break;\n\t\t\t\t\tcase 0x1e: str = \"push ds\"; break;\n\t\t\t\t\tcase 0x0e: str = \"push cs\"; break;\n\t\t\t\t\tcase 0x07: str = \"pop es\"; break;\n\t\t\t\t\tcase 0x17: str = \"pop ss\"; break;\n\t\t\t\t\tcase 0x1f: str = \"pop ds\"; break;\n\t\t\t\t\tcase 0x27: str = \"daa\"; break;\n\t\t\t\t\tcase 0x37: str = \"aaa\"; break;\n\t\t\t\t\tcase 0x2f: str = \"das\"; break;\n\t\t\t\t\tcase 0x3f: str = \"aas\"; break;\n\t\t\t\t\tcase 0xd7: str = \"xlat\"; break;\n\t\t\t\t\tcase 0x9b: str = \"fwait\"; break;\n\t\t\t\t\tcase 0xf4: str = \"hlt\"; break;\n\t\t\t\t\tcase 0xf5: str = \"cmc\"; break;\n\t\t\t\t\tcase 0x9e: str = \"sahf\"; break;\n\t\t\t\t\tcase 0x9f: str = \"lahf\"; break;\n\t\t\t\t\tcase 0xce: str = \"into\"; break;\n\t\t\t\t\tcase 0xcf:\n\t\t\t\t\t\tif (instruction->rex_w_prefix)\n\t\t\t\t\t\t\tstr = \"iretq\";\n\t\t\t\t\t\telse if (instruction->mode == NMD_X86_MODE_16)\n\t\t\t\t\t\t\tstr = opszprfx ? \"iretd\" : \"iret\";\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tstr = opszprfx ? \"iret\" : \"iretd\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 0x98:\n\t\t\t\t\t\tif (instruction->prefixes & NMD_X86_PREFIXES_REX_W)\n\t\t\t\t\t\t\tstr = \"cdqe\";\n\t\t\t\t\t\telse if (instruction->mode == NMD_X86_MODE_16)\n\t\t\t\t\t\t\tstr = opszprfx ? \"cwde\" : \"cbw\";\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tstr = opszprfx ? \"cbw\" : \"cwde\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 0x99:\n\t\t\t\t\t\tif (instruction->prefixes & NMD_X86_PREFIXES_REX_W)\n\t\t\t\t\t\t\tstr = \"cqo\";\n\t\t\t\t\t\telse if (instruction->mode == NMD_X86_MODE_16)\n\t\t\t\t\t\t\tstr = opszprfx ? \"cdq\" : \"cwd\";\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tstr = opszprfx ? \"cwd\" : \"cdq\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 0xd6: str = \"salc\"; break;\n\t\t\t\t\tcase 0xf8: str = \"clc\"; break;\n\t\t\t\t\tcase 0xf9: str = \"stc\"; break;\n\t\t\t\t\tcase 0xfa: str = \"cli\"; break;\n\t\t\t\t\tcase 0xfb: str = \"sti\"; break;\n\t\t\t\t\tcase 0xfc: str = \"cld\"; break;\n\t\t\t\t\tcase 0xfd: str = \"std\"; break;\n\t\t\t\t\tdefault: return;\n\t\t\t\t\t}\n\t\t\t\t\t_nmd_append_string(&si, str);\n\t\t\t\t}\n\t\t\t}\n\t}\n\telse if (instruction->opcode_map == NMD_X86_OPCODE_MAP_0F)\n\t{\n\t\tif (_NMD_R(op) == 8)\n\t\t{\n\t\t\t*si.buffer++ = 'j';\n\t\t\t_nmd_append_string(&si, _nmd_condition_suffixes[_NMD_C(op)]);\n\t\t\t*si.buffer++ = ' ';\n\t\t\t_nmd_append_relative_address16_32(&si);\n\t\t}\n\t\telse if(op == 0x05)\n\t\t\t_nmd_append_string(&si, \"syscall\");\n\t\telse if(op == 0xa2)\n\t\t\t_nmd_append_string(&si, \"cpuid\");\n\t\telse if (_NMD_R(op) == 4)\n\t\t{\n\t\t\t_nmd_append_string(&si, \"cmov\");\n\t\t\t_nmd_append_string(&si, _nmd_condition_suffixes[_NMD_C(op)]);\n\t\t\t*si.buffer++ = ' ';\n\t\t\t_nmd_append_Gv(&si);\n\t\t\t*si.buffer++ = ',';\n\t\t\t_nmd_append_Ev(&si);\n\t\t}\n\t\telse if (op >= 0x10 && op <= 0x17)\n\t\t{\n\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t{\n\t\t\t\tconst char* prefix66_mnemonics[] = { \"movupd\", \"movupd\", \"movlpd\", \"movlpd\", \"unpcklpd\", \"unpckhpd\", \"movhpd\", \"movhpd\" };\n\n\t\t\t\t_nmd_append_string(&si, prefix66_mnemonics[_NMD_C(op)]);\n\t\t\t\t*si.buffer++ = ' ';\n\n\t\t\t\tswitch (_NMD_C(op))\n\t\t\t\t{\n\t\t\t\tcase 0:\n\t\t\t\t\t_nmd_append_Vx(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_W(&si);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 1:\n\t\t\t\t\t_nmd_append_W(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_Vx(&si);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\tcase 6:\n\t\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\tif (si.instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t\t_nmd_append_string(&si, \"xmm\"), * si.buffer++ = (char)('0' + si.instruction->modrm.fields.rm);\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_append_modrm_upper(&si, \"qword\");\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT)\n\t\t\t{\n\t\t\t\tconst char* prefixF3_mnemonics[] = { \"movss\", \"movss\", \"movsldup\", 0, 0, 0, \"movshdup\" };\n\n\t\t\t\t_nmd_append_string(&si, prefixF3_mnemonics[_NMD_C(op)]);\n\t\t\t\t*si.buffer++ = ' ';\n\n\t\t\t\tswitch (_NMD_C(op))\n\t\t\t\t{\n\t\t\t\tcase 0:\n\t\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\tif (si.instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t\t_nmd_append_string(&si, \"xmm\"), * si.buffer++ = (char)('0' + si.instruction->modrm.fields.rm);\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_append_modrm_upper(&si, \"dword\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase 1:\n\t\t\t\t\tif (si.instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t\t_nmd_append_string(&si, \"xmm\"), * si.buffer++ = (char)('0' + si.instruction->modrm.fields.rm);\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_append_modrm_upper(&si, \"dword\");\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\tcase 6:\n\t\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_W(&si);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO)\n\t\t\t{\n\t\t\t\tconst char* prefixF2_mnemonics[] = { \"movsd\", \"movsd\", \"movddup\" };\n\n\t\t\t\t_nmd_append_string(&si, prefixF2_mnemonics[_NMD_C(op)]);\n\t\t\t\t*si.buffer++ = ' ';\n\n\t\t\t\tswitch (_NMD_C(op))\n\t\t\t\t{\n\t\t\t\tcase 0:\n\t\t\t\tcase 2:\n\t\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\tif (si.instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t\t_nmd_append_string(&si, \"xmm\"), * si.buffer++ = (char)('0' + si.instruction->modrm.fields.rm);\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_append_modrm_upper(&si, \"qword\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase 1:\n\t\t\t\t\tif (si.instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t\t_nmd_append_string(&si, \"xmm\"), * si.buffer++ = (char)('0' + si.instruction->modrm.fields.rm);\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_append_modrm_upper(&si, \"qword\");\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tconst char* no_prefix_mnemonics[] = { \"movups\", \"movups\", \"movlps\", \"movlps\", \"unpcklps\", \"unpckhps\", \"movhps\", \"movhps\" };\n\n\t\t\t\tif (op == 0x12 && instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t_nmd_append_string(&si, \"movhlps\");\n\t\t\t\telse if (op == 0x16 && instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t_nmd_append_string(&si, \"movlhps\");\n\t\t\t\telse\n\t\t\t\t\t_nmd_append_string(&si, no_prefix_mnemonics[_NMD_C(op)]);\n\t\t\t\t*si.buffer++ = ' ';\n\n\t\t\t\tswitch (_NMD_C(op))\n\t\t\t\t{\n\t\t\t\tcase 0:\n\t\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_W(&si);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 1:\n\t\t\t\t\t_nmd_append_W(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\tcase 6:\n\t\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\tif (si.instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t\t_nmd_append_string(&si, \"xmm\"), * si.buffer++ = (char)('0' + si.instruction->modrm.fields.rm);\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_append_modrm_upper(&si, \"qword\");\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tswitch (_NMD_C(op))\n\t\t\t{\n\t\t\tcase 3:\n\t\t\tcase 7:\n\t\t\t\tif (si.instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t_nmd_append_string(&si, \"xmm\"), * si.buffer++ = (char)('0' + si.instruction->modrm.fields.rm);\n\t\t\t\telse\n\t\t\t\t\t_nmd_append_modrm_upper(&si, \"qword\");\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\tcase 5:\n\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_W(&si);\n\t\t\t\tbreak;\n\t\t\t};\n\t\t}\n\t\telse if (_NMD_R(op) == 6 || (op >= 0x74 && op <= 0x76))\n\t\t{\n\t\t\tif (op == 0x6e)\n\t\t\t{\n\t\t\t\t_nmd_append_string(&si, \"movd \");\n\t\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t\t\t*si.buffer++ = 'x';\n\t\t\t\t_nmd_append_Pq(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\tif (si.instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t_nmd_append_string(&si, _nmd_reg32[si.instruction->modrm.fields.rm]);\n\t\t\t\telse\n\t\t\t\t\t_nmd_append_modrm_upper(&si, \"dword\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t\t{\n\t\t\t\t\tconst char* prefix66_mnemonics[] = { \"punpcklbw\", \"punpcklwd\", \"punpckldq\", \"packsswb\", \"pcmpgtb\", \"pcmpgtw\", \"pcmpgtd\", \"packuswb\", \"punpckhbw\", \"punpckhwd\", \"punpckhdq\", \"packssdw\", \"punpcklqdq\", \"punpckhqdq\", \"movd\", \"movdqa\" };\n\n\t\t\t\t\t_nmd_append_string(&si, op == 0x74 ? \"pcmpeqb\" : (op == 0x75 ? \"pcmpeqw\" : (op == 0x76 ? \"pcmpeqd\" : prefix66_mnemonics[op % 0x10])));\n\t\t\t\t\t*si.buffer++ = ' ';\n\t\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_W(&si);\n\t\t\t\t}\n\t\t\t\telse if (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT)\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, \"movdqu \");\n\t\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_W(&si);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tconst char* no_prefix_mnemonics[] = { \"punpcklbw\", \"punpcklwd\", \"punpckldq\", \"packsswb\", \"pcmpgtb\", \"pcmpgtw\", \"pcmpgtd\", \"packuswb\", \"punpckhbw\", \"punpckhwd\", \"punpckhdq\", \"packssdw\", 0, 0, \"movd\", \"movq\" };\n\n\t\t\t\t\t_nmd_append_string(&si, op == 0x74 ? \"pcmpeqb\" : (op == 0x75 ? \"pcmpeqw\" : (op == 0x76 ? \"pcmpeqd\" : no_prefix_mnemonics[op % 0x10])));\n\t\t\t\t\t*si.buffer++ = ' ';\n\t\t\t\t\t_nmd_append_Pq(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_Qq(&si);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (op == 0x00)\n\t\t{\n\t\t\t_nmd_append_string(&si, _nmd_opcode_extensions_grp6[instruction->modrm.fields.reg]);\n\t\t\t*si.buffer++ = ' ';\n\t\t\tif (_NMD_R(instruction->modrm.modrm) == 0xc)\n\t\t\t\t_nmd_append_Ev(&si);\n\t\t\telse\n\t\t\t\t_nmd_append_Ew(&si);\n\t\t}\n\t\telse if (op == 0x01)\n\t\t{\n\t\t\tif (instruction->modrm.fields.mod == 0b11)\n\t\t\t{\n\t\t\t\tif (instruction->modrm.fields.reg == 0b000)\n\t\t\t\t\t_nmd_append_string(&si, _nmd_opcode_extensions_grp7_reg0[instruction->modrm.fields.rm]);\n\t\t\t\telse if (instruction->modrm.fields.reg == 0b001)\n\t\t\t\t\t_nmd_append_string(&si, _nmd_opcode_extensions_grp7_reg1[instruction->modrm.fields.rm]);\n\t\t\t\telse if (instruction->modrm.fields.reg == 0b010)\n\t\t\t\t\t_nmd_append_string(&si, _nmd_opcode_extensions_grp7_reg2[instruction->modrm.fields.rm]);\n\t\t\t\telse if (instruction->modrm.fields.reg == 0b011)\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, _nmd_opcode_extensions_grp7_reg3[instruction->modrm.fields.rm]);\n\t\t\t\t\tif (instruction->modrm.fields.rm == 0b000 || instruction->modrm.fields.rm == 0b010 || instruction->modrm.fields.rm == 0b111)\n\t\t\t\t\t\t_nmd_append_string(&si, instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? \"ax\" : \"eax\");\n\n\t\t\t\t\tif (instruction->modrm.fields.rm == 0b111)\n\t\t\t\t\t\t_nmd_append_string(&si, \",ecx\");\n\t\t\t\t}\n\t\t\t\telse if (instruction->modrm.fields.reg == 0b100)\n\t\t\t\t\t_nmd_append_string(&si, \"smsw \"), _nmd_append_string(&si, (instruction->rex_w_prefix ? _nmd_reg64 : (instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? _nmd_reg16 : _nmd_reg32))[instruction->modrm.fields.rm]);\n\t\t\t\telse if (instruction->modrm.fields.reg == 0b101)\n\t\t\t\t{\n\t\t\t\t\tif (instruction->prefixes & NMD_X86_PREFIXES_REPEAT)\n\t\t\t\t\t\t_nmd_append_string(&si, instruction->modrm.fields.rm == 0b000 ? \"setssbsy\" : \"saveprevssp\");\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_append_string(&si, instruction->modrm.fields.rm == 0b111 ? \"wrpkru\" : \"rdpkru\");\n\t\t\t\t}\n\t\t\t\telse if (instruction->modrm.fields.reg == 0b110)\n\t\t\t\t\t_nmd_append_string(&si, \"lmsw \"), _nmd_append_string(&si, _nmd_reg16[instruction->modrm.fields.rm]);\n\t\t\t\telse if (instruction->modrm.fields.reg == 0b111)\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, _nmd_opcode_extensions_grp7_reg7[instruction->modrm.fields.rm]);\n\t\t\t\t\tif (instruction->modrm.fields.rm == 0b100)\n\t\t\t\t\t\t_nmd_append_string(&si, instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? \"ax\" : \"eax\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (instruction->modrm.fields.reg == 0b101)\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, \"rstorssp \");\n\t\t\t\t\t_nmd_append_modrm_upper(&si, \"qword\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, _nmd_opcode_extensions_grp7[instruction->modrm.fields.reg]);\n\t\t\t\t\t*si.buffer++ = ' ';\n\t\t\t\t\tif (si.instruction->modrm.fields.reg == 0b110)\n\t\t\t\t\t\t_nmd_append_Ew(&si);\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_append_modrm_upper(&si, si.instruction->modrm.fields.reg == 0b111 ? \"byte\" : si.instruction->modrm.fields.reg == 0b100 ? \"word\" : \"fword\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (op == 0x02 || op == 0x03)\n\t\t{\n\t\t\t_nmd_append_string(&si, op == 0x02 ? \"lar\" : \"lsl\");\n\t\t\t*si.buffer++ = ' ';\n\t\t\t_nmd_append_Gv(&si);\n\t\t\t*si.buffer++ = ',';\n\t\t\tif (si.instruction->modrm.fields.mod == 0b11)\n\t\t\t\t_nmd_append_string(&si, (opszprfx ? _nmd_reg16 : _nmd_reg32)[si.instruction->modrm.fields.rm]);\n\t\t\telse\n\t\t\t\t_nmd_append_modrm_upper(&si, \"word\");\n\t\t}\n\t\telse if (op == 0x0d)\n\t\t{\n\t\t\tif (instruction->modrm.fields.mod == 0b11)\n\t\t\t{\n\t\t\t\t_nmd_append_string(&si, \"nop \");\n\t\t\t\t_nmd_append_string(&si, (instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? _nmd_reg16 : _nmd_reg32)[instruction->modrm.fields.rm]);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_string(&si, (instruction->prefixes & NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? _nmd_reg16 : _nmd_reg32)[instruction->modrm.fields.reg]);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t_nmd_append_string(&si, \"prefetch\");\n\t\t\t\tif (instruction->modrm.fields.reg == 0b001)\n\t\t\t\t\t*si.buffer++ = 'w';\n\t\t\t\telse if (instruction->modrm.fields.reg == 0b010)\n\t\t\t\t\t_nmd_append_string(&si, \"wt1\");\n\n\t\t\t\t*si.buffer++ = ' ';\n\n\t\t\t\t_nmd_append_modrm_upper(&si, \"byte\");\n\t\t\t}\n\t\t}\t\n\t\telse if (op == 0x18)\n\t\t{\n\t\t\tif (instruction->modrm.fields.mod == 0b11 || instruction->modrm.fields.reg >= 0b100)\n\t\t\t{\n\t\t\t\t_nmd_append_string(&si, \"nop \");\n\t\t\t\t_nmd_append_Ev(&si);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (instruction->modrm.fields.reg == 0b000)\n\t\t\t\t\t_nmd_append_string(&si, \"prefetchnta\");\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, \"prefetcht\");\n\t\t\t\t\t*si.buffer++ = (char)('0' + (instruction->modrm.fields.reg - 1));\n\t\t\t\t}\n\t\t\t\t*si.buffer++ = ' ';\n\n\t\t\t\t_nmd_append_Eb(&si);\n\t\t\t}\n\t\t}\n\t\telse if (op == 0x19)\n\t\t{\n\t\t\t_nmd_append_string(&si, \"nop \");\n\t\t\t_nmd_append_Ev(&si);\n\t\t\t*si.buffer++ = ',';\n\t\t\t_nmd_append_Gv(&si);\n\t\t}\n\t\telse if (op == 0x1A)\n\t\t{\n\t\t\tif (instruction->modrm.fields.mod == 0b11)\n\t\t\t{\n\t\t\t\t_nmd_append_string(&si, \"nop \");\n\t\t\t\t_nmd_append_Ev(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_Gv(&si);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t\t\t_nmd_append_string(&si, \"bndmov\");\n\t\t\t\telse if (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT)\n\t\t\t\t\t_nmd_append_string(&si, \"bndcl\");\n\t\t\t\telse if (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO)\n\t\t\t\t\t_nmd_append_string(&si, \"bndcu\");\n\t\t\t\telse\n\t\t\t\t\t_nmd_append_string(&si, \"bndldx\");\n\n\t\t\t\t_nmd_append_string(&si, \" bnd\");\n\t\t\t\t*si.buffer++ = (char)('0' + instruction->modrm.fields.reg);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t\t\t*si.buffer++ = 'q';\n\t\t\t\t_nmd_append_Ev(&si);\n\t\t\t}\n\t\t}\n\t\telse if (op == 0x1B)\n\t\t{\n\t\t\tif (instruction->modrm.fields.mod == 0b11)\n\t\t\t{\n\t\t\t\t_nmd_append_string(&si, \"nop \");\n\t\t\t\t_nmd_append_Ev(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_Gv(&si);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t\t\t_nmd_append_string(&si, \"bndmov\");\n\t\t\t\telse if (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT)\n\t\t\t\t\t_nmd_append_string(&si, \"bndmk\");\n\t\t\t\telse if (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO)\n\t\t\t\t\t_nmd_append_string(&si, \"bndcn\");\n\t\t\t\telse\n\t\t\t\t\t_nmd_append_string(&si, \"bndstx\");\n\n\t\t\t\t*si.buffer++ = ' ';\n\t\t\t\t_nmd_append_Ev(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_string(&si, \"bnd\");\n\t\t\t\t*si.buffer++ = (char)('0' + instruction->modrm.fields.reg);\n\t\t\t}\n\t\t}\n\t\telse if (op >= 0x1c && op <= 0x1f)\n\t\t{\n\t\t\tif (op == 0x1e && instruction->modrm.modrm == 0xfa)\n\t\t\t\t_nmd_append_string(&si, \"endbr64\");\n\t\t\telse if (op == 0x1e && instruction->modrm.modrm == 0xfb)\n\t\t\t\t_nmd_append_string(&si, \"endbr32\");\n\t\t\telse\n\t\t\t{\n\t\t\t\t_nmd_append_string(&si, \"nop \");\n\t\t\t\t_nmd_append_Ev(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_Gv(&si);\n\t\t\t}\n\t\t}\n\t\telse if (op >= 0x20 && op <= 0x23)\n\t\t{\n\t\t\t_nmd_append_string(&si, \"mov \");\n\t\t\tif (op < 0x22)\n\t\t\t{\n\t\t\t\t_nmd_append_string(&si, (instruction->mode == NMD_X86_MODE_64 ? _nmd_reg64 : _nmd_reg32)[instruction->modrm.fields.rm]);\n\t\t\t\t_nmd_append_string(&si, op == 0x20 ? \",cr\" : \",dr\");\n\t\t\t\t*si.buffer++ = (char)('0' + instruction->modrm.fields.reg);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t_nmd_append_string(&si, op == 0x22 ? \"cr\" : \"dr\");\n\t\t\t\t*si.buffer++ = (char)('0' + instruction->modrm.fields.reg);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_string(&si, (instruction->mode == NMD_X86_MODE_64 ? _nmd_reg64 : _nmd_reg32)[instruction->modrm.fields.rm]);\n\t\t\t}\n\t\t}\n\t\telse if (op >= 0x28 && op <= 0x2f)\n\t\t{\n\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t{\n\t\t\t\tconst char* prefix66_mnemonics[] = { \"movapd\", \"movapd\", \"cvtpi2pd\", \"movntpd\", \"cvttpd2pi\", \"cvtpd2pi\", \"ucomisd\", \"comisd\" };\n\n\t\t\t\t_nmd_append_string(&si, prefix66_mnemonics[op % 8]);\n\t\t\t\t*si.buffer++ = ' ';\n\n\t\t\t\tswitch (op % 8)\n\t\t\t\t{\n\t\t\t\tcase 0:\n\t\t\t\t\t_nmd_append_Vx(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_W(&si);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 1:\n\t\t\t\t\t_nmd_append_W(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_Vx(&si);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_Qq(&si);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 4:\n\t\t\t\tcase 5:\n\t\t\t\t\t_nmd_append_Pq(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_W(&si);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 6:\n\t\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\tif (instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t\t_nmd_append_string(&si, \"xmm\"), * si.buffer++ = (char)('0' + instruction->modrm.fields.rm);\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_append_modrm_upper(&si, \"qword\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase 7:\n\t\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\tif (instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t\t_nmd_append_string(&si, \"xmm\"), * si.buffer++ = (char)('0' + instruction->modrm.fields.rm);\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_append_modrm_upper(&si, \"qword\");\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT)\n\t\t\t{\n\t\t\t\tconst char* prefixF3_mnemonics[] = { 0, 0, \"cvtsi2ss\", \"movntss\", \"cvttss2si\", \"cvtss2si\", 0, 0 };\n\n\t\t\t\t_nmd_append_string(&si, prefixF3_mnemonics[op % 8]);\n\t\t\t\t*si.buffer++ = ' ';\n\n\t\t\t\tswitch (op % 8)\n\t\t\t\t{\n\t\t\t\tcase 3:\n\t\t\t\t\t_nmd_append_modrm_upper(&si, \"dword\");\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 4:\n\t\t\t\tcase 5:\n\t\t\t\t\t_nmd_append_Gv(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\tif (instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t\t_nmd_append_Udq(&si);\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_append_modrm_upper(&si, \"dword\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\tcase 6:\n\t\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_Ev(&si);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO)\n\t\t\t{\n\t\t\t\tconst char* prefixF2_mnemonics[] = { 0, 0, \"cvtsi2sd\", \"movntsd\", \"cvttsd2si\", \"cvtsd2si\", 0, 0 };\n\n\t\t\t\t_nmd_append_string(&si, prefixF2_mnemonics[op % 8]);\n\t\t\t\t*si.buffer++ = ' ';\n\n\t\t\t\tswitch (op % 8)\n\t\t\t\t{\n\t\t\t\tcase 2:\n\t\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_Ev(&si);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3:\n\t\t\t\t\t_nmd_append_modrm_upper(&si, \"qword\");\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 4:\n\t\t\t\tcase 5:\n\t\t\t\t\t_nmd_append_Gv(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\tif (si.instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t\t_nmd_append_string(&si, \"xmm\"), * si.buffer++ = (char)('0' + si.instruction->modrm.fields.rm);\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_append_modrm_upper(&si, \"qword\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tconst char* no_prefix_mnemonics[] = { \"movaps\", \"movaps\", \"cvtpi2ps\", \"movntps\", \"cvttps2pi\", \"cvtps2pi\", \"ucomiss\", \"comiss\" };\n\n\t\t\t\t_nmd_append_string(&si, no_prefix_mnemonics[op % 8]);\n\t\t\t\t*si.buffer++ = ' ';\n\n\t\t\t\tswitch (op % 8)\n\t\t\t\t{\n\t\t\t\tcase 0:\n\t\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_W(&si);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 1:\n\t\t\t\t\t_nmd_append_W(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 4:\n\t\t\t\tcase 5:\n\t\t\t\t\t_nmd_append_Pq(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\tif (si.instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t\t_nmd_append_string(&si, \"xmm\"), * si.buffer++ = (char)('0' + si.instruction->modrm.fields.rm);\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_append_modrm_upper(&si, \"qword\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_Qq(&si);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 6:\n\t\t\t\tcase 7:\n\t\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\tif (si.instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t\t_nmd_append_string(&si, \"xmm\"), * si.buffer++ = (char)('0' + si.instruction->modrm.fields.rm);\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_append_modrm_upper(&si, \"dword\");\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tif (!(instruction->prefixes & (NMD_X86_PREFIXES_REPEAT | NMD_X86_PREFIXES_REPEAT_NOT_ZERO)) && (op % 8) == 3)\n\t\t\t{\n\t\t\t\t_nmd_append_modrm_upper(&si, \"xmmword\");\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t}\n\t\t}\n\t\telse if (_NMD_R(op) == 5)\n\t\t{\n\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t{\n\t\t\t\tconst char* prefix66_mnemonics[] = { \"movmskpd\", \"sqrtpd\", 0, 0, \"andpd\", \"andnpd\", \"orpd\", \"xorpd\", \"addpd\", \"mulpd\", \"cvtpd2ps\",  \"cvtps2dq\", \"subpd\", \"minpd\", \"divpd\", \"maxpd\" };\n\n\t\t\t\t_nmd_append_string(&si, prefix66_mnemonics[op % 0x10]);\n\t\t\t\t*si.buffer++ = ' ';\n\t\t\t\tif (op == 0x50)\n\t\t\t\t\t_nmd_append_string(&si, _nmd_reg32[instruction->modrm.fields.reg]);\n\t\t\t\telse\n\t\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_W(&si);\n\t\t\t}\n\t\t\telse if (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT)\n\t\t\t{\n\t\t\t\tconst char* prefixF3_mnemonics[] = { 0, \"sqrtss\", \"rsqrtss\", \"rcpss\", 0, 0, 0, 0, \"addss\", \"mulss\", \"cvtss2sd\", \"cvttps2dq\", \"subss\", \"minss\", \"divss\", \"maxss\" };\n\n\t\t\t\t_nmd_append_string(&si, prefixF3_mnemonics[op % 0x10]);\n\t\t\t\t*si.buffer++ = ' ';\n\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\tif (si.instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t_nmd_append_string(&si, \"xmm\"), * si.buffer++ = (char)('0' + si.instruction->modrm.fields.rm);\n\t\t\t\telse\n\t\t\t\t\t_nmd_append_modrm_upper(&si, op == 0x5b ? \"xmmword\" : \"dword\");\n\t\t\t}\n\t\t\telse if (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO)\n\t\t\t{\n\t\t\t\tconst char* prefixF2_mnemonics[] = { 0, \"sqrtsd\", 0, 0, 0, 0, 0, 0, \"addsd\", \"mulsd\", \"cvtsd2ss\", 0, \"subsd\", \"minsd\", \"divsd\", \"maxsd\" };\n\n\t\t\t\t_nmd_append_string(&si, prefixF2_mnemonics[op % 0x10]);\n\t\t\t\t*si.buffer++ = ' ';\n\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\tif (si.instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t_nmd_append_string(&si, \"xmm\"), * si.buffer++ = (char)('0' + si.instruction->modrm.fields.rm);\n\t\t\t\telse\n\t\t\t\t\t_nmd_append_modrm_upper(&si, \"qword\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tconst char* no_prefix_mnemonics[] = { \"movmskps\", \"sqrtps\", \"rsqrtps\", \"rcpps\", \"andps\", \"andnps\", \"orps\", \"xorps\", \"addps\", \"mulps\", \"cvtps2pd\",  \"cvtdq2ps\", \"subps\", \"minps\", \"divps\", \"maxps\" };\n\n\t\t\t\t_nmd_append_string(&si, no_prefix_mnemonics[op % 0x10]);\n\t\t\t\t*si.buffer++ = ' ';\n\t\t\t\tif (op == 0x50)\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, _nmd_reg32[instruction->modrm.fields.reg]);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_Udq(&si);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\tif (si.instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t\t_nmd_append_string(&si, \"xmm\"), * si.buffer++ = (char)('0' + si.instruction->modrm.fields.rm);\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_append_modrm_upper(&si, op == 0x5a ? \"qword\" : \"xmmword\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\t\t\n\t\telse if (op == 0x70)\n\t\t{\n\t\t\t_nmd_append_string(&si, instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? \"pshufd\" : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT ? \"pshufhw\" : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO ? \"pshuflw\" : \"pshufw\")));\n\t\t\t*si.buffer++ = ' ';\n\t\t\tif (!(instruction->prefixes & (NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE | NMD_X86_PREFIXES_REPEAT | NMD_X86_PREFIXES_REPEAT_NOT_ZERO)))\n\t\t\t{\n\t\t\t\t_nmd_append_Pq(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_Qq(&si);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_W(&si);\n\t\t\t}\n\n\t\t\t*si.buffer++ = ',';\n\t\t\t_nmd_append_number(&si, instruction->immediate);\n\t\t}\n\t\telse if (op >= 0x71 && op <= 0x73)\n\t\t{\n\t\t\tif (instruction->modrm.fields.reg % 2 == 1)\n\t\t\t\t_nmd_append_string(&si, instruction->modrm.fields.reg == 0b111 ? \"pslldq\" : \"psrldq\");\n\t\t\telse\n\t\t\t{\n\t\t\t\tconst char* mnemonics[] = { \"psrl\", \"psra\", \"psll\" };\n\t\t\t\t_nmd_append_string(&si, mnemonics[(instruction->modrm.fields.reg >> 1) - 1]);\n\t\t\t\t*si.buffer++ = op == 0x71 ? 'w' : (op == 0x72 ? 'd' : 'q');\n\t\t\t}\n\n\t\t\t*si.buffer++ = ' ';\n\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t\t_nmd_append_Udq(&si);\n\t\t\telse\n\t\t\t\t_nmd_append_Nq(&si);\n\t\t\t*si.buffer++ = ',';\n\t\t\t_nmd_append_number(&si, instruction->immediate);\n\t\t}\n\t\telse if (op == 0x78)\n\t\t{\n\t\t\tif (!instruction->simd_prefix)\n\t\t\t{\n\t\t\t\t_nmd_append_string(&si, \"vmread \");\n\t\t\t\t_nmd_append_Ey(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_Gy(&si);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t\t\t_nmd_append_string(&si, \"extrq \");\n\t\t\t\telse\n\t\t\t\t{ \n\t\t\t\t\t_nmd_append_string(&si, \"insertq \");\n\t\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t}\n\t\t\t\t_nmd_append_Udq(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_number(&si, instruction->immediate & 0x00FF);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_number(&si, (instruction->immediate & 0xFF00) >> 8);\n\t\t\t}\n\t\t}\n\t\telse if (op == 0x79)\n\t\t{\n\t\t\tif (!instruction->simd_prefix)\n\t\t\t{\n\t\t\t\t_nmd_append_string(&si, \"vmwrite \");\n\t\t\t\t_nmd_append_Gy(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_Ey(&si);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t_nmd_append_string(&si, instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? \"extrq \" : \"insertq \");\n\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_Udq(&si);\n\t\t\t}\n\n\t\t}\n\t\telse if (op == 0x7c || op == 0x7d)\n\t\t{\n\t\t\t_nmd_append_string(&si, op == 0x7c ? \"haddp\" : \"hsubp\");\n\t\t\t*si.buffer++ = instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? 'd' : 's';\n\t\t\t*si.buffer++ = ' ';\n\t\t\t_nmd_append_Vdq(&si);\n\t\t\t*si.buffer++ = ',';\n\t\t\t_nmd_append_W(&si);\n\t\t}\n\t\telse if (op == 0x7e)\n\t\t{\n\t\t\t_nmd_append_string(&si, instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT ? \"movq \" : \"movd \");\n\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT)\n\t\t\t{\n\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\tif (si.instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t_nmd_append_Udq(&si);\n\t\t\t\telse\n\t\t\t\t\t_nmd_append_modrm_upper(&si, \"qword\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (si.instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t_nmd_append_string(&si, _nmd_reg32[instruction->modrm.fields.rm]);\n\t\t\t\telse\n\t\t\t\t\t_nmd_append_modrm_upper(&si, \"dword\");\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\telse\n\t\t\t\t\t_nmd_append_Pq(&si);\n\t\t\t}\n\t\t}\n\t\telse if (op == 0x7f)\n\t\t{\n\t\t\t_nmd_append_string(&si, instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT ? \"movdqu\" : (instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? \"movdqa\" : \"movq\"));\n\t\t\t*si.buffer++ = ' ';\n\t\t\tif (instruction->prefixes & (NMD_X86_PREFIXES_REPEAT | NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE))\n\t\t\t{\n\t\t\t\t_nmd_append_W(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (si.instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t_nmd_append_Nq(&si);\n\t\t\t\telse\n\t\t\t\t\t_nmd_append_modrm_upper(&si, \"qword\");\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_Pq(&si);\n\t\t\t}\n\t\t}\t\t\n\t\telse if (_NMD_R(op) == 9)\n\t\t{\n\t\t\t_nmd_append_string(&si, \"set\");\n\t\t\t_nmd_append_string(&si, _nmd_condition_suffixes[_NMD_C(op)]);\n\t\t\t*si.buffer++ = ' ';\n\t\t\t_nmd_append_Eb(&si);\n\t\t}\n\t\telse if ((_NMD_R(op) == 0xA || _NMD_R(op) == 0xB) && op % 8 == 3)\n\t\t{\n\t\t\t_nmd_append_string(&si, op == 0xa3 ? \"bt\" : (op == 0xb3 ? \"btr\" : (op == 0xab ? \"bts\" : \"btc\")));\n\t\t\t*si.buffer++ = ' ';\n\t\t\t_nmd_append_Ev(&si);\n\t\t\t*si.buffer++ = ',';\n\t\t\t_nmd_append_Gv(&si);\n\t\t}\n\t\telse if (_NMD_R(op) == 0xA && (op % 8 == 4 || op % 8 == 5))\n\t\t{\n\t\t\t_nmd_append_string(&si, op > 0xA8 ? \"shrd\" : \"shld\");\n\t\t\t*si.buffer++ = ' ';\n\t\t\t_nmd_append_Ev(&si);\n\t\t\t*si.buffer++ = ',';\n\t\t\t_nmd_append_Gv(&si);\n\t\t\t*si.buffer++ = ',';\n\t\t\tif (op % 8 == 4)\n\t\t\t\t_nmd_append_number(&si, instruction->immediate);\n\t\t\telse\n\t\t\t\t_nmd_append_string(&si, \"cl\");\n\t\t}\n\t\telse if (op == 0xb4 || op == 0xb5)\n\t\t{\n\t\t\t_nmd_append_string(&si, op == 0xb4 ? \"lfs \" : \"lgs \");\n\t\t\t_nmd_append_Gv(&si);\n\t\t\t*si.buffer++ = ',';\n\t\t\t_nmd_append_modrm_upper(&si, \"fword\");\n\t\t}\n\t\telse if (op == 0xbc || op == 0xbd)\n\t\t{\n\t\t\t_nmd_append_string(&si, instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT ? (op == 0xbc ? \"tzcnt\" : \"lzcnt\") : (op == 0xbc ? \"bsf\" : \"bsr\"));\n\t\t\t*si.buffer++ = ' ';\n\t\t\t_nmd_append_Gv(&si);\n\t\t\t*si.buffer++ = ',';\n\t\t\t_nmd_append_Ev(&si);\n\t\t}\n\t\telse if (op == 0xa6)\n\t\t{\n\t\t\tconst char* mnemonics[] = { \"montmul\", \"xsha1\", \"xsha256\" };\n\t\t\t_nmd_append_string(&si, mnemonics[instruction->modrm.fields.reg]);\n\t\t}\n\t\telse if (op == 0xa7)\n\t\t{\n\t\t\tconst char* mnemonics[] = { \"xstorerng\", \"xcryptecb\", \"xcryptcbc\", \"xcryptctr\", \"xcryptcfb\", \"xcryptofb\" };\n\t\t\t_nmd_append_string(&si, mnemonics[instruction->modrm.fields.reg]);\n\t\t}\n\t\telse if (op == 0xae)\n\t\t{\n\t\t\tif (instruction->modrm.fields.mod == 0b11)\n\t\t\t{\n\t\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t\t\t_nmd_append_string(&si, \"pcommit\");\n\t\t\t\telse if (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT)\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, \"incsspd \");\n\t\t\t\t\t_nmd_append_string(&si, _nmd_reg32[instruction->modrm.fields.rm]);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tconst char* mnemonics[] = { \"rdfsbase\", \"rdgsbase\", \"wrfsbase\", \"wrgsbase\", 0, \"lfence\", \"mfence\", \"sfence\" };\n\t\t\t\t\t_nmd_append_string(&si, mnemonics[instruction->modrm.fields.reg]);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, instruction->modrm.fields.reg == 0b110 ? \"clwb \" : \"clflushopt \");\n\t\t\t\t\t_nmd_append_modrm_upper(&si, \"byte\");\n\t\t\t\t}\n\t\t\t\telse if (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT)\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, instruction->modrm.fields.reg == 0b100 ? \"ptwrite \" : \"clrssbsy \");\n\t\t\t\t\t_nmd_append_modrm_upper(&si, instruction->modrm.fields.reg == 0b100 ? \"dword\" : \"qword\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tconst char* mnemonics[] = { \"fxsave\", \"fxrstor\", \"ldmxcsr\", \"stmxcsr\", \"xsave\", \"xrstor\", \"xsaveopt\", \"clflush\" };\n\t\t\t\t\t_nmd_append_string(&si, mnemonics[instruction->modrm.fields.reg]);\n\t\t\t\t\t*si.buffer++ = ' ';\n\t\t\t\t\t_nmd_append_modrm_upper(&si, \"dword\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (op == 0xaf)\n\t\t{\n\t\t\t_nmd_append_string(&si, \"imul \");\n\t\t\t_nmd_append_Gv(&si);\n\t\t\t*si.buffer++ = ',';\n\t\t\t_nmd_append_Ev(&si);\n\t\t}\n\t\telse if (op == 0xb0 || op == 0xb1)\n\t\t{\n\t\t\t_nmd_append_string(&si, \"cmpxchg \");\n\t\t\tif (op == 0xb0)\n\t\t\t{\n\t\t\t\t_nmd_append_Eb(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_Gb(&si);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t_nmd_append_Ev(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_Gv(&si);\n\t\t\t}\n\t\t}\n\t\telse if (op == 0xb2)\n\t\t{\n\t\t\t_nmd_append_string(&si, \"lss \");\n\t\t\t_nmd_append_Gv(&si);\n\t\t\t*si.buffer++ = ',';\n\t\t\t_nmd_append_modrm_upper(&si, \"fword\");\n\t\t}\n\t\telse if (_NMD_R(op) == 0xb && (op % 8) >= 6)\n\t\t{\n\t\t\t_nmd_append_string(&si, op > 0xb8 ? \"movsx \" : \"movzx \");\n\t\t\t_nmd_append_Gv(&si);\n\t\t\t*si.buffer++ = ',';\n\t\t\tif ((op % 8) == 6)\n\t\t\t\t_nmd_append_Eb(&si);\n\t\t\telse\n\t\t\t\t_nmd_append_Ew(&si);\n\t\t}\n\t\telse if (op == 0xb8)\n\t\t{\n\t\t\t_nmd_append_string(&si, \"popcnt \");\n\t\t\t_nmd_append_Gv(&si);\n\t\t\t*si.buffer++ = ',';\n\t\t\t_nmd_append_Ev(&si);\n\t\t}\n\t\telse if (op == 0xba)\n\t\t{\n\t\t\tconst char* mnemonics[] = { \"bt\",\"bts\",\"btr\",\"btc\" };\n\t\t\t_nmd_append_string(&si, mnemonics[instruction->modrm.fields.reg - 4]);\n\t\t\t*si.buffer++ = ' ';\n\t\t\t_nmd_append_Ev(&si);\n\t\t\t*si.buffer++ = ',';\n\t\t\t_nmd_append_number(&si, instruction->immediate);\n\t\t}\n\t\telse if (op == 0xc0 || op == 0xc1)\n\t\t{\n\t\t\t_nmd_append_string(&si, \"xadd \");\n\t\t\tif (op == 0xc0)\n\t\t\t{\n\t\t\t\t_nmd_append_Eb(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_Gb(&si);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t_nmd_append_Ev(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_Gv(&si);\n\t\t\t}\n\t\t}\n\t\telse if (op == 0xc2)\n\t\t{\n\t\t\t_nmd_append_string(&si, instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? \"cmppd\" : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT ? \"cmpss\" : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO ? \"cmpsd\" : \"cmpps\")));\n\t\t\t*si.buffer++ = ' ';\n\t\t\t_nmd_append_Vdq(&si);\n\t\t\t*si.buffer++ = ',';\n\t\t\tif (si.instruction->modrm.fields.mod == 0b11)\n\t\t\t\t_nmd_append_Udq(&si);\n\t\t\telse\n\t\t\t\t_nmd_append_modrm_upper(&si, instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT ? \"dword\" : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO ? \"qword\" : \"xmmword\"));\n\t\t\t*si.buffer++ = ',';\n\t\t\t_nmd_append_number(&si, instruction->immediate);\n\t\t}\n\t\telse if (op == 0xc3)\n\t\t{\n\t\t\t_nmd_append_string(&si, \"movnti \");\n\t\t\t_nmd_append_modrm_upper(&si, \"dword\");\n\t\t\t*si.buffer++ = ',';\n\t\t\t_nmd_append_string(&si, _nmd_reg32[instruction->modrm.fields.reg]);\n\t\t}\n\t\telse if (op == 0xc4)\n\t\t{\n\t\t\t_nmd_append_string(&si, \"pinsrw \");\n\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\telse\n\t\t\t\t_nmd_append_Pq(&si);\n\t\t\t*si.buffer++ = ',';\n\t\t\tif (si.instruction->modrm.fields.mod == 0b11)\n\t\t\t\t_nmd_append_string(&si, _nmd_reg32[si.instruction->modrm.fields.rm]);\n\t\t\telse\n\t\t\t\t_nmd_append_modrm_upper(&si, \"word\");\n\t\t\t*si.buffer++ = ',';\n\t\t\t_nmd_append_number(&si, instruction->immediate);\n\t\t}\n\t\telse if (op == 0xc5)\n\t\t{\n\t\t\t_nmd_append_string(&si, \"pextrw \");\n\t\t\t_nmd_append_string(&si, _nmd_reg32[si.instruction->modrm.fields.reg]);\n\t\t\t*si.buffer++ = ',';\n\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t\t_nmd_append_Udq(&si);\n\t\t\telse\n\t\t\t\t_nmd_append_Nq(&si);\n\t\t\t*si.buffer++ = ',';\n\t\t\t_nmd_append_number(&si, instruction->immediate);\n\t\t}\n\t\telse if (op == 0xc6)\n\t\t{\n\t\t\t_nmd_append_string(&si, \"shufp\");\n\t\t\t*si.buffer++ = instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? 'd' : 's';\n\t\t\t*si.buffer++ = ' ';\n\t\t\t_nmd_append_Vdq(&si);\n\t\t\t*si.buffer++ = ',';\n\t\t\t_nmd_append_W(&si);\n\t\t\t*si.buffer++ = ',';\n\t\t\t_nmd_append_number(&si, instruction->immediate);\n\t\t}\n\t\telse if (op == 0xC7)\n\t\t{\n\t\t\tif (instruction->modrm.fields.reg == 0b001)\n\t\t\t{\n\t\t\t\t_nmd_append_string(&si, \"cmpxchg8b \");\n\t\t\t\t_nmd_append_modrm_upper(&si, \"qword\");\n\t\t\t}\n\t\t\telse if (instruction->modrm.fields.reg <= 0b101)\n\t\t\t{\n\t\t\t\tconst char* mnemonics[] = { \"xrstors\", \"xsavec\", \"xsaves\" };\n\t\t\t\t_nmd_append_string(&si, mnemonics[instruction->modrm.fields.reg - 3]);\n\t\t\t\t*si.buffer++ = ' ';\n\t\t\t\t_nmd_append_Eb(&si);\n\t\t\t}\n\t\t\telse if (instruction->modrm.fields.reg == 0b110)\n\t\t\t{\n\t\t\t\tif (instruction->modrm.fields.mod == 0b11)\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, \"rdrand \");\n\t\t\t\t\t_nmd_append_Rv(&si);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? \"vmclear\" : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT ? \"vmxon\" : \"vmptrld\"));\n\t\t\t\t\t*si.buffer++ = ' ';\n\t\t\t\t\t_nmd_append_modrm_upper(&si, \"qword\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse /* reg == 0b111 */\n\t\t\t{\n\t\t\t\tif (instruction->modrm.fields.mod == 0b11)\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, \"rdseed \");\n\t\t\t\t\t_nmd_append_Rv(&si);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, \"vmptrst \");\n\t\t\t\t\t_nmd_append_modrm_upper(&si, \"qword\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (op >= 0xc8 && op <= 0xcf)\n\t\t{\n\t\t\t_nmd_append_string(&si, \"bswap \");\n\t\t\t_nmd_append_string(&si, (opszprfx ? _nmd_reg16 : _nmd_reg32)[op % 8]);\n\t\t}\n\t\telse if (op == 0xd0)\n\t\t{\n\t\t\t_nmd_append_string(&si, \"addsubp\");\n\t\t\t*si.buffer++ = instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? 'd' : 's';\n\t\t\t*si.buffer++ = ' ';\n\t\t\t_nmd_append_Vdq(&si);\n\t\t\t*si.buffer++ = ',';\n\t\t\t_nmd_append_W(&si);\n\t\t}\n\t\telse if (op == 0xd6)\n\t\t{\n\t\t\t_nmd_append_string(&si, instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? \"movq\" : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT ? \"movq2dq\" : \"movdq2q\"));\n\t\t\t*si.buffer++ = ' ';\n\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT)\n\t\t\t{\n\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_Nq(&si);\n\t\t\t}\n\t\t\telse if (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO)\n\t\t\t{\n\t\t\t\t_nmd_append_Pq(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_Udq(&si);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (si.instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t_nmd_append_Udq(&si);\n\t\t\t\telse\n\t\t\t\t\t_nmd_append_modrm_upper(&si, \"qword\");\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t}\n\t\t}\n\t\telse if (op == 0xd7)\n\t\t{\n\t\t\t_nmd_append_string(&si, \"pmovmskb \");\n\t\t\t_nmd_append_string(&si, _nmd_reg32[instruction->modrm.fields.reg]);\n\t\t\t*si.buffer++ = ',';\n\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t\t_nmd_append_Udq(&si);\n\t\t\telse\n\t\t\t\t_nmd_append_Nq(&si);\n\t\t}\n\t\telse if (op == 0xe6)\n\t\t{\n\t\t\t_nmd_append_string(&si, instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? \"cvttpd2dq\" : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT ? \"cvtdq2pd\" : \"cvtpd2dq\"));\n\t\t\t*si.buffer++ = ' ';\n\t\t\t_nmd_append_Vdq(&si);\n\t\t\t*si.buffer++ = ',';\n\t\t\tif (si.instruction->modrm.fields.mod == 0b11)\n\t\t\t\t_nmd_append_Udq(&si);\n\t\t\telse\n\t\t\t\t_nmd_append_modrm_upper(&si, instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT ? \"qword\" : \"xmmword\");\n\t\t}\n\t\telse if (op == 0xe7)\n\t\t{\n\t\t\t_nmd_append_string(&si, instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? \"movntdq\" : \"movntq\");\n\t\t\t*si.buffer++ = ' ';\n\t\t\t_nmd_append_modrm_upper(&si, instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? \"xmmword\" : \"qword\");\n\t\t\t*si.buffer++ = ',';\n\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\telse\n\t\t\t\t_nmd_append_Pq(&si);\n\t\t}\n\t\telse if (op == 0xf0)\n\t\t{\n\t\t\t_nmd_append_string(&si, \"lddqu \");\n\t\t\t_nmd_append_Vdq(&si);\n\t\t\t*si.buffer++ = ',';\n\t\t\t_nmd_append_modrm_upper(&si, \"xmmword\");\n\t\t}\n\t\telse if (op == 0xf7)\n\t\t{\n\t\t\t_nmd_append_string(&si, instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? \"maskmovdqu \" : \"maskmovq \");\n\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t{\n\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_Udq(&si);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t_nmd_append_Pq(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_Nq(&si);\n\t\t\t}\n\t\t}\n\t\telse if (op >= 0xd1 && op <= 0xfe)\n\t\t{\n\t\t\tconst char* mnemonics[] = { \"srlw\", \"srld\", \"srlq\", \"addq\", \"mullw\", 0, 0, \"subusb\", \"subusw\", \"minub\", \"and\", \"addusb\", \"addusw\", \"maxub\", \"andn\", \"avgb\", \"sraw\", \"srad\", \"avgw\", \"mulhuw\", \"mulhw\", 0, 0, \"subsb\", \"subsw\", \"minsw\", \"or\", \"addsb\", \"addsw\", \"maxsw\", \"xor\", 0, \"sllw\", \"slld\", \"sllq\", \"muludq\", \"maddwd\", \"sadbw\", 0, \"subb\", \"subw\", \"subd\", \"subq\", \"addb\", \"addw\", \"addd\" };\n\t\t\t*si.buffer++ = 'p';\n\t\t\t_nmd_append_string(&si, mnemonics[op - 0xd1]);\n\t\t\t*si.buffer++ = ' ';\n\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t{\n\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_W(&si);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t_nmd_append_Pq(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_Qq(&si);\n\t\t\t}\n\t\t}\n\t\telse if (op == 0xb9 || op == 0xff)\n\t\t{\n\t\t\t_nmd_append_string(&si, op == 0xb9 ? \"ud1 \" : \"ud0 \");\n\t\t\t_nmd_append_string(&si, _nmd_reg32[instruction->modrm.fields.reg]);\n\t\t\t*si.buffer++ = ',';\n\t\t\tif (instruction->modrm.fields.mod == 0b11)\n\t\t\t\t_nmd_append_string(&si, (instruction->mode == NMD_X86_MODE_64 ? _nmd_reg64 : _nmd_reg32)[instruction->modrm.fields.rm]);\n\t\t\telse\n\t\t\t\t_nmd_append_modrm_upper(&si, \"dword\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst char* str = 0;\n\t\t\tswitch (op)\n\t\t\t{\n\t\t\tcase 0x31: str = \"rdtsc\"; break;\n\t\t\tcase 0x07: str = \"sysret\"; break;\n\t\t\tcase 0x06: str = \"clts\"; break;\n\t\t\tcase 0x08: str = \"invd\"; break;\n\t\t\tcase 0x09: str = \"wbinvd\"; break;\n\t\t\tcase 0x0b: str = \"ud2\"; break;\n\t\t\tcase 0x0e: str = \"femms\"; break;\n\t\t\tcase 0x30: str = \"wrmsr\"; break;\n\t\t\tcase 0x32: str = \"rdmsr\"; break;\n\t\t\tcase 0x33: str = \"rdpmc\"; break;\n\t\t\tcase 0x34: str = \"sysenter\"; break;\n\t\t\tcase 0x35: str = \"sysexit\"; break;\n\t\t\tcase 0x37: str = \"getsec\"; break;\n\t\t\tcase 0x77: str = \"emms\"; break;\n\t\t\tcase 0xa0: str = \"push fs\"; break;\n\t\t\tcase 0xa1: str = \"pop fs\"; break;\n\t\t\tcase 0xa8: str = \"push gs\"; break;\n\t\t\tcase 0xa9: str = \"pop gs\"; break;\n\t\t\tcase 0xaa: str = \"rsm\"; break;\n\t\t\tdefault: return;\n\t\t\t}\n\t\t\t_nmd_append_string(&si, str);\n\t\t}\n\t}\n\telse if (instruction->opcode_map == NMD_X86_OPCODE_MAP_0F38)\n\t{\n\t\tif ((_NMD_R(op) == 2 || _NMD_R(op) == 3) && _NMD_C(op) <= 5)\n\t\t{\n\t\t\tconst char* mnemonics[] = { \"pmovsxbw\", \"pmovsxbd\", \"pmovsxbq\", \"pmovsxwd\", \"pmovsxwq\", \"pmovsxdq\" };\n\t\t\t_nmd_append_string(&si, mnemonics[_NMD_C(op)]);\n\t\t\tif (_NMD_R(op) == 3)\n\t\t\t\t*(si.buffer - 4) = 'z';\n\t\t\t*si.buffer++ = ' ';\n\t\t\t_nmd_append_Vdq(&si);\n\t\t\t*si.buffer++ = ',';\n\t\t\tif (instruction->modrm.fields.mod == 0b11)\n\t\t\t\t_nmd_append_Udq(&si);\n\t\t\telse\n\t\t\t\t_nmd_append_modrm_upper(&si, _NMD_C(op) == 5 ? \"qword\" : (_NMD_C(op) % 3 == 0 ? \"qword\" : (_NMD_C(op) % 3 == 1 ? \"dword\" : \"word\")));\n\t\t}\n\t\telse if (op >= 0x80 && op <= 0x83)\n\t\t{\n\t\t\t_nmd_append_string(&si, op == 0x80 ? \"invept\" : (op == 0x81 ? \"invvpid\" : \"invpcid\"));\n\t\t\t*si.buffer++ = ' ';\n\t\t\t_nmd_append_Gy(&si);\n\t\t\t*si.buffer++ = ',';\n\t\t\t_nmd_append_modrm_upper(&si, \"xmmword\");\n\t\t}\n\t\telse if (op >= 0xc8 && op <= 0xcd)\n\t\t{\n\t\t\tconst char* mnemonics[] = { \"sha1nexte\", \"sha1msg1\", \"sha1msg2\", \"sha256rnds2\", \"sha256msg1\", \"sha256msg2\" };\n\t\t\t_nmd_append_string(&si, mnemonics[op - 0xc8]);\n\t\t\t*si.buffer++ = ' ';\n\t\t\t_nmd_append_Vdq(&si);\n\t\t\t*si.buffer++ = ',';\n\t\t\t_nmd_append_W(&si);\n\t\t}\n\t\telse if (op == 0xcf)\n\t\t{\n\t\t\t_nmd_append_string(&si, \"gf2p8mulb \");\n\t\t\t_nmd_append_Vdq(&si);\n\t\t\t*si.buffer++ = ',';\n\t\t\t_nmd_append_W(&si);\n\t\t}\n\t\telse if (op == 0xf0 || op == 0xf1)\n\t\t{\n\t\t\t_nmd_append_string(&si, instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO ? \"crc32\" : \"movbe\");\n\t\t\t*si.buffer++ = ' ';\n\t\t\tif (op == 0xf0)\n\t\t\t{\n\t\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO)\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, _nmd_reg32[instruction->modrm.fields.reg]);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_Eb(&si);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_Gv(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_Ev(&si);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT_NOT_ZERO)\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_string(&si, _nmd_reg32[instruction->modrm.fields.reg]);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t\t\t\t_nmd_append_Ew(&si);\n\t\t\t\t\telse\n\t\t\t\t\t\t_nmd_append_Ey(&si);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t_nmd_append_Ev(&si);\n\t\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t\t_nmd_append_Gv(&si);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse if (op == 0xf6)\n\t\t{\n\t\t\t_nmd_append_string(&si, instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? \"adcx\" : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT ? \"adox\" : (instruction->rex_w_prefix ? \"wrssq\" : \"wrssd\")));\n\t\t\t*si.buffer++ = ' ';\n\t\t\tif (!instruction->simd_prefix)\n\t\t\t{\n\t\t\t\t_nmd_append_Ey(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_Gy(&si);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t_nmd_append_Gy(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_Ey(&si);\n\t\t\t}\n\t\t}\n\t\telse if (op == 0xf5)\n\t\t{\n\t\t\t_nmd_append_string(&si, instruction->rex_w_prefix ? \"wrussq \" : \"wrussd \");\n\t\t\t_nmd_append_modrm_upper(&si, instruction->rex_w_prefix ? \"qword\" : \"dword\");\n\t\t\t*si.buffer++ = ',';\n\t\t\t_nmd_append_string(&si, (instruction->rex_w_prefix ? _nmd_reg64 : _nmd_reg32)[instruction->modrm.fields.reg]);\n\t\t}\n\t\telse if (op == 0xf8)\n\t\t{\n\t\t\t_nmd_append_string(&si, instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE ? \"movdir64b\" : (instruction->simd_prefix == NMD_X86_PREFIXES_REPEAT ? \"enqcmd\" : \"enqcmds\"));\n\t\t\t*si.buffer++ = ' ';\n\t\t\t_nmd_append_string(&si, (instruction->mode == NMD_X86_MODE_64 ? _nmd_reg64 : (instruction->mode == NMD_X86_MODE_16 ? _nmd_reg16 : _nmd_reg32))[instruction->modrm.fields.rm]);\n\t\t\t*si.buffer++ = ',';\n\t\t\t_nmd_append_modrm_upper(&si, \"zmmword\");\n\t\t}\n\t\telse if (op == 0xf9)\n\t\t{\n\t\t\t_nmd_append_string(&si, \"movdiri \");\n\t\t\t_nmd_append_modrm_upper_without_address_specifier(&si);\n\t\t\t*si.buffer++ = ',';\n\t\t\t_nmd_append_string(&si, _nmd_reg32[instruction->modrm.fields.rm]);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (op == 0x40)\n\t\t\t\t_nmd_append_string(&si, \"pmulld\");\n\t\t\telse if (op == 0x41)\n\t\t\t\t_nmd_append_string(&si, \"phminposuw\");\n\t\t\telse if (op >= 0xdb && op <= 0xdf)\n\t\t\t{\n\t\t\t\tconst char* mnemonics[] = { \"aesimc\", \"aesenc\", \"aesenclast\", \"aesdec\", \"aesdeclast\" };\n\t\t\t\t_nmd_append_string(&si, mnemonics[op - 0xdb]);\n\t\t\t}\n\t\t\telse if (op == 0x37)\n\t\t\t\t_nmd_append_string(&si, \"pcmpgtq\");\n\t\t\telse if (_NMD_R(op) == 2)\n\t\t\t{\n\t\t\t\tconst char* mnemonics[] = { \"pmuldq\", \"pcmpeqq\", \"movntdqa\", \"packusdw\" };\n\t\t\t\t_nmd_append_string(&si, mnemonics[_NMD_C(op) - 8]);\n\t\t\t}\n\t\t\telse if (_NMD_R(op) == 3)\n\t\t\t{\n\t\t\t\tconst char* mnemonics[] = { \"pminsb\", \"pminsd\", \"pminuw\", \"pminud\", \"pmaxsb\", \"pmaxsd\", \"pmaxuw\", \"pmaxud\" };\n\t\t\t\t_nmd_append_string(&si, mnemonics[_NMD_C(op) - 8]);\n\t\t\t}\n\t\t\telse if (op < 0x10)\n\t\t\t{\n\t\t\t\tconst char* mnemonics[] = { \"pshufb\", \"phaddw\", \"phaddd\", \"phaddsw\", \"pmaddubsw\", \"phsubw\", \"phsubd\", \"phsubsw\", \"psignb\", \"psignw\", \"psignd\", \"pmulhrsw\", \"permilpsv\", \"permilpdv\", \"testpsv\", \"testpdv\" };\n\t\t\t\t_nmd_append_string(&si, mnemonics[op]);\n\t\t\t}\n\t\t\telse if (op < 0x18)\n\t\t\t\t_nmd_append_string(&si, op == 0x10 ? \"pblendvb\" : (op == 0x14 ? \"blendvps\" : (op == 0x15 ? \"blendvpd\" : \"ptest\")));\n\t\t\telse\n\t\t\t{\n\t\t\t\t_nmd_append_string(&si, \"pabs\");\n\t\t\t\t*si.buffer++ = op == 0x1c ? 'b' : (op == 0x1d ? 'w' : 'd');\n\t\t\t}\n\t\t\t*si.buffer++ = ' ';\n\t\t\tif (instruction->simd_prefix == NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE)\n\t\t\t{\n\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_W(&si);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t_nmd_append_Pq(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_Qq(&si);\n\t\t\t}\n\t\t}\n\n\t}\n\telse if (instruction->opcode_map == NMD_X86_OPCODE_MAP_0F3A)\n\t{\n\t\tif (_NMD_R(op) == 1)\n\t\t{\n\t\t\tconst char* mnemonics[] = { \"pextrb\", \"pextrw\", \"pextrd\", \"extractps\" };\n\t\t\t_nmd_append_string(&si, mnemonics[op - 0x14]);\n\t\t\t*si.buffer++ = ' ';\n\t\t\tif (instruction->modrm.fields.mod == 0b11)\n\t\t\t\t_nmd_append_string(&si, (si.instruction->rex_w_prefix ? _nmd_reg64 : _nmd_reg32)[instruction->modrm.fields.rm]);\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (op == 0x14)\n\t\t\t\t\t_nmd_append_modrm_upper(&si, \"byte\");\n\t\t\t\telse if (op == 0x15)\n\t\t\t\t\t_nmd_append_modrm_upper(&si, \"word\");\n\t\t\t\telse if (op == 0x16)\n\t\t\t\t\t_nmd_append_Ey(&si);\n\t\t\t\telse\n\t\t\t\t\t_nmd_append_modrm_upper(&si, \"dword\");\n\t\t\t}\n\t\t\t*si.buffer++ = ',';\n\t\t\t_nmd_append_Vdq(&si);\n\t\t}\n\t\telse if (_NMD_R(op) == 2)\n\t\t{\n\t\t\t_nmd_append_string(&si, op == 0x20 ? \"pinsrb\" : (op == 0x21 ? \"insertps\" : \"pinsrd\"));\n\t\t\t*si.buffer++ = ' ';\n\t\t\t_nmd_append_Vdq(&si);\n\t\t\t*si.buffer++ = ',';\n\t\t\tif (op == 0x20)\n\t\t\t{\n\t\t\t\tif (instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t_nmd_append_string(&si, _nmd_reg32[instruction->modrm.fields.rm]);\n\t\t\t\telse\n\t\t\t\t\t_nmd_append_modrm_upper(&si, \"byte\");\n\t\t\t}\n\t\t\telse if (op == 0x21)\n\t\t\t{\n\t\t\t\tif (instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t_nmd_append_Udq(&si);\n\t\t\t\telse\n\t\t\t\t\t_nmd_append_modrm_upper(&si, \"dword\");\n\t\t\t}\n\t\t\telse\n\t\t\t\t_nmd_append_Ey(&si);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (op < 0x10)\n\t\t\t{\n\t\t\t\tconst char* mnemonics[] = { \"roundps\", \"roundpd\", \"roundss\", \"roundsd\", \"blendps\", \"blendpd\", \"pblendw\", \"palignr\" };\n\t\t\t\t_nmd_append_string(&si, mnemonics[op - 8]);\n\t\t\t}\n\t\t\telse if (_NMD_R(op) == 4)\n\t\t\t{\n\t\t\t\tconst char* mnemonics[] = { \"dpps\", \"dppd\", \"mpsadbw\", 0, \"pclmulqdq\" };\n\t\t\t\t_nmd_append_string(&si, mnemonics[_NMD_C(op)]);\n\t\t\t}\n\t\t\telse if (_NMD_R(op) == 6)\n\t\t\t{\n\t\t\t\tconst char* mnemonics[] = { \"pcmpestrm\", \"pcmpestri\", \"pcmpistrm\", \"pcmpistri\" };\n\t\t\t\t_nmd_append_string(&si, mnemonics[_NMD_C(op)]);\n\t\t\t}\n\t\t\telse if (op > 0x80)\n\t\t\t\t_nmd_append_string(&si, op == 0xcc ? \"sha1rnds4\" : (op == 0xce ? \"gf2p8affineqb\" : (op == 0xcf ? \"gf2p8affineinvqb\" : \"aeskeygenassist\")));\n\t\t\t*si.buffer++ = ' ';\n\t\t\tif (op == 0xf && !(instruction->prefixes & (NMD_X86_PREFIXES_OPERAND_SIZE_OVERRIDE | NMD_X86_PREFIXES_REPEAT | NMD_X86_PREFIXES_REPEAT_NOT_ZERO)))\n\t\t\t{\n\t\t\t\t_nmd_append_Pq(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\t_nmd_append_Qq(&si);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t_nmd_append_Vdq(&si);\n\t\t\t\t*si.buffer++ = ',';\n\t\t\t\tif (instruction->modrm.fields.mod == 0b11)\n\t\t\t\t\t_nmd_append_string(&si, \"xmm\"), * si.buffer++ = (char)('0' + instruction->modrm.fields.rm);\n\t\t\t\telse\n\t\t\t\t\t_nmd_append_modrm_upper(&si, op == 0xa ? \"dword\" : (op == 0xb ? \"qword\" : \"xmmword\"));\n\t\t\t}\n\t\t}\n\t\t*si.buffer++ = ',';\n\t\t_nmd_append_number(&si, instruction->immediate);\n\t}\n\n#ifndef NMD_ASSEMBLY_DISABLE_FORMATTER_ATT_SYNTAX\n\tif (flags & NMD_X86_FORMAT_FLAGS_ATT_SYNTAX)\n\t{\n\t\t*si.buffer = '\\0';\n\t\tchar* operand = (char*)_nmd_reverse_strchr(buffer, ' ');\n\t\tif (operand && *(operand - 1) != ' ') /* If the instruction has a ' '(space character) and the left character of 'operand' is not ' '(space) the instruction has operands. */\n\t\t{\n\t\t\t/* If there is a memory operand. */\n\t\t\tconst char* memory_operand = _nmd_strchr(buffer, '[');\n\t\t\tif (memory_operand)\n\t\t\t{\n\t\t\t\t/* If the memory operand has pointer size. */\n\t\t\t\tchar* tmp2 = (char*)memory_operand - (*(memory_operand - 1) == ':' ? 7 : 4);\n\t\t\t\tif (_nmd_strstr(tmp2, \"ptr\") == tmp2)\n\t\t\t\t{\n\t\t\t\t\t/* Find the ' '(space) that is after two ' '(spaces). */\n\t\t\t\t\ttmp2 -= 2;\n\t\t\t\t\twhile (*tmp2 != ' ')\n\t\t\t\t\t\ttmp2--;\n\t\t\t\t\toperand = tmp2;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst char* const first_operand_const = operand;\n\t\t\tchar* first_operand = operand + 1;\n\t\t\tchar* second_operand = 0;\n\t\t\t/* Convert each operand to AT&T syntax. */\n\t\t\tdo\n\t\t\t{\n\t\t\t\toperand++;\n\t\t\t\toperand = _nmd_format_operand_to_att(operand, &si);\n\t\t\t\tif (*operand == ',')\n\t\t\t\t\tsecond_operand = operand;\n\t\t\t} while (*operand);\n\n\t\t\t/* Swap operands. */\n\t\t\tif (second_operand) /* At least two operands. */\n\t\t\t{\n\t\t\t\t/* Copy first operand to 'tmp_buffer'. */\n\t\t\t\tchar tmp_buffer[64];\n\t\t\t\tchar* i = tmp_buffer;\n\t\t\t\tchar* j = first_operand;\n\t\t\t\tfor (; j < second_operand; i++, j++)\n\t\t\t\t\t*i = *j;\n\n\t\t\t\t*i = '\\0';\n\n\t\t\t\t/* Copy second operand to first operand. */\n\t\t\t\tfor (i = second_operand + 1; *i; first_operand++, i++)\n\t\t\t\t\t*first_operand = *i;\n\n\t\t\t\t*first_operand++ = ',';\n\n\t\t\t\t/* 'first_operand' is now the second operand. */\n\t\t\t\t/* Copy 'tmp_buffer' to second operand. */\n\t\t\t\tfor (i = tmp_buffer; *first_operand; i++, first_operand++)\n\t\t\t\t\t*first_operand = *i;\n\t\t\t}\n\n\t\t\t/* Memory operands change the mnemonic string(e.g. 'mov eax, dword ptr [ebx]' -> 'movl (%ebx), %eax'). */\n\t\t\tif (memory_operand && !_nmd_strstr(first_operand_const - 4, \"lea\"))\n\t\t\t{\n\t\t\t\tconst char* r_char = _nmd_strchr(first_operand_const, 'r');\n\t\t\t\tconst char* e_char = _nmd_strchr(first_operand_const, 'e');\n\t\t\t\tconst char* call_str = _nmd_strstr(first_operand_const - 5, \"call\");\n\t\t\t\tconst char* jmp_str = _nmd_strstr(first_operand_const - 4, \"jmp\");\n\t\t\t\t_nmd_insert_char(first_operand_const, (instruction->mode == NMD_X86_MODE_64 && ((r_char && *(r_char - 1) == '%') || call_str || jmp_str)) ? 'q' : (instruction->mode == NMD_X86_MODE_32 && ((e_char && *(e_char - 1) == '%') || call_str || jmp_str) ? 'l' : 'b'));\n\t\t\t\tsi.buffer++;\n\t\t\t}\n\t\t}\n\t}\n#endif /* NMD_ASSEMBLY_DISABLE_FORMATTER_ATT_SYNTAX */\n\n\tsize_t string_length = si.buffer - buffer;\n#ifndef NMD_ASSEMBLY_DISABLE_FORMATTER_UPPERCASE\n\tif (flags & NMD_X86_FORMAT_FLAGS_UPPERCASE)\n\t{\n\t\tsize_t i = 0;\n\t\tfor (; i < string_length; i++)\n\t\t{\n\t\t\tif (_NMD_IS_LOWERCASE(buffer[i]))\n\t\t\t\tbuffer[i] -= 0x20; /* Capitalize letter. */\n\t\t}\n\t}\n#endif /* NMD_ASSEMBLY_DISABLE_FORMATTER_UPPERCASE */\n\n#ifndef NMD_ASSEMBLY_DISABLE_FORMATTER_COMMA_SPACES\n\tif (flags & NMD_X86_FORMAT_FLAGS_COMMA_SPACES)\n\t{\n\t\tsize_t i = 0;\n\t\tfor (; i < string_length; i++)\n\t\t{\n\t\t\tif (buffer[i] == ',')\n\t\t\t{\n\t\t\t\t/* Move all characters after the comma one position to the right. */\n\t\t\t\tsize_t j = string_length;\n\t\t\t\tfor (; j > i; j--)\n\t\t\t\t\tbuffer[j] = buffer[j - 1];\n\n\t\t\t\tbuffer[i + 1] = ' ';\n\t\t\t\tsi.buffer++, string_length++;\n\t\t\t}\n\t\t}\n\t}\n#endif /* NMD_ASSEMBLY_DISABLE_FORMATTER_COMMA_SPACES */\n\n#ifndef NMD_ASSEMBLY_DISABLE_FORMATTER_OPERATOR_SPACES\n\tif (flags & NMD_X86_FORMAT_FLAGS_OPERATOR_SPACES)\n\t{\n\t\tsize_t i = 0;\n\t\tfor (; i < string_length; i++)\n\t\t{\n\t\t\tif (buffer[i] == '+' || (buffer[i] == '-' && buffer[i - 1] != ' ' && buffer[i - 1] != '('))\n\t\t\t{\n\t\t\t\t/* Move all characters after the operator two positions to the right. */\n\t\t\t\tsize_t j = string_length + 1;\n\t\t\t\tfor (; j > i; j--)\n\t\t\t\t\tbuffer[j] = buffer[j - 2];\n\n\t\t\t\tbuffer[i + 1] = buffer[i];\n\t\t\t\tbuffer[i] = ' ';\n\t\t\t\tbuffer[i + 2] = ' ';\n\t\t\t\tsi.buffer += 2, string_length += 2;\n\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\t}\n#endif /* NMD_ASSEMBLY_DISABLE_FORMATTER_OPERATOR_SPACES */\n\n\t*si.buffer = '\\0';\n}\n\n#endif /* NMD_ASSEMBLY_IMPLEMENTATION */\n"
  },
  {
    "path": "overlays/Example/Example.cpp",
    "content": "#include \"Example.h\"\n\nusing namespace OF;\n\nvoid Example::Setup()\n{\n\tInitFramework(device, spriteBatch, window);\n\tbox = CreateBox(100, 100, 100, 100);\n}\n\nvoid Example::Render()\n{\n\tCheckMouseEvents();\n\tDrawBox(box, 255, 0, 0, 255);\n}"
  },
  {
    "path": "overlays/Example/Example.h",
    "content": "#pragma once\n\n#include \"IRenderCallback.h\"\n#include \"OverlayFramework.h\"\n\nclass Example : public IRenderCallback\n{\npublic:\n\tvoid Setup();\n\tvoid Render();\n\nprivate:\n\tOF::Box* box;\n};"
  },
  {
    "path": "overlays/PauseTheGame/PauseTheGame.cpp",
    "content": "#include \"PauseTheGame.h\"\n\nusing namespace OF;\n\nvoid PauseTheGame::Setup()\n{\n\tInitFramework(device, spriteBatch, window);\n\tReadConfigFile(&keybind);\n\tpauseWindow = CreateBox(ofWindowWidth / 2 - 200, ofWindowHeight / 2 - 100, 400, 200);\n\ttopBar = CreateBox(pauseWindow, 0, 0, pauseWindow->width, 7);\n\tbottomBar = CreateBox(pauseWindow, 0, pauseWindow->height, pauseWindow->width, 7);\n\tfont = LoadFont(\"hook_fonts\\\\OpenSans-22.spritefont\");\n\tbarTexture = LoadTexture(\"hook_textures\\\\bar.png\");\n\trotatedBarTexture = LoadTexture(\"hook_textures\\\\bar_rotated.png\");\n\tSetFont(font);\n}\n\nvoid PauseTheGame::Render()\n{\n\twhile (gamePaused)\n\t{\n\t\tif (MsgWaitForMultipleObjects(0, nullptr, FALSE, 100, QS_ALLINPUT) == WAIT_OBJECT_0)\n\t\t{\n\t\t\tif (CheckHotkey(keybind))\n\t\t\t{\n\t\t\t\tgamePaused = false;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tMSG msg;\n\t\t\tif (GetMessage(&msg, NULL, 0, 0) != -1)\n\t\t\t{\n\t\t\t\tTranslateMessage(&msg);\n\t\t\t\tDispatchMessage(&msg);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (CheckHotkey(keybind))\n\t{\n\t\tgamePaused = true;\n\t\tDrawBox(pauseWindow, 0, 0, 0, 240);\n\t\tDrawBox(topBar, barTexture);\n\t\tDrawBox(bottomBar, rotatedBarTexture);\n\t\tDrawText(pauseWindow, \"Game paused.\", 100, 80);\n\t}\n}\n\nvoid PauseTheGame::ReadConfigFile(unsigned int* keybind)\n{\n\tconfigFile.open(configFileName, std::fstream::in);\n\tif (configFile.is_open())\n\t{\n\t\tstd::string line = \"\";\n\t\tgetline(configFile, line);\n\t\tif (line.length() < 3)\n\t\t{\n\t\t\t*keybind = 'P';\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstd::stringstream stringStream(line.substr(2, line.length()));\n\t\t\tlogger.Log(\"Read keybind line: %s\", line);\n\t\t\tstringStream >> std::hex >> *keybind;\n\t\t\tlogger.Log(\"Keybind is: 0x%x\", *keybind);\n\t\t}\n\t\tconfigFile.close();\n\t}\n\telse\n\t{\n\t\tlogger.Log(\"Using default keybind\");\n\t\tconfigFile.open(configFileName, std::fstream::out);\n\t\tif (configFile.is_open())\n\t\t{\n\t\t\tconfigFile << \"0x50\";\n\t\t\tconfigFile.close();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "overlays/PauseTheGame/PauseTheGame.h",
    "content": "#pragma once\n\n#include <sstream>\n\n#include \"IRenderCallback.h\"\n#include \"OverlayFramework.h\"\n#include \"Logger.h\"\n\nclass PauseTheGame : public IRenderCallback\n{\npublic:\n\tvoid Setup();\n\tvoid Render();\n\nprivate:\n\tLogger logger{ \"PauseTheGame\" };\n\tstd::fstream configFile;\n\tstd::string configFileName = \"pause_keybind.txt\";\n\tunsigned int keybind = 'P';\n\tOF::Box* pauseWindow = nullptr;\n\tOF::Box* topBar = nullptr;\n\tOF::Box* bottomBar = nullptr;\n\tint font = 0;\n\tint barTexture = 0;\n\tint rotatedBarTexture = 0;\n\tbool gamePaused = false;\n\n\tvoid ReadConfigFile(unsigned int* keybind);\n};"
  },
  {
    "path": "overlays/RiseDpsMeter/RiseDpsMeter.cpp",
    "content": "#include \"RiseDpsMeter.h\"\n\nusing namespace OF;\n\nvoid RiseDpsMeter::Setup()\n{\n\tInitFramework(device, spriteBatch, window);\n\n\tint defaultXPos = ofWindowWidth / 2;\n\tint defaultYPos = ofWindowHeight / 2;\n\tReadConfigFile(&defaultXPos, &defaultYPos);\n\n\tdpsMeterWindow = CreateBox(defaultXPos, defaultYPos, 400, 180);\n\tdpsMeterWindowDivider = CreateBox(dpsMeterWindow, 23, dpsMeterWindow->height - 40, dpsMeterWindow->width - 46, 1);\n\tplaceholderWindow = CreateBox(defaultXPos, defaultYPos, dpsMeterWindow->width, dpsMeterWindow->height);\n\tplaceholderOkButton = CreateBox(placeholderWindow, placeholderWindow->width / 2 - 30, placeholderWindow->height - 40, 60, 30);\n\tplaceholderOkButtonBorder = CreateBox(placeholderWindow, placeholderWindow->width / 2 - 27, placeholderWindow->height - 17, 55, 2);\n\tcornerWindow = CreateBox(0, 0, 50, 50);\n\n\tint columnWidth = 1;\n\tint numColumns = floor(((float)dpsMeterWindowDivider->width) / columnWidth) - (columnWidth * 2);\n\tfor (int i = 0; i < numColumns; i++)\n\t{\n\t\tgraphColumns.push_back(CreateBox(dpsMeterWindow, i * columnWidth + columnWidth + 25, dpsMeterWindow->height - 41, columnWidth, 0));\n\t}\n\n\tfont = LoadFont(\"hook_fonts\\\\OpenSans-22.spritefont\");\n\tSetFont(font);\n\n\tSetPointerOffsets();\n}\n\nvoid RiseDpsMeter::Render()\n{\n\tCheckMouseEvents();\n\tCheckHotkeys();\n\tReadMemory();\n\n\tif (playerData[0].totalDamage != 0)\n\t{\n\t\tif (timerUpdateDps.Check())\n\t\t{\n\t\t\tUpdateDamageStats();\n\t\t\tUpdateGraph();\n\t\t}\n\n\t\tif (!userDisabledDpsMeter)\n\t\t{\n\t\t\tDrawDpsMeter();\n\t\t}\n\t}\n\n\tif (showPlaceholder)\n\t{\n\t\tDrawPlaceholder();\n\t}\n\n\tif (showCornerText)\n\t{\n\t\tif (timerCornerText.Check())\n\t\t{\n\t\t\tshowCornerText = false;\n\t\t}\n\t\tDrawCornerText();\n\t}\n}\n\nvoid RiseDpsMeter::DrawDpsMeter()\n{\n\tstd::ostringstream dpsString;\n\tdpsString << std::fixed << std::setprecision(1) << playerData[0].averageDps;\n\n\tDrawBox(dpsMeterWindow, 0, 0, 0, 130);\n\tDrawBox(dpsMeterWindowDivider, 255, 255, 255, 255);\n\n\tfor (auto box : graphColumns)\n\t{\n\t\tDrawBox(box, 125, 125, 255, 255);\n\t}\n\n\tDrawText(dpsMeterWindow, \"DPS: \" + dpsString.str(), 20, dpsMeterWindow->height - 32, 0.6f);\n\tDrawText(dpsMeterWindow, \"High: \" + std::to_string(playerData[0].mostDamageInOneSecond), 162, dpsMeterWindow->height - 32, 0.6f);\n\tDrawText(dpsMeterWindow, \"Total: \" + std::to_string(playerData[0].totalDamage), 287, dpsMeterWindow->height - 32, 0.6f);\n}\n\nvoid RiseDpsMeter::DrawPlaceholder()\n{\n\tDrawBox(placeholderWindow, 0, 0, 0, 170);\n\tDrawText(placeholderWindow,\n\t\t\"          (Hold Left Alt and drag to move)\\n\"\n\t\t\"Move me to a suitable location then click ok.\\n              \"\n\t\t\"The window will auto-hide.\",\n\t\t23, 45, 0.6f);\n\n\tint color = 170;\n\tif (placeholderOkButton->hover)\n\t{\n\t\tcolor = 255;\n\t}\n\n\tDrawBox(placeholderOkButton, 0, 0, 0, 0);\n\tDrawBox(placeholderOkButtonBorder, color, color, color, 255);\n\tDrawText(placeholderOkButton, \"Ok\", 14, -3, 0.7f, color, color, color);\n\n\tif (placeholderOkButton->clicked)\n\t{\n\t\tshowPlaceholder = false;\n\t\tdpsMeterWindow->x = placeholderWindow->x;\n\t\tdpsMeterWindow->y = placeholderWindow->y;\n\t\tWriteToConfigFile();\n\t}\n}\n\nvoid RiseDpsMeter::DrawCornerText()\n{\n\tDrawText(cornerWindow, \"RiseDpsMeter v2.0 loaded\", 0, 0, 0.5f);\n}\n\nvoid RiseDpsMeter::UpdateDamageStats()\n{\n\tfor (auto& player : playerData)\n\t{\n\t\tif (player.dpsHistory.size() > 21600)\n\t\t{\n\t\t\tplayer.dpsHistory.erase(player.dpsHistory.begin());\n\t\t}\n\n\t\tplayer.dpsHistory.push_back(player.totalDamage - player.previousTotalDamage);\n\t\tplayer.previousTotalDamage = player.totalDamage;\n\n\t\tif (player.dpsHistory.back() > player.mostDamageInOneSecond)\n\t\t{\n\t\t\tplayer.mostDamageInOneSecond = player.dpsHistory.back();\n\t\t}\n\n\t\tplayer.averageDps = 0;\n\t\tfor (auto dps : player.dpsHistory)\n\t\t{\n\t\t\tplayer.averageDps += dps;\n\t\t}\n\t\tplayer.averageDps /= player.dpsHistory.size();\n\t}\n}\n\nvoid RiseDpsMeter::UpdateGraph()\n{\n\tfor (int i = graphColumns.size() - 1, \n\t\tj = playerData[0].dpsHistory.size() - 1;\n\t\ti > -1 && j > -1;\n\t\ti--, \n\t\tj--)\n\t{\n\t\tif (playerData[0].dpsHistory[j] != 0)\n\t\t{\n\t\t\tgraphColumns[i]->height = MapIntToRange(playerData[0].dpsHistory[j], 0, playerData[0].mostDamageInOneSecond, 0, 130);\n\t\t\tgraphColumns[i]->y = dpsMeterWindow->height - 41 - graphColumns[i]->height;\n\t\t}\n\n\t\tif (i != graphColumns.size() - 1 && j != playerData[0].dpsHistory.size() - 1 && playerData[0].dpsHistory[j + 1] == 0)\n\t\t{\n\t\t\tgraphColumns[i + 1]->height = graphColumns[i]->height * 0.8;\n\t\t\tgraphColumns[i + 1]->y = dpsMeterWindow->height - 41 - graphColumns[i + 1]->height;\n\t\t}\n\t}\n}\n\nvoid RiseDpsMeter::ReadMemory()\n{\n\tfor (auto& player : playerData)\n\t{\n\t\tReadPlayerDamage(&player);\n\t}\n}\n\nvoid RiseDpsMeter::ReadPlayerDamage(PlayerData* playerData)\n{\n\tif (playerData->timerVerifyDamageAddress.Check())\n\t{\n\t\tFindDamageMemoryAddress(playerData);\n\t}\n\n\tif (playerData->damageAddressIsFound)\n\t{\n\t\tMemoryUtils::MemCopy(\n\t\t\t(uintptr_t)&playerData->totalDamage,\n\t\t\tplayerData->damageMemoryAddress,\n\t\t\tsizeof(uint64_t));\n\t}\n\telse\n\t{\n\t\tResetState();\n\t}\n}\n\nvoid RiseDpsMeter::FindDamageMemoryAddress(PlayerData* playerData)\n{\n\tif (playerData->damagePointerOffsets.size() > 0)\n\t{\n\t\tplayerData->damageMemoryAddress = MemoryUtils::ReadPointerChain(playerData->damagePointerOffsets);\n\t}\n\n\tif (playerData->damageMemoryAddress == 0)\n\t{\n\t\tplayerData->damageAddressIsFound = false;\n\t}\n\telse\n\t{\n\t\tplayerData->damageAddressIsFound = true;\n\t}\n}\n\nvoid RiseDpsMeter::SetPointerOffsets()\n{\n\tplayerData.resize(1);\n\tplayerData[0].damagePointerOffsets = {\n\t\t0x0f6e7550,\n\t\t0xd8,\n\t\t0x110,\n\t\t0x20,\n\t\t0x20,\n\t\t0x138,\n\t\t0x5c8,\n\t\t0x18\n\t};\n}\n\nvoid RiseDpsMeter::CheckHotkeys()\n{\n\tif (CheckHotkey('P', VK_LSHIFT))\n\t{\n\t\tplaceholderWindow->x = ofWindowWidth / 2;\n\t\tplaceholderWindow->y = ofWindowHeight / 2;\n\t\tdpsMeterWindow->x = ofWindowWidth / 2;\n\t\tdpsMeterWindow->y = ofWindowHeight / 2;\n\t}\n\telse if (CheckHotkey('P'))\n\t{\n\t\tif (userDisabledDpsMeter)\n\t\t{\n\t\t\tuserDisabledDpsMeter = false;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tuserDisabledDpsMeter = true;\n\t\t}\n\t} \n\n\tif (CheckHotkey(UNBOUND, VK_LMENU))\n\t{\n\t\tdpsMeterWindow->draggable = true;\n\t\tplaceholderWindow->draggable = true;\n\t}\n\telse\n\t{\n\t\tdpsMeterWindow->draggable = false;\n\t\tplaceholderWindow->draggable = false;\n\t}\n}\n\nvoid RiseDpsMeter::WriteToConfigFile()\n{\n\tdpsMeterConfigFile.open(configFileName, std::fstream::out);\n\tif (dpsMeterConfigFile.is_open() && dpsMeterWindow != nullptr)\n\t{\n\t\tdpsMeterConfigFile << dpsMeterWindow->x << \" \" << dpsMeterWindow->y << std::endl;\n\t\tdpsMeterConfigFile.close();\n\t}\n}\n\nvoid RiseDpsMeter::ReadConfigFile(int* x, int* y)\n{\n\tdpsMeterConfigFile.open(configFileName, std::fstream::in);\n\tif (dpsMeterConfigFile.is_open())\n\t{\n\t\tstd::string line = \"\";\n\t\tgetline(dpsMeterConfigFile, line);\n\t\tstd::stringstream stringStream(line);\n\t\tstd::istream_iterator<std::string> begin(stringStream);\n\t\tstd::istream_iterator<std::string> end;\n\t\tstd::vector<std::string> values(begin, end);\n\t\tif (values.size() >= 2)\n\t\t{\n\t\t\t*x = std::stoi(values[0]);\n\t\t\t*y = std::stoi(values[1]);\n\t\t}\n\t\tdpsMeterConfigFile.close();\n\t}\n\telse\n\t{\n\t\tshowPlaceholder = true;\n\t}\n}\n\nvoid RiseDpsMeter::ResetState()\n{\n\tfor (auto box : graphColumns)\n\t{\n\t\tbox->height = 0;\n\t}\n\tfor (auto& player : playerData)\n\t{\n\t\tplayer.Reset();\n\t}\n\ttimerUpdateDps.Reset();\n}\n\nRiseDpsMeter::~RiseDpsMeter()\n{\n\tWriteToConfigFile();\n}"
  },
  {
    "path": "overlays/RiseDpsMeter/RiseDpsMeter.h",
    "content": "#pragma once\n\n#include <SpriteBatch.h>\n#include <d3d11.h>\n#include <vector>\n#include <iomanip>\n#include <sstream>\n#include <istream>\n#include <iterator>\n\n#include \"IRenderCallback.h\"\n#include \"OverlayFramework.h\"\n#include \"MemoryUtils.h\"\n\nclass Timer\n{\npublic:\n\tTimer(unsigned int millis)\n\t{\n\t\tinterval = millis;\n\t}\n\n\tbool Check()\n\t{\n\t\tauto now = std::chrono::system_clock::now();\n\t\tif (resetOnNextCheck)\n\t\t{\n\t\t\tlastExecutionTime = now;\n\t\t\tresetOnNextCheck = false;\n\t\t\treturn false;\n\t\t}\n\n\t\tauto diff = std::chrono::duration_cast<std::chrono::milliseconds>(now - lastExecutionTime);\n\t\tif (diff.count() >= interval)\n\t\t{\n\t\t\tlastExecutionTime = now;\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tvoid Reset()\n\t{\n\t\tresetOnNextCheck = true;\n\t}\nprivate:\n\tunsigned int interval = 0;\n\tbool resetOnNextCheck = true;\n\tstd::chrono::system_clock::time_point lastExecutionTime;\n};\n\nclass RiseDpsMeter : public IRenderCallback\n{\npublic:\n\tvoid Setup();\n\tvoid Render();\n\t~RiseDpsMeter();\n\nprivate:\n\tstruct PlayerData\n\t{\n\t\tuint64_t totalDamage = 0;\n\t\tuint64_t previousTotalDamage = 0;\n\t\tuint64_t mostDamageInOneSecond = 0;\n\t\tdouble averageDps = 0.0;\n\t\tuintptr_t damageMemoryAddress = 0;\n\t\tstd::vector<uintptr_t> damagePointerOffsets;\n\t\tbool damageAddressIsFound = false;\n\t\tTimer timerVerifyDamageAddress{ 10000 };\n\t\tstd::vector<uint64_t> dpsHistory;\n\t\tvoid Reset()\n\t\t{\n\t\t\ttotalDamage = 0;\n\t\t\tpreviousTotalDamage = 0;\n\t\t\tmostDamageInOneSecond = 0;\n\t\t\taverageDps = 0;\n\t\t\tdpsHistory.clear();\n\t\t}\n\t};\n\tstd::vector<PlayerData> playerData;\n\n\tstd::fstream dpsMeterConfigFile;\n\tstd::string configFileName = \"rise_dps_meter.cfg\";\n\tOF::Box* cornerWindow = nullptr;\n\tOF::Box* dpsMeterWindow = nullptr;\n\tOF::Box* dpsMeterWindowDivider = nullptr;\n\tOF::Box* placeholderWindow = nullptr;\n\tOF::Box* placeholderOkButton = nullptr;\n\tOF::Box* placeholderOkButtonBorder = nullptr;\n\tstd::vector<OF::Box*> graphColumns;\n\tTimer timerUpdateDps{ 1000 };\n\tTimer timerCornerText{ 3000 };\n\tbool showCornerText = true;\n\tbool showPlaceholder = false;\n\tbool showDpsMeter = false;\n\tbool userDisabledDpsMeter = false;\n\tint font = -1;\n\n\tvoid DrawDpsMeter();\n\tvoid DrawPlaceholder();\n\tvoid DrawCornerText();\n\tvoid UpdateDamageStats();\n\tvoid UpdateGraph();\n\tvoid ReadMemory();\n\tvoid ReadPlayerDamage(PlayerData* playerStats);\n\tvoid FindDamageMemoryAddress(PlayerData* playerStats);\n\tvoid SetPointerOffsets();\n\tvoid CheckHotkeys();\n\tvoid WriteToConfigFile();\n\tvoid ReadConfigFile(int* x, int* y);\n\tvoid ResetState();\n};"
  },
  {
    "path": "packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"directxtk_desktop_2017\" version=\"2020.11.12.1\" targetFramework=\"native\" />\n  <package id=\"Microsoft.XAudio2.Redist\" version=\"1.2.8\" targetFramework=\"native\" />\n</packages>"
  },
  {
    "path": "src/DirectXHook.cpp",
    "content": "#include \"DirectXHook.h\"\n#include \"RiseDpsMeter/RiseDpsMeter.h\"\n#include \"Example/Example.h\"\n#include \"PauseTheGame/PauseTheGame.h\"\n\nstatic DirectXHook* hookInstance = nullptr;\n\n/* \n* Note: The non-member functions in this file are defined as such because\n* you are not allowed to pass around pointers to member functions.\n*/\n\n/*\n* Present will get hooked and detour to this function.\n* Present is part of the final rendering stage in DirectX.\n* We need to hook this so we can grab the pointer to the game's swapchain and use it to render.\n* We also place our own rendering code within this function call.\n* https://docs.microsoft.com/en-us/windows/win32/api/dxgi/nf-dxgi-idxgiswapchain-present\n*/\nHRESULT __stdcall OnPresent(IDXGISwapChain* pThis, UINT syncInterval, UINT flags)\n{\n\thookInstance->renderer->OnPresent(pThis, syncInterval, flags);\n\treturn ((Present)hookInstance->presentReturnAddress)(pThis, syncInterval, flags);\n}\n\n/*\n* ResizeBuffers will get hooked and detour to this function.\n* ResizeBuffers usually gets called by the game when the window resizes.\n* We need to hook this so we can release our references to various resources when it's called.\n* If we don't do this then the game will most likely crash.\n* https://docs.microsoft.com/en-us/windows/win32/api/dxgi/nf-dxgi-idxgiswapchain-resizebuffers\n*/\nHRESULT __stdcall OnResizeBuffers(IDXGISwapChain* pThis, UINT bufferCount, UINT width, UINT height, DXGI_FORMAT newFormat, UINT swapChainFlags)\n{\n\thookInstance->renderer->OnResizeBuffers(pThis, bufferCount, width, height, newFormat, swapChainFlags);\n\treturn ((ResizeBuffers)hookInstance->resizeBuffersReturnAddress)(pThis, bufferCount, width, height, newFormat, swapChainFlags);\n}\n\n/*\n* ExecuteCommandLists will get hooked and detour to this function.\n* ExecuteCommandLists gets called when work is to be submitted to the GPU.\n* We need to hook this so we can grab the command queue and use it to create the D3D11On12 device in DirectX 12 games.\n* https://learn.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12-id3d12commandqueue-executecommandlists\n*/\nvoid __stdcall OnExecuteCommandLists(ID3D12CommandQueue* pThis, UINT numCommandLists, const ID3D12CommandList** ppCommandLists)\n{\n\tif (pThis->GetDesc().Type == D3D12_COMMAND_LIST_TYPE_DIRECT)\n\t{\n\t\thookInstance->renderer->SetCommandQueue(pThis);\n\t\t//hookInstance->UnhookCommandQueue();\n\t}\n\n\t((ExecuteCommandLists)hookInstance->executeCommandListsReturnAddress)(pThis, numCommandLists, ppCommandLists);\n}\n\nvoid GetCommandQueue()\n{\n\tID3D12CommandQueue* dummyCommandQueue = hookInstance->CreateDummyCommandQueue();\n\thookInstance->HookCommandQueue(dummyCommandQueue, (uintptr_t)&OnExecuteCommandLists, &hookInstance->executeCommandListsReturnAddress);\n}\n\nDirectXHook::DirectXHook(ID3DRenderer* renderer)\n{\n\tthis->renderer = renderer;\n\thookInstance = this;\n}\n\nvoid DirectXHook::Hook()\n{\n\tlogger.Log(\"OnPresent: %p\", &OnPresent);\n\tlogger.Log(\"OnResizeBuffers: %p\", &OnResizeBuffers);\n\n\trenderer->SetGetCommandQueueCallback(&GetCommandQueue);\n\tIDXGISwapChain* dummySwapChain = CreateDummySwapChain();\n\tHookSwapChain(dummySwapChain, (uintptr_t)&OnPresent, (uintptr_t)&OnResizeBuffers, &presentReturnAddress, &resizeBuffersReturnAddress);\n}\n\nvoid DirectXHook::SetDrawExampleTriangle(bool doDraw)\n{\n\t((Renderer*)renderer)->SetDrawExampleTriangle(doDraw);\n}\n\nvoid DirectXHook::AddRenderCallback(IRenderCallback* object)\n{\n\trenderer->AddRenderCallback(object);\n}\n\nIDXGISwapChain* DirectXHook::CreateDummySwapChain()\n{\n\tWNDCLASSEX wc { 0 };\n\twc.cbSize = sizeof(wc);\n\twc.lpfnWndProc = DefWindowProc;\n\twc.lpszClassName = TEXT(\"dummy class\");\n\tRegisterClassExA(&wc);\n\tHWND hwnd = CreateWindow(wc.lpszClassName, TEXT(\"\"), WS_DISABLED, 0, 0, 0, 0, NULL, NULL, NULL, nullptr);\n\n\tDXGI_SWAP_CHAIN_DESC desc{ 0 };\n\tdesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;\n\tdesc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;\n\tdesc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;\n\tdesc.SampleDesc.Count = 1;\n\tdesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;\n\tdesc.BufferCount = 1;\n\tdesc.OutputWindow = hwnd;\n\tdesc.Windowed = TRUE;\n\tdesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;\n\n\tD3D_FEATURE_LEVEL featureLevels[] =\n\t{\n\t\tD3D_FEATURE_LEVEL_11_0,\n\t\tD3D_FEATURE_LEVEL_11_1\n\t};\n\n\tID3D11Device* dummyDevice = nullptr;\n\tIDXGISwapChain* dummySwapChain = nullptr;\n\tHRESULT result = D3D11CreateDeviceAndSwapChain(\n\t\tNULL, \n\t\tD3D_DRIVER_TYPE_HARDWARE,\n\t\tNULL, \n\t\t0, \n\t\tfeatureLevels, \n\t\t1,\n\t\tD3D11_SDK_VERSION,\n\t\t&desc, \n\t\t&dummySwapChain,\n\t\t&dummyDevice, \n\t\tNULL, \n\t\tNULL);\n\n\tDestroyWindow(desc.OutputWindow);\n\tUnregisterClass(wc.lpszClassName, GetModuleHandle(nullptr));\n\t//dummySwapChain->Release();\n\t//dummyDevice->Release();\n\n\tif (FAILED(result))\n\t{\n\t\t_com_error error(result);\n\t\tlogger.Log(\"D3D11CreateDeviceAndSwapChain failed: %s\", error.ErrorMessage());\n\t\treturn nullptr;\n\t}\n\n\tlogger.Log(\"D3D11CreateDeviceAndSwapChain succeeded\");\n\treturn dummySwapChain;\n}\n\n//IDXGISwapChain* DirectXHook::CreateDummySwapChain(ID3D11Device* dummyDevice)\n//{\n//\tIDXGIDevice2* pDXGIDevice;\n//\tCheckSuccess(dummyDevice->QueryInterface(__uuidof(IDXGIDevice2), (void**)&pDXGIDevice));\n//\n//\tIDXGIAdapter* pDXGIAdapter;\n//\tCheckSuccess(pDXGIDevice->GetParent(__uuidof(IDXGIAdapter), (void**)&pDXGIAdapter));\n//\n//\tWNDCLASSEX wc { 0 };\n//\twc.cbSize = sizeof(wc);\n//\twc.lpfnWndProc = DefWindowProc;\n//\twc.lpszClassName = TEXT(\"dummy class\");\n//\tRegisterClassExA(&wc);\n//\tHWND hwnd = CreateWindow(wc.lpszClassName, TEXT(\"\"), WS_DISABLED, 0, 0, 0, 0, NULL, NULL, NULL, nullptr);\n//\n//\tDXGI_SWAP_CHAIN_DESC1 desc{ 0 };\n//\tdesc.Width = 1;\n//\tdesc.Height = 1;\n//\tdesc.Format = DXGI_FORMAT_R16G16B16A16_FLOAT;\n//\tdesc.Stereo = FALSE;\n//\tdesc.SampleDesc = { 1, 0 };\n//\tdesc.BufferUsage = DXGI_USAGE_BACK_BUFFER;\n//\tdesc.BufferCount = 2;\n//\tdesc.Scaling = DXGI_SCALING_STRETCH;\n//\tdesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;\n//\tdesc.AlphaMode = DXGI_ALPHA_MODE_IGNORE;\n//\tdesc.Flags = DXGI_SWAP_CHAIN_FLAG_DISPLAY_ONLY;\n//\n//\tIDXGIFactory2* pIDXGIFactory = nullptr;\n//\tCheckSuccess(pDXGIAdapter->GetParent(__uuidof(IDXGIFactory2), (void**)&pIDXGIFactory));\n//\n//\tIDXGISwapChain* dummySwapChain = nullptr;\n//\tIDXGISwapChain1* dummySwapChain1 = nullptr;\n//\tCheckSuccess(pIDXGIFactory->CreateSwapChainForHwnd(\n//\t\tdummyDevice,\n//\t\thwnd,\n//\t\t&desc,\n//\t\tNULL,\n//\t\tNULL,\n//\t\t&dummySwapChain1));\n//\n//\tDestroyWindow(hwnd);\n//\tUnregisterClass(wc.lpszClassName, GetModuleHandle(nullptr));\n//\n//\tCheckSuccess(dummySwapChain1->QueryInterface(__uuidof(IDXGISwapChain), (void**)&dummySwapChain));\n//\t//dummySwapChain1->Release();\n//\treturn dummySwapChain;\n//}\n\n//ID3D11Device* DirectXHook::CreateDummyD3D11Device()\n//{\n//\tD3D_FEATURE_LEVEL featureLevels[] =\n//\t{\n//\t\tD3D_FEATURE_LEVEL_11_0,\n//\t\tD3D_FEATURE_LEVEL_11_1\n//\t};\n//\n//\tID3D11Device* dummyDevice = nullptr;\n//\tCheckSuccess(D3D11CreateDevice(\n//\t\tNULL,\n//\t\tD3D_DRIVER_TYPE_HARDWARE,\n//\t\tNULL,\n//\t\t0,\n//\t\tfeatureLevels,\n//\t\t2,\n//\t\tD3D11_SDK_VERSION,\n//\t\t&dummyDevice,\n//\t\tNULL,\n//\t\tNULL));\n//\n//\treturn dummyDevice;\n//}\n\nID3D12CommandQueue* DirectXHook::CreateDummyCommandQueue()\n{\n\tD3D12_COMMAND_QUEUE_DESC queueDesc {};\n\tqueueDesc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE;\n\tqueueDesc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT;\n\n\tID3D12Device* d12Device = nullptr;\n\tD3D12CreateDevice(NULL, D3D_FEATURE_LEVEL_11_0, _uuidof(ID3D12Device), (void**)&d12Device);\n\n\tID3D12CommandQueue* dummyCommandQueue;\n\td12Device->CreateCommandQueue(&queueDesc, IID_PPV_ARGS(&dummyCommandQueue));\n\n\tlogger.Log(\"Command queue: %p\", dummyCommandQueue);\n\n\treturn dummyCommandQueue;\n}\n\nvoid DirectXHook::HookSwapChain(\n\tIDXGISwapChain* dummySwapChain,\n\tuintptr_t presentDetourFunction,\n\tuintptr_t resizeBuffersDetourFunction,\n\tuintptr_t* presentReturnAddress,\n\tuintptr_t* resizeBuffersReturnAddress)\n{\n\tint vmtPresentOffset = 8;\n\tint vmtResizeBuffersOffset = 13;\n\tsize_t numBytes = sizeof(size_t);\n\n\tuintptr_t vmtBaseAddress = (*(uintptr_t*)dummySwapChain);\n\tuintptr_t vmtPresentIndex = (vmtBaseAddress + (numBytes * vmtPresentOffset));\n\tuintptr_t vmtResizeBuffersIndex = (vmtBaseAddress + (numBytes * vmtResizeBuffersOffset));\n\n\tlogger.Log(\"SwapChain VMT base address: %p\", vmtBaseAddress);\n\tlogger.Log(\"SwapChain VMT Present index: %p\", vmtPresentIndex);\n\tlogger.Log(\"SwapChain VMT ResizeBuffers index: %p\", vmtResizeBuffersIndex);\n\n\tMemoryUtils::ToggleMemoryProtection(false, vmtPresentIndex, numBytes);\n\tMemoryUtils::ToggleMemoryProtection(false, vmtResizeBuffersIndex, numBytes);\n\n\tuintptr_t presentAddress = (*(uintptr_t*)vmtPresentIndex);\n\tuintptr_t resizeBuffersAddress = (*(uintptr_t*)vmtResizeBuffersIndex);\n\n\tlogger.Log(\"Present address: %p\", presentAddress);\n\tlogger.Log(\"ResizeBuffers address: %p\", resizeBuffersAddress);\n\n\tMemoryUtils::ToggleMemoryProtection(true, vmtPresentIndex, numBytes);\n\tMemoryUtils::ToggleMemoryProtection(true, vmtResizeBuffersIndex, numBytes);\n\n\tMemoryUtils::PlaceHook(presentAddress, presentDetourFunction, presentReturnAddress);\n\tMemoryUtils::PlaceHook(resizeBuffersAddress, resizeBuffersDetourFunction, resizeBuffersReturnAddress);\n\n\tdummySwapChain->Release();\n}\n\nvoid DirectXHook::HookCommandQueue(\n\tID3D12CommandQueue* dummyCommandQueue,\n\tuintptr_t executeCommandListsDetourFunction,\n\tuintptr_t* executeCommandListsReturnAddress)\n{\n\tint vmtExecuteCommandListsOffset = 10;\n\tsize_t numBytes = 8;\n\n\tuintptr_t vmtBaseAddress = (*(uintptr_t*)dummyCommandQueue);\n\tuintptr_t vmtExecuteCommandListsIndex = (vmtBaseAddress + (numBytes * vmtExecuteCommandListsOffset));\n\n\tlogger.Log(\"CommandQueue VMT base address: %p\", vmtBaseAddress);\n\tlogger.Log(\"ExecuteCommandLists index: %p\", vmtExecuteCommandListsIndex);\n\n\tMemoryUtils::ToggleMemoryProtection(false, vmtExecuteCommandListsIndex, numBytes);\n\texecuteCommandListsAddress = (*(uintptr_t*)vmtExecuteCommandListsIndex);\n\tMemoryUtils::ToggleMemoryProtection(true, vmtExecuteCommandListsIndex, numBytes);\n\n\tlogger.Log(\"ExecuteCommandLists address: %p\", executeCommandListsAddress);\n\n\tbool hookIsPresent = MemoryUtils::IsAddressHooked(executeCommandListsAddress);\n\tif (hookIsPresent)\n\t{\n\t\tlogger.Log(\"Hook already present in ExecuteCommandLists\");\n\t}\n\n\tMemoryUtils::PlaceHook(executeCommandListsAddress, executeCommandListsDetourFunction, executeCommandListsReturnAddress);\n\tdummyCommandQueue->Release();\n}\n\nvoid DirectXHook::UnhookCommandQueue()\n{\n\tMemoryUtils::Unhook(executeCommandListsAddress);\n}"
  },
  {
    "path": "src/DllMain.cpp",
    "content": "#include <Windows.h>\n\n#include \"DirectXHook.h\"\n#include \"Logger.h\"\n#include \"MemoryUtils.h\"\n#include \"Example/Example.h\"\n#include \"UniversalProxyDLL.h\"\n\nstatic Logger logger{ \"DllMain\" };\n\nvoid OpenDebugTerminal()\n{\n\tstd::fstream terminalEnableFile;\n\tterminalEnableFile.open(\"hook_enable_terminal.txt\", std::fstream::in);\n\tif (terminalEnableFile.is_open())\n\t{\n\t\tif (AllocConsole())\n\t\t{\n\t\t\tfreopen_s((FILE**)stdout, \"CONOUT$\", \"w\", stdout);\n\t\t\tSetWindowText(GetConsoleWindow(), \"DirectXHook\");\n\t\t}\n\t\tterminalEnableFile.close();\n\t}\n}\n\nDWORD WINAPI HookThread(LPVOID lpParam)\n{\n\tstatic Renderer renderer;\n\tstatic DirectXHook dxHook(&renderer);\n\tstatic Example example;\n\tdxHook.AddRenderCallback(&example);\n\tdxHook.Hook();\n\treturn 0;\n}\n\nBOOL WINAPI DllMain(HMODULE module, DWORD reason, LPVOID)\n{\n\tif (reason == DLL_PROCESS_ATTACH)\n\t{\n\t\tOpenDebugTerminal();\n\t\tUPD::MuteLogging();\n\t\tUPD::CreateProxy(module);\n\t\tCreateThread(0, 0, &HookThread, 0, 0, NULL);\n\t}\n\n\treturn 1;\n}"
  },
  {
    "path": "src/Renderer.cpp",
    "content": "#include \"Renderer.h\"\n\nusing namespace Microsoft::WRL;\nusing namespace DirectX;\n\nvoid Renderer::OnPresent(IDXGISwapChain* pThis, UINT syncInterval, UINT flags)\n{\n\tif (mustInitializeD3DResources)\n\t{\n\t\tif (!InitD3DResources(pThis))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tmustInitializeD3DResources = false;\n\t}\n\n\tRender();\n}\n\nvoid Renderer::OnResizeBuffers(IDXGISwapChain* pThis, UINT bufferCount, UINT width, UINT height, DXGI_FORMAT newFormat, UINT swapChainFlags)\n{\n\tlogger.Log(\"ResizeBuffers was called!\");\n\tReleaseViewsBuffersAndContext();\n\tmustInitializeD3DResources = true;\n}\n\nvoid Renderer::SetDrawExampleTriangle(bool doDraw)\n{\n\tdrawExamples = doDraw;\n}\n\nvoid Renderer::AddRenderCallback(IRenderCallback* object)\n{\n\tcallbackObject = object;\n\tcallbackInitialized = false;\n}\n\nvoid Renderer::SetCommandQueue(ID3D12CommandQueue* commandQueue)\n{\n\tthis->commandQueue = commandQueue;\n}\n\nvoid Renderer::SetGetCommandQueueCallback(void (*callback)())\n{\n\tcallbackGetCommandQueue = callback;\n}\n\nbool Renderer::InitD3DResources(IDXGISwapChain* swapChain)\n{\n\tlogger.Log(\"Initializing D3D resources...\");\n\n\ttry\n\t{\n\t\tif (!isDeviceRetrieved)\n\t\t{\n\t\t\tthis->swapChain = swapChain;\n\t\t\tisDeviceRetrieved = RetrieveD3DDeviceFromSwapChain();\n\t\t}\n\n\t\tif (WaitForCommandQueueIfRunningD3D12())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tGetSwapChainDescription();\n\t\tGetBufferCount();\n\t\tGetSwapchainWindowInfo();\n\t\tCreateViewport();\n\t\tInitD3D();\n\t}\n\tcatch (std::string errorMsg)\n\t{\n\t\tlogger.Log(errorMsg);\n\t\treturn false;\n\t}\n\n\tfirstTimeInitPerformed = true;\n\tlogger.Log(\"Successfully initialized D3D resources\");\n\treturn true;\n}\n\nbool Renderer::RetrieveD3DDeviceFromSwapChain()\n{\n\tlogger.Log(\"Retrieving D3D device...\");\n\n\tbool d3d11DeviceRetrieved = SUCCEEDED(swapChain->GetDevice(__uuidof(ID3D11Device), (void**)d3d11Device.GetAddressOf()));\n\tif (d3d11DeviceRetrieved)\n\t{\n\t\tlogger.Log(\"Retrieved D3D11 device\");\n\t\treturn true;\n\t}\n\t\n\tbool d3d12DeviceRetrieved = SUCCEEDED(swapChain->GetDevice(__uuidof(ID3D12Device), (void**)d3d12Device.GetAddressOf()));\n\tif (d3d12DeviceRetrieved)\n\t{\n\t\tlogger.Log(\"Retrieved D3D12 device\");\n\t\tisRunningD3D12 = true;\n\t\treturn true;\n\t}\n\n\tthrow(\"Failed to retrieve D3D device\");\n}\n\nvoid Renderer::GetSwapChainDescription()\n{\n\tZeroMemory(&swapChainDesc, sizeof(DXGI_SWAP_CHAIN_DESC));\n\tswapChain->GetDesc(&swapChainDesc);\n}\n\nvoid Renderer::GetBufferCount()\n{\n\tif (isRunningD3D12)\n\t{\n\t\tbufferCount = swapChainDesc.BufferCount;\n\t}\n\telse\n\t{\n\t\tbufferCount = 1;\n\t}\n}\n\nvoid Renderer::GetSwapchainWindowInfo()\n{\n\tRECT hwndRect;\n\tGetClientRect(swapChainDesc.OutputWindow, &hwndRect);\n\twindowWidth = hwndRect.right - hwndRect.left;\n\twindowHeight = hwndRect.bottom - hwndRect.top;\n\tlogger.Log(\"Window width: %i\", windowWidth);\n\tlogger.Log(\"Window height: %i\", windowHeight);\n\twindow = swapChainDesc.OutputWindow;\n}\n\nvoid Renderer::CreateViewport()\n{\n\tZeroMemory(&viewport, sizeof(D3D11_VIEWPORT));\n\tviewport.Width = windowWidth;\n\tviewport.Height = windowHeight;\n\tviewport.MinDepth = 0.0f;\n\tviewport.MaxDepth = 1.0f;\n\tviewport.TopLeftX = 0;\n\tviewport.TopLeftY = 0;\n}\n\nvoid Renderer::InitD3D()\n{\n\tif (!isRunningD3D12)\n\t{\n\t\tInitD3D11();\n\t}\n\telse\n\t{\n\t\tInitD3D12();\n\t}\n}\n\nvoid Renderer::InitD3D11()\n{\n\tlogger.Log(\"Initializing D3D11...\");\n\n\tif (!firstTimeInitPerformed)\n\t{\n\t\tCreateD3D11Context();\n\t\tCreateSpriteBatch();\n\t}\n\tCreateD3D11RenderTargetView();\n\n\tlogger.Log(\"Initialized D3D11\");\n}\n\nvoid Renderer::CreateD3D11Context()\n{\n\td3d11Device->GetImmediateContext(&d3d11Context);\n}\n\nvoid Renderer::CreateSpriteBatch()\n{\n\tspriteBatch = std::make_shared<SpriteBatch>(d3d11Context.Get());\n}\n\nvoid Renderer::CreateD3D11RenderTargetView()\n{\n\tComPtr<ID3D11Texture2D> backbuffer;\n\tswapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)backbuffer.GetAddressOf());\n\td3d11RenderTargetViews = std::vector<ComPtr<ID3D11RenderTargetView>>(1, nullptr);\n\td3d11Device->CreateRenderTargetView(backbuffer.Get(), nullptr, d3d11RenderTargetViews[0].GetAddressOf());\n\tbackbuffer.ReleaseAndGetAddressOf();\n}\n\nvoid Renderer::InitD3D12()\n{\n\tlogger.Log(\"Initializing D3D12...\");\n\t\n\tif (!firstTimeInitPerformed)\n\t{\n\t\tCreateD3D11On12Device();\n\t\tCheckSuccess(swapChain->QueryInterface(__uuidof(IDXGISwapChain3), &swapChain3));\n\t\tCreateSpriteBatch();\n\t}\n\tCreateD3D12Buffers();\n\n\tlogger.Log(\"Initialized D3D12\");\n}\n\nbool Renderer::WaitForCommandQueueIfRunningD3D12()\n{\n\tif (isRunningD3D12)\n\t{\n\t\tif (commandQueue.Get() == nullptr)\n\t\t{\n\t\t\tlogger.Log(\"Waiting for command queue...\");\n\t\t\tif (!getCommandQueueCalled && callbackGetCommandQueue != nullptr)\n\t\t\t{\n\t\t\t\tcallbackGetCommandQueue();\n\t\t\t\tgetCommandQueueCalled = true;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nvoid Renderer::CreateD3D11On12Device()\n{\n\tD3D_FEATURE_LEVEL featureLevels = { D3D_FEATURE_LEVEL_11_0 };\n\tbool d3d11On12DeviceCreated = CheckSuccess(\n\t\tD3D11On12CreateDevice(\n\t\t\td3d12Device.Get(),\n\t\t\tNULL,\n\t\t\t&featureLevels,\n\t\t\t1,\n\t\t\treinterpret_cast<IUnknown**>(commandQueue.GetAddressOf()),\n\t\t\t1,\n\t\t\t0,\n\t\t\td3d11Device.GetAddressOf(),\n\t\t\td3d11Context.GetAddressOf(),\n\t\t\tnullptr));\n\n\tbool d3d11On12DeviceChecked = CheckSuccess(d3d11Device.As(&d3d11On12Device));\n\n\tif (!d3d11On12DeviceCreated || !d3d11On12DeviceChecked)\n\t{\n\t\tthrow(\"Failed to create D3D11On12 device\");\n\t}\n}\n\nvoid Renderer::CreateD3D12Buffers()\n{\n\td3d12RenderTargets = std::vector<ComPtr<ID3D12Resource>>(bufferCount, nullptr);\n\td3d11WrappedBackBuffers = std::vector<ComPtr<ID3D11Resource>>(bufferCount, nullptr);\n\td3d11RenderTargetViews = std::vector<ComPtr<ID3D11RenderTargetView>>(bufferCount, nullptr);\n\n\tComPtr<ID3D12DescriptorHeap> rtvHeap = CreateD3D12RtvHeap();\n\tD3D12_CPU_DESCRIPTOR_HANDLE rtvHandle(rtvHeap->GetCPUDescriptorHandleForHeapStart());\n\tUINT rtvDescriptorSize = d3d12Device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV);\n\tfor (UINT i = 0; i < bufferCount; i++)\n\t{\n\t\tCreateD3D12RenderTargetView(i, rtvHandle);\n\t\tCreateD3D11WrappedBackBuffer(i);\n\t\tCreateD3D11RenderTargetViewWithWrappedBackBuffer(i);\n\t\trtvHandle.ptr = SIZE_T(INT64(rtvHandle.ptr) + INT64(1) * INT64(rtvDescriptorSize));\n\t}\n}\n\nComPtr<ID3D12DescriptorHeap> Renderer::CreateD3D12RtvHeap()\n{\n\tComPtr<ID3D12DescriptorHeap> rtvHeap;\n\tD3D12_DESCRIPTOR_HEAP_DESC rtvHeapDesc = {};\n\trtvHeapDesc.NumDescriptors = bufferCount;\n\trtvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;\n\trtvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;\n\tCheckSuccess(d3d12Device->CreateDescriptorHeap(&rtvHeapDesc, IID_PPV_ARGS(rtvHeap.GetAddressOf())));\n\treturn rtvHeap;\n}\n\nvoid Renderer::CreateD3D12RenderTargetView(UINT bufferIndex, D3D12_CPU_DESCRIPTOR_HANDLE rtvHandle)\n{\n\tif (!CheckSuccess(swapChain->GetBuffer(bufferIndex, IID_PPV_ARGS(&d3d12RenderTargets[bufferIndex]))))\n\t{\n\t\tthrow(\"Failed to create D3D12 render target view\");\n\t}\n\td3d12Device->CreateRenderTargetView(d3d12RenderTargets[bufferIndex].Get(), nullptr, rtvHandle);\n}\n\nvoid Renderer::CreateD3D11WrappedBackBuffer(UINT bufferIndex)\n{\n\tD3D11_RESOURCE_FLAGS d3d11Flags = { D3D11_BIND_RENDER_TARGET };\n\tif (!CheckSuccess(\n\t\td3d11On12Device->CreateWrappedResource(\n\t\t\td3d12RenderTargets[bufferIndex].Get(),\n\t\t\t&d3d11Flags,\n\t\t\tD3D12_RESOURCE_STATE_RENDER_TARGET,\n\t\t\tD3D12_RESOURCE_STATE_PRESENT,\n\t\t\tIID_PPV_ARGS(&d3d11WrappedBackBuffers[bufferIndex]))))\n\t{\n\t\tthrow \"Failed to create D3D11 wrapped backbuffer\";\n\t}\n}\n\nvoid Renderer::CreateD3D11RenderTargetViewWithWrappedBackBuffer(UINT bufferIndex)\n{\n\tif (!CheckSuccess(\n\t\td3d11Device->CreateRenderTargetView(\n\t\t\td3d11WrappedBackBuffers[bufferIndex].Get(),\n\t\t\tnullptr,\n\t\t\td3d11RenderTargetViews[bufferIndex].GetAddressOf())))\n\t{\n\t\tthrow \"Failed to create D3D11 render target view\";\n\t}\n}\n\nvoid Renderer::Render()\n{\t\n\tPreRender();\n\n\tif (drawExamples)\n\t{\n\t\tif (!examplesLoaded)\n\t\t{\n\t\t\tCreatePipeline();\n\t\t\tCreateExampleTriangle();\n\t\t\tCreateExampleFont();\n\t\t\texamplesLoaded = true;\n\t\t}\n\n\t\tDrawExampleTriangle();\n\t\tDrawExampleText();\n\t}\n\n\tRenderCallbacks();\n\tPostRender();\n}\n\nvoid Renderer::PreRender()\n{\n\tif (isRunningD3D12)\n\t{\n\t\tbufferIndex = swapChain3->GetCurrentBackBufferIndex();\n\t\td3d11On12Device->AcquireWrappedResources(d3d11WrappedBackBuffers[bufferIndex].GetAddressOf(), 1);\n\t}\n\n\td3d11Context->OMSetRenderTargets(1, d3d11RenderTargetViews[bufferIndex].GetAddressOf(), 0);\n\td3d11Context->RSSetViewports(1, &viewport);\n}\n\nvoid Renderer::RenderCallbacks()\n{\n\tif (callbackObject != nullptr)\n\t{\n\t\tif (!callbackInitialized)\n\t\t{\n\t\t\tcallbackObject->Init(d3d11Device, d3d11Context, spriteBatch, window);\n\t\t\tcallbackObject->Setup();\n\t\t\tcallbackInitialized = true;\n\t\t}\n\n\t\tspriteBatch->Begin(SpriteSortMode_BackToFront);\n\t\tcallbackObject->Render();\n\t\tspriteBatch->End();\n\t}\n}\n\nvoid Renderer::PostRender()\n{\n\tif (isRunningD3D12)\n\t{\n\t\td3d11On12Device->ReleaseWrappedResources(d3d11WrappedBackBuffers[bufferIndex].GetAddressOf(), 1);\n\t\td3d11Context->Flush();\n\t}\n}\n\n// Creates the necessary things for rendering the examples\nvoid Renderer::CreatePipeline()\n{\n\tComPtr<ID3DBlob> vertexShaderBlob = LoadShader(shaderData, \"vs_5_0\", \"VS\").Get();\n\tComPtr<ID3DBlob> pixelShaderTexturesBlob = LoadShader(shaderData, \"ps_5_0\", \"PSTex\").Get();\n\tComPtr<ID3DBlob> pixelShaderBlob = LoadShader(shaderData, \"ps_5_0\", \"PS\").Get();\n\n\td3d11Device->CreateVertexShader(\n\t\tvertexShaderBlob->GetBufferPointer(),\n\t\tvertexShaderBlob->GetBufferSize(),\n\t\tnullptr, \n\t\tvertexShader.GetAddressOf());\n\n\td3d11Device->CreatePixelShader(\n\t\tpixelShaderTexturesBlob->GetBufferPointer(),\n\t\tpixelShaderTexturesBlob->GetBufferSize(), \n\t\tnullptr, \n\t\tpixelShaderTextures.GetAddressOf());\n\n\td3d11Device->CreatePixelShader(pixelShaderBlob->GetBufferPointer(),\n\t\tpixelShaderBlob->GetBufferSize(), nullptr, pixelShader.GetAddressOf());\n\n\tD3D11_INPUT_ELEMENT_DESC inputLayoutDesc[3] =\n\t{\n\t\t{ \"POSITION\", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },\n\t\t{ \"COLOR\", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },\n\t\t{ \"TEXCOORD\", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }\n\t};\n\n\td3d11Device->CreateInputLayout(\n\t\tinputLayoutDesc,\n\t\tARRAYSIZE(inputLayoutDesc),\n\t\tvertexShaderBlob->GetBufferPointer(),\n\t\tvertexShaderBlob->GetBufferSize(), \n\t\tinputLayout.GetAddressOf());\n\n\tD3D11_SAMPLER_DESC samplerDesc;\n\tZeroMemory(&samplerDesc, sizeof(D3D11_SAMPLER_DESC));\n\tsamplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;\n\tsamplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;\n\tsamplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;\n\tsamplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;\n\tsamplerDesc.ComparisonFunc = D3D11_COMPARISON_NEVER;\n\tsamplerDesc.MinLOD = 0;\n\tsamplerDesc.MaxLOD = D3D11_FLOAT32_MAX;\n\n\td3d11Device->CreateSamplerState(&samplerDesc, &samplerState);\n\n\tD3D11_TEXTURE2D_DESC dsDesc;\n\tdsDesc.Width = windowWidth;\n\tdsDesc.Height = windowHeight;\n\tdsDesc.MipLevels = 1;\n\tdsDesc.ArraySize = 1;\n\tdsDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;\n\tdsDesc.SampleDesc.Count = 1;\n\tdsDesc.SampleDesc.Quality = 0;\n\tdsDesc.Usage = D3D11_USAGE_DEFAULT;\n\tdsDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;\n\tdsDesc.CPUAccessFlags = 0;\n\tdsDesc.MiscFlags = 0;\n\n\td3d11Device->CreateTexture2D(&dsDesc, 0, depthStencilBuffer.GetAddressOf());\n\td3d11Device->CreateDepthStencilView(depthStencilBuffer.Get(), 0, depthStencilView.GetAddressOf());\n}\n\nComPtr<ID3DBlob> Renderer::LoadShader(const char* shader, std::string targetShaderVersion, std::string shaderEntry)\n{\n\tlogger.Log(\"Loading shader: %s\", shaderEntry.c_str());\n\tComPtr<ID3DBlob> errorBlob = nullptr;\n\tComPtr<ID3DBlob> shaderBlob;\n\n\tD3DCompile(\n\t\tshader, \n\t\tstrlen(shader), \n\t\t0, \n\t\tnullptr, \n\t\tnullptr, \n\t\tshaderEntry.c_str(), \n\t\ttargetShaderVersion.c_str(), \n\t\tD3DCOMPILE_ENABLE_STRICTNESS, \n\t\t0, \n\t\tshaderBlob.GetAddressOf(), \n\t\terrorBlob.GetAddressOf());\n\n\tif (errorBlob)\n\t{\n\t\tchar error[256]{ 0 };\n\t\tmemcpy(error, errorBlob->GetBufferPointer(), errorBlob->GetBufferSize());\n\t\tlogger.Log(\"Shader error: %s\", error);\n\t\treturn nullptr;\n\t}\n\n\treturn shaderBlob;\n}\n\nvoid Renderer::CreateExampleTriangle()\n{\n\t// Create the vertex buffer\n\tVertex vertices[] =\n\t{\n\t\t{ XMFLOAT3(0.0f, 0.1f, 0.0f), XMFLOAT4(1.0f, 0.0f, 0.0f, 1.0f), XMFLOAT2(0.5f, 0.0f) },\n\t\t{ XMFLOAT3(0.1f, -0.1f, 0.1f), XMFLOAT4(0.0f, 1.0f, 0.0f, 1.0f), XMFLOAT2(1.0f, 0.5f) },\n\t\t{ XMFLOAT3(-0.1f, -0.1f, 0.1f), XMFLOAT4(0.0f, 0.0f, 1.0f, 1.0f), XMFLOAT2(0.0f, 0.5f) },\n\t\t{ XMFLOAT3(0.0f, -0.1f, -0.1f), XMFLOAT4(1.0f, 0.0f, 1.0f, 1.0f), XMFLOAT2(1.0f, 0.5f) }\n\t};\n\n\tD3D11_BUFFER_DESC vbDesc = { 0 };\n\tZeroMemory(&vbDesc, sizeof(D3D11_BUFFER_DESC));\n\tvbDesc.ByteWidth = sizeof(Vertex) * ARRAYSIZE(vertices);\n\tvbDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;\n\tvbDesc.Usage = D3D11_USAGE_DEFAULT;\n\tvbDesc.StructureByteStride = sizeof(Vertex);\n\n\tD3D11_SUBRESOURCE_DATA vbData = { vertices, 0, 0 };\n\n\td3d11Device->CreateBuffer(&vbDesc, &vbData, vertexBuffer.GetAddressOf());\n\n\t// Create the index buffer\n\tunsigned int indices[] =\n\t{\n\t\t0, 2, 1,\n\t\t0, 3, 2,\n\t\t0, 1, 3,\n\t\t1, 2, 3\n\t};\n\n\ttriangleNumIndices = ARRAYSIZE(indices);\n\n\tD3D11_BUFFER_DESC ibDesc;\n\tZeroMemory(&ibDesc, sizeof(ibDesc));\n\tibDesc.ByteWidth = sizeof(unsigned int) * ARRAYSIZE(indices);\n\tibDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;\n\tibDesc.Usage = D3D11_USAGE_DEFAULT;\n\tibDesc.CPUAccessFlags = 0;\n\tibDesc.MiscFlags = 0;\n\n\tD3D11_SUBRESOURCE_DATA ibData = { indices, 0, 0 };\n\n\td3d11Device->CreateBuffer(&ibDesc, &ibData, indexBuffer.GetAddressOf());\n\n\t// Create the constant buffer\n\t// We need to send the world view projection (WVP) matrix to the shader\n\tD3D11_BUFFER_DESC cbDesc = { 0 };\n\tZeroMemory(&cbDesc, sizeof(D3D11_BUFFER_DESC));\n\tcbDesc.ByteWidth = sizeof(ConstantBufferData);\n\tcbDesc.Usage = D3D11_USAGE_DYNAMIC;\n\tcbDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;\n\tcbDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;\n\tcbDesc.MiscFlags = 0;\n\tcbDesc.StructureByteStride = 0;\n\n\tD3D11_SUBRESOURCE_DATA cbData = { &constantBufferData, 0, 0 };\n\n\td3d11Device->CreateBuffer(&cbDesc, &cbData, constantBuffer.GetAddressOf());\n\n\t// Create the rasterizer state.\n\t// We need to control which face of a shape is culled, and we need to know which order to set our indices\n\tD3D11_RASTERIZER_DESC rsDesc;\n\tZeroMemory(&rsDesc, sizeof(D3D11_RASTERIZER_DESC));\n\trsDesc.FillMode = D3D11_FILL_SOLID;\n\trsDesc.CullMode = D3D11_CULL_BACK;\n\trsDesc.FrontCounterClockwise = FALSE;\n\trsDesc.DepthClipEnable = TRUE;\n\n\td3d11Device->CreateRasterizerState(&rsDesc, rasterizerState.GetAddressOf());\n\n\t// Create the depth stencil state\n\tD3D11_DEPTH_STENCIL_DESC dsDesc;\n\tZeroMemory(&dsDesc, sizeof(D3D11_DEPTH_STENCIL_DESC));\n\tdsDesc.DepthEnable = true;\n\tdsDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;\n\tdsDesc.DepthFunc = D3D11_COMPARISON_LESS_EQUAL;\n\n\td3d11Device->CreateDepthStencilState(&dsDesc, depthStencilState.GetAddressOf());\n}\n\nvoid Renderer::CreateExampleFont()\n{\n\tstd::fstream file = std::fstream(\".\\\\hook_fonts\\\\OpenSans-22.spritefont\");\n\n\tif (!file.fail())\n\t{\n\t\tfile.close();\n\t\texampleFont = std::make_shared<SpriteFont>(d3d11Device.Get(), L\".\\\\hook_fonts\\\\OpenSans-22.spritefont\");\n\t}\n\telse\n\t{\n\t\tlogger.Log(\"Failed to load the example font\");\n\t}\n}\n\nvoid Renderer::DrawExampleTriangle()\n{\n\td3d11Context->OMSetRenderTargets(1, d3d11RenderTargetViews[bufferIndex].GetAddressOf(), depthStencilView.Get());\n\td3d11Context->ClearDepthStencilView(depthStencilView.Get(), D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);\n\n\ttrianglePos = XMVectorSet\n\t(\n\t\tXMVectorGetX(trianglePos) + triangleVelX,\n\t\tXMVectorGetY(trianglePos) + triangleVelY,\n\t\tXMVectorGetZ(trianglePos),\n\t\t1.0f\n\t);\n\n\tint hit = 0;\n\n\t// Check if the triangle hits an edge of the screen\n\tif (triangleNdc.x > 0.96f)\n\t{\n\t\ttriangleVelX = -triangleSpeed;\n\t\thit++;\n\t}\n\telse if (triangleNdc.x < -0.96f)\n\t{\n\t\ttriangleVelX = triangleSpeed;\n\t\thit++;\n\t}\n\n\tif (triangleNdc.y > 0.90f)\n\t{\n\t\ttriangleVelY = -triangleSpeed;\n\t\thit++;\n\t}\n\telse if (triangleNdc.y < -0.90f)\n\t{\n\t\ttriangleVelY = triangleSpeed;\n\t\thit++;\n\t}\n\n\tif (hit == 2)\n\t{\n\t\tlogger.Log(\"Hit the corner!\");\n\t}\n\n\ttriangleCounter += 0.01f;\n\ttriangleRotX = cos(triangleCounter) * 2;\n\ttriangleRotY = sin(triangleCounter) * 2;\n\n\tXMMATRIX world = XMMatrixIdentity();\n\n\tXMMATRIX translation = XMMatrixTranslation(XMVectorGetX(trianglePos), XMVectorGetY(trianglePos), XMVectorGetZ(trianglePos));\n\n\tXMMATRIX rotationX = XMMatrixRotationX(triangleRotX);\n\tXMMATRIX rotationY = XMMatrixRotationY(triangleRotY);\n\tXMMATRIX rotationZ = XMMatrixRotationZ(triangleRotZ);\n\tXMMATRIX rotation = rotationX * rotationY * rotationZ;\n\n\tXMMATRIX scale = XMMatrixScaling(triangleScale.x, triangleScale.y, triangleScale.z);\n\n\tworld = scale * rotation * translation;\n\n\tXMMATRIX view = XMMatrixLookAtLH(XMVECTOR{ 0.0f, 0.0f, -5.5f }, XMVECTOR{ 0.0f, 0.0f, 0.0f }, XMVECTOR{ 0.0f, 1.0f, 0.0f });\n\n\tXMMATRIX projection = XMMatrixPerspectiveFovLH(1.3, ((float)windowWidth / (float)windowHeight), 0.1f, 1000.0f);\n\n\t// Get the triangle's screen space (NDC) from its world space, used for collision checking and text positioning\n\tXMVECTOR clipSpacePos = XMVector4Transform((XMVector4Transform(trianglePos, view)), projection);\n\n\tXMStoreFloat3\n\t(\n\t\t&triangleNdc,\n\t\t{ \n\t\t\tXMVectorGetX(clipSpacePos) / XMVectorGetW(clipSpacePos),\n\t\t\tXMVectorGetY(clipSpacePos) / XMVectorGetW(clipSpacePos),\n\t\t\tXMVectorGetZ(clipSpacePos) / XMVectorGetW(clipSpacePos) \n\t\t}\n\t);\n\n\tconstantBufferData.wvp = XMMatrixTranspose(world * view * projection);\n\n\t// Map the constant buffer on the GPU\n\tD3D11_MAPPED_SUBRESOURCE mappedResource;\n\td3d11Context->Map(constantBuffer.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);\n\tmemcpy(mappedResource.pData, &constantBufferData, sizeof(ConstantBufferData));\n\td3d11Context->Unmap(constantBuffer.Get(), 0);\n\n\td3d11Context->VSSetShader(vertexShader.Get(), nullptr, 0);\n\td3d11Context->PSSetShader(pixelShader.Get(), nullptr, 0);\n\n\td3d11Context->IASetInputLayout(inputLayout.Get());\n\td3d11Context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);\n\n\td3d11Context->RSSetState(rasterizerState.Get());\n\td3d11Context->OMSetDepthStencilState(depthStencilState.Get(), 0);\n\n\td3d11Context->VSSetConstantBuffers(0, 1, constantBuffer.GetAddressOf());\n\n\tUINT stride = sizeof(Vertex);\n\tUINT offset = 0;\n\n\td3d11Context->IASetVertexBuffers(0, 1, vertexBuffer.GetAddressOf(), &stride, &offset);\n\td3d11Context->IASetIndexBuffer(indexBuffer.Get(), DXGI_FORMAT_R32_UINT, 0);\n\td3d11Context->DrawIndexed(triangleNumIndices, 0, 0);\n}\n\nvoid Renderer::DrawExampleText()\n{\n\tif (exampleFont == nullptr) return;\n\n\tconst char* text = \"Hello, World!\";\n\tconst char* text2 = \"This is a DirectX hook.\";\n\tXMFLOAT2 stringSize1, stringSize2;\n\tXMVECTOR textVector = exampleFont->MeasureString(text);\n\tXMVECTOR textVector2 = exampleFont->MeasureString(text2);\n\tXMStoreFloat2(&stringSize1, textVector);\n\tXMStoreFloat2(&stringSize2, textVector2);\n\n\tXMFLOAT2 textPos1 = XMFLOAT2\n\t(\n\t\t(windowWidth / 2) * (triangleNdc.x + 1) - (stringSize1.x / 2),\n\t\t(windowHeight - ((windowHeight / 2) * (triangleNdc.y + 1))) - (stringSize1.y / 2) - 150\n\t);\n\n\tXMFLOAT2 textPos2 = XMFLOAT2\n\t(\n\t\t(windowWidth / 2) * (triangleNdc.x + 1) - (stringSize2.x / 2),\n\t\t(windowHeight - ((windowHeight / 2) * (triangleNdc.y + 1))) - (stringSize2.y / 2) + 150\n\t);\n\n\tspriteBatch->Begin();\n\texampleFont->DrawString(spriteBatch.get(), text, textPos1);\n\texampleFont->DrawString(spriteBatch.get(), text2, textPos2);\n\tspriteBatch->End();\n}\n\nvoid Renderer::ReleaseViewsBuffersAndContext()\n{\n\tfor (int i = 0; i < bufferCount; i++)\n\t{\n\t\tif (d3d12Device.Get() == nullptr)\n\t\t{\n\t\t\td3d11RenderTargetViews[i].ReleaseAndGetAddressOf();\n\t\t}\n\t\telse\n\t\t{\n\t\t\td3d11RenderTargetViews[i].ReleaseAndGetAddressOf();\n\t\t\td3d12RenderTargets[i].ReleaseAndGetAddressOf();\n\t\t\td3d11WrappedBackBuffers[i].ReleaseAndGetAddressOf();\n\t\t}\n\t}\n\t\n\tif (d3d11Context.Get() != nullptr)\n\t{\n\t\td3d11Context->Flush();\n\t}\n}\n\nbool Renderer::CheckSuccess(HRESULT hr)\n{\n\tif (SUCCEEDED(hr))\n\t{\n\t\treturn true;\n\t}\n\t_com_error err(hr);\n\tlogger.Log(\"%s\", err.ErrorMessage());\n\treturn false;\n}"
  },
  {
    "path": "src/Shaders.hlsl",
    "content": "// These are some generic shaders that we need to render the example triangle\n// Make sure that this file is excluded from the build to avoid compile time errors!\nR\"\"(\n\nTexture2D tex;\nSamplerState sampleType;\n\ncbuffer constantBuffer\n{\n    matrix wvp;\n};\n\nstruct VS_Input\n{\n    float4 pos : POSITION;\n    float4 color : COLOR;\n    float2 texcoord : TEXCOORD;\n};\n\nstruct VS_Output\n{\n    float4 pos : SV_POSITION;\n    float4 color : COLOR;\n    float2 texcoord : TEXCOORD;\n};\n\nVS_Output VS(VS_Input input)\n{\n    VS_Output vsout;\n    vsout.pos = mul(input.pos, wvp);\n    vsout.color = input.color;\n    vsout.texcoord = input.texcoord;\n    return vsout;\n}\n\nfloat4 PSTex(VS_Output input) : SV_Target\n{\n    float4 textureColor;\n    textureColor = tex.Sample(sampleType, input.texcoord);\n    return textureColor;\n}\n\nfloat4 PS(VS_Output input) : SV_Target\n{\n    return input.color;\n}\n\n)\"\""
  }
]