From ce1a4dcac0c42e3aee3de9af1a26b3823b273208 Mon Sep 17 00:00:00 2001 From: Scott Ehlert Date: Wed, 20 Dec 2017 01:56:23 -0600 Subject: [PATCH] 64-bit support for CSGO on Linux and macOS (#705) --- AMBuildScript | 170 +- bridge/include/BridgeAPI.h | 2 +- bridge/include/LogicProvider.h | 2 + configure.py | 2 + core/AMBuilder | 96 +- core/EventManager.cpp | 4 +- core/HalfLife2.cpp | 7 +- core/PlayerManager.cpp | 4 +- core/logic/AMBuilder | 175 +- core/logic/ExtensionSys.cpp | 10 +- core/logic/GameConfigs.cpp | 19 +- core/logic/LibrarySys.cpp | 8 +- core/logic/MemoryUtils.cpp | 188 +- core/logic/PseudoAddrManager.cpp | 169 + core/logic/PseudoAddrManager.h | 51 + core/logic/common_logic.cpp | 23 + core/logic/common_logic.h | 5 + core/logic/smn_core.cpp | 8 + core/logic/smn_gameconfigs.cpp | 4 + core/logic_bridge.cpp | 4 +- core/smn_entities.cpp | 5 + core/sourcemod.cpp | 14 +- core/sourcemod.h | 2 + extensions/bintools/AMBuilder | 45 +- extensions/bintools/CallMaker.cpp | 61 +- extensions/bintools/CallMaker.h | 17 +- extensions/bintools/CallWrapper.cpp | 23 +- extensions/bintools/CallWrapper.h | 4 + extensions/bintools/extension.cpp | 6 - extensions/bintools/jit_call_x64.cpp | 1198 ++++ extensions/bintools/jit_compile.h | 5 +- extensions/bintools/jit_hook.cpp | 2 +- extensions/bintools/x64_macros.h | 656 ++ extensions/clientprefs/AMBuilder | 35 +- extensions/cstrike/AMBuilder | 16 +- extensions/cstrike/itemdef-hash.h | 4 + extensions/cstrike/util_cstrike.cpp | 6 +- extensions/curl/AMBuilder | 42 +- extensions/curl/curl-src/lib/AMBuilder | 180 +- extensions/geoip/AMBuilder | 27 +- extensions/mysql/AMBuilder | 75 +- extensions/regex/AMBuilder | 49 +- extensions/regex/lib_darwin64/libpcre.a | Bin 0 -> 631368 bytes extensions/regex/lib_linux64/libpcre.a | Bin 0 -> 556222 bytes extensions/sdkhooks/AMBuilder | 16 +- extensions/sdktools/AMBuilder | 33 +- extensions/sdktools/tempents.cpp | 5 + extensions/sdktools/vcallbuilder.cpp | 4 + extensions/sdktools/vcaller.cpp | 4 + extensions/sdktools/vdecoder.cpp | 4 + extensions/sdktools/vglobals.cpp | 17 +- extensions/sdktools/vnatives.cpp | 6 +- extensions/sqlite/AMBuilder | 53 +- extensions/tf2/AMBuilder | 40 +- extensions/topmenus/AMBuilder | 33 +- extensions/updater/AMBuilder | 33 +- gamedata/core.games/common.games.txt | 2 + gamedata/core.games/engine.csgo.txt | 6 + gamedata/sdkhooks.games/engine.csgo.txt | 75 +- gamedata/sdktools.games/engine.csgo.txt | 76 +- gamedata/sm-cstrike.games/game.csgo.txt | 62 +- loader/AMBuilder | 48 +- loader/loader.cpp | 48 +- public/CDetour/detourhelpers.h | 49 +- public/CDetour/detours.cpp | 80 +- public/ISourceMod.h | 16 +- public/asm/asm.c | 62 +- public/asm/asm.h | 1 + public/extensions/IBinTools.h | 227 +- public/jit/jit_helpers.h | 16 + public/jit/x86/x86_macros.h | 10 + public/libudis86/decode.c | 1112 +++ public/libudis86/decode.h | 195 + public/libudis86/extern.h | 105 + public/libudis86/itab.c | 8401 +++++++++++++++++++++++ public/libudis86/itab.h | 678 ++ public/libudis86/syn-att.c | 224 + public/libudis86/syn-intel.c | 213 + public/libudis86/syn.c | 207 + public/libudis86/syn.h | 53 + public/libudis86/types.h | 250 + public/libudis86/udint.h | 89 + public/libudis86/udis86.c | 457 ++ public/libudis86/udis86.h | 33 + public/sm_platform.h | 44 + sourcepawn | 2 +- tools/buildbot/PackageScript | 44 +- tools/buildbot/bootstrap.pl | 8 + tools/checkout-deps.sh | 41 +- versionlib/AMBuilder | 24 +- 90 files changed, 15682 insertions(+), 947 deletions(-) create mode 100644 core/logic/PseudoAddrManager.cpp create mode 100644 core/logic/PseudoAddrManager.h create mode 100644 extensions/bintools/jit_call_x64.cpp create mode 100644 extensions/bintools/x64_macros.h create mode 100644 extensions/regex/lib_darwin64/libpcre.a create mode 100644 extensions/regex/lib_linux64/libpcre.a create mode 100644 public/libudis86/decode.c create mode 100644 public/libudis86/decode.h create mode 100644 public/libudis86/extern.h create mode 100644 public/libudis86/itab.c create mode 100644 public/libudis86/itab.h create mode 100644 public/libudis86/syn-att.c create mode 100644 public/libudis86/syn-intel.c create mode 100644 public/libudis86/syn.c create mode 100644 public/libudis86/syn.h create mode 100644 public/libudis86/types.h create mode 100644 public/libudis86/udint.h create mode 100644 public/libudis86/udis86.c create mode 100644 public/libudis86/udis86.h diff --git a/AMBuildScript b/AMBuildScript index e067eb06eb..853f0789e3 100644 --- a/AMBuildScript +++ b/AMBuildScript @@ -11,10 +11,29 @@ class SDK(object): self.platform = platform self.name = dir self.path = None # Actual path + self.platformSpec = platform + + # By default, nothing supports x64. + if type(platform) is list: + self.platformSpec = {p: ['x86'] for p in platform} + else: + self.platformSpec = platform + + def shouldBuild(self, target, archs): + if target.platform not in self.platformSpec: + return False + if not len([i for i in self.platformSpec[target.platform] if i in archs]): + return False + return True WinOnly = ['windows'] WinLinux = ['windows', 'linux'] WinLinuxMac = ['windows', 'linux', 'mac'] +CSGO = { + 'windows': ['x86'], + 'linux': ['x86', 'x64'], + 'mac': ['x64'] +} PossibleSDKs = { 'episode1': SDK('HL2SDK', '2.ep1', '1', 'EPISODEONE', WinLinux, 'episode1'), @@ -31,7 +50,7 @@ PossibleSDKs = { 'swarm': SDK('HL2SDK-SWARM', '2.swarm', '16', 'ALIENSWARM', WinOnly, 'swarm'), 'bgt': SDK('HL2SDK-BGT', '2.bgt', '4', 'BLOODYGOODTIME', WinOnly, 'bgt'), 'eye': SDK('HL2SDK-EYE', '2.eye', '5', 'EYE', WinOnly, 'eye'), - 'csgo': SDK('HL2SDKCSGO', '2.csgo', '21', 'CSGO', WinLinux, 'csgo'), + 'csgo': SDK('HL2SDKCSGO', '2.csgo', '21', 'CSGO', CSGO, 'csgo'), 'portal2': SDK('HL2SDKPORTAL2', '2.portal2', '17', 'PORTAL2', [], 'portal2'), 'blade': SDK('HL2SDKBLADE', '2.blade', '18', 'BLADE', WinLinux, 'blade'), 'insurgency': SDK('HL2SDKINSURGENCY', '2.insurgency', '19', 'INSURGENCY', WinLinuxMac, 'insurgency'), @@ -60,6 +79,28 @@ def ResolveEnvPath(env, folder): def Normalize(path): return os.path.abspath(os.path.normpath(path)) + +def SetArchFlags(compiler, arch, platform): + if compiler.behavior == 'gcc': + if arch == 'x86': + compiler.cflags += ['-m32'] + compiler.linkflags += ['-m32'] + if platform == 'mac': + compiler.linkflags += ['-arch', 'i386'] + elif arch == 'x64': + compiler.cflags += ['-m64', '-fPIC'] + compiler.linkflags += ['-m64'] + if platform == 'mac': + compiler.linkflags += ['-arch', 'x86_64'] + elif compiler.like('msvc'): + if builder.target.arch == 'x86': + compiler.linkflags += ['/MACHINE:X86'] + elif builder.target.arch == 'x64': + compiler.linkflags += ['/MACHINE:X64'] + +def AppendArchSuffix(binary, name, arch): + if arch == 'x64': + binary.localFolder = name + '.x64' class SMConfig(object): def __init__(self): @@ -68,10 +109,12 @@ class SMConfig(object): self.extensions = [] self.generated_headers = None self.mms_root = None - self.mysql_root = None + self.mysql_root = {} self.spcomp = None + self.spcomp_bins = None self.smx_files = {} self.versionlib = None + self.archs = builder.target.arch.replace('x86_64', 'x64').split(',') def use_auto_versioning(self): if builder.backend != 'amb2': @@ -105,7 +148,7 @@ class SMConfig(object): for sdk_name in PossibleSDKs: sdk = PossibleSDKs[sdk_name] - if builder.target.platform in sdk.platform: + if sdk.shouldBuild(builder.target, self.archs): if builder.options.hl2sdk_root: sdk_path = os.path.join(builder.options.hl2sdk_root, sdk.folder) else: @@ -118,8 +161,9 @@ class SMConfig(object): sdk.path = Normalize(sdk_path) self.sdks[sdk_name] = sdk - if len(self.sdks) < 1: - raise Exception('At least one SDK must be available.') + if len(self.sdks) < 1 and len(sdk_list): + raise Exception('No SDKs were found that build on {0}-{1}, nothing to do.'.format( + builder.target.platform, builder.target.arch)) if builder.options.mms_path: self.mms_root = builder.options.mms_path @@ -136,20 +180,39 @@ class SMConfig(object): if builder.options.hasMySql: if builder.options.mysql_path: - self.mysql_root = builder.options.mysql_path + self.mysql_root['x86'] = builder.options.mysql_path else: for i in range(7): - self.mysql_root = ResolveEnvPath('MYSQL5', 'mysql-5.' + str(i)) - if self.mysql_root: + self.mysql_root['x86'] = ResolveEnvPath('MYSQL5', 'mysql-5.' + str(i)) + if self.mysql_root['x86']: break - if not self.mysql_root or not os.path.isdir(self.mysql_root): + if not self.mysql_root['x86'] or not os.path.isdir(self.mysql_root['x86']): raise Exception('Could not find a path to MySQL!') - self.mysql_root = Normalize(self.mysql_root) + self.mysql_root['x86'] = Normalize(self.mysql_root['x86']) + + # For now, ignore 64-bit MySQL on Windows + if 'x64' in self.archs and builder.target.platform != 'windows': + if builder.options.mysql_path: + self.mysql_root['x64'] = builder.options.mysql64_path + else: + for i in range(7): + self.mysql_root['x64'] = ResolveEnvPath('MYSQL5_64', 'mysql-5.' + str(i) + '-x86_64') + if self.mysql_root['x64']: + break + if not self.mysql_root['x64'] or not os.path.isdir(self.mysql_root['x64']): + raise Exception('Could not find a path to 64-bit MySQL!') + self.mysql_root['x64'] = Normalize(self.mysql_root['x64']) def configure(self): builder.AddConfigureFile('pushbuild.txt') + + if not set(self.archs).issubset(['x86', 'x64']): + raise Exception('Unknown target architecture: {0}'.format(builder.target.arch)) cxx = builder.DetectCxx() + + if cxx.like('msvc') and len(self.archs) > 1: + raise Exception('Building multiple archs with MSVC is not currently supported') if cxx.like('gcc'): self.configure_gcc(cxx) @@ -205,7 +268,6 @@ class SMConfig(object): '-Wno-switch', '-Wno-array-bounds', '-msse', - '-m32', '-fvisibility=hidden', ] cxx.cxxflags += [ @@ -216,7 +278,6 @@ class SMConfig(object): '-Wno-overloaded-virtual', '-fvisibility-inlines-hidden', ] - cxx.linkflags += ['-m32'] have_gcc = cxx.family == 'gcc' have_clang = cxx.family == 'clang' @@ -271,7 +332,6 @@ class SMConfig(object): '/TP', ] cxx.linkflags += [ - '/MACHINE:X86', 'kernel32.lib', 'user32.lib', 'gdi32.lib', @@ -310,7 +370,6 @@ class SMConfig(object): cxx.cflags += ['-mmacosx-version-min=10.5'] cxx.linkflags += [ '-mmacosx-version-min=10.5', - '-arch', 'i386', '-lstdc++', '-stdlib=libstdc++', ] @@ -319,7 +378,7 @@ class SMConfig(object): def configure_windows(self, cxx): cxx.defines += ['WIN32', '_WINDOWS'] - def AddVersioning(self, binary): + def AddVersioning(self, binary, arch): if builder.target.platform == 'windows': binary.sources += ['version.rc'] binary.compiler.rcdefines += [ @@ -335,20 +394,22 @@ class SMConfig(object): '-current_version', self.productVersion ] if self.use_auto_versioning(): - binary.compiler.linkflags += [self.versionlib] + binary.compiler.linkflags += [self.versionlib[arch]] binary.compiler.sourcedeps += SM.generated_headers return binary - def LibraryBuilder(self, compiler, name): + def LibraryBuilder(self, compiler, name, arch): binary = compiler.Library(name) - self.AddVersioning(binary) + AppendArchSuffix(binary, name, arch) + self.AddVersioning(binary, arch) if binary.compiler.like('msvc'): binary.compiler.linkflags += ['/SUBSYSTEM:WINDOWS'] return binary - def ProgramBuilder(self, compiler, name): + def ProgramBuilder(self, compiler, name, arch): binary = compiler.Program(name) - self.AddVersioning(binary) + AppendArchSuffix(binary, name, arch) + self.AddVersioning(binary, arch) if '-static-libgcc' in binary.compiler.linkflags: binary.compiler.linkflags.remove('-static-libgcc') if '-lgcc_eh' in binary.compiler.linkflags: @@ -359,21 +420,25 @@ class SMConfig(object): binary.compiler.linkflags += ['/SUBSYSTEM:CONSOLE'] return binary - def StaticLibraryBuilder(self, compiler, name): + def StaticLibraryBuilder(self, compiler, name, arch): binary = compiler.StaticLibrary(name) + AppendArchSuffix(binary, name, arch) return binary; - def Library(self, context, name): + def Library(self, context, name, arch): compiler = context.cxx.clone() - return self.LibraryBuilder(compiler, name) + SetArchFlags(compiler, arch, builder.target.platform) + return self.LibraryBuilder(compiler, name, arch) - def Program(self, context, name): + def Program(self, context, name, arch): compiler = context.cxx.clone() - return self.ProgramBuilder(compiler, name) + SetArchFlags(compiler, arch, builder.target.platform) + return self.ProgramBuilder(compiler, name, arch) - def StaticLibrary(self, context, name): + def StaticLibrary(self, context, name, arch): compiler = context.cxx.clone() - return self.StaticLibraryBuilder(compiler, name) + SetArchFlags(compiler, arch, builder.target.platform) + return self.StaticLibraryBuilder(compiler, name, arch) def ConfigureForExtension(self, context, compiler): compiler.cxxincludes += [ @@ -386,13 +451,15 @@ class SMConfig(object): ] return compiler - def ExtLibrary(self, context, name): - binary = self.Library(context, name) + def ExtLibrary(self, context, name, arch): + binary = self.Library(context, name, arch) self.ConfigureForExtension(context, binary.compiler) return binary - def ConfigureForHL2(self, binary, sdk): + def ConfigureForHL2(self, binary, sdk, arch): compiler = binary.compiler + + SetArchFlags(compiler, arch, builder.target.platform) compiler.cxxincludes += [ os.path.join(self.mms_root, 'core'), @@ -435,6 +502,9 @@ class SMConfig(object): else: compiler.defines += ['COMPILER_GCC'] + if arch == 'x64': + compiler.defines += ['X64BITS', 'PLATFORM_64BITS'] + # For everything after Swarm, this needs to be defined for entity networking # to work properly with sendprop value changes. if sdk.name in ['blade', 'insurgency', 'doi', 'csgo']: @@ -446,6 +516,7 @@ class SMConfig(object): if sdk.name == 'csgo' and builder.target.platform == 'linux': compiler.linkflags += ['-lstdc++'] + compiler.defines += ['_GLIBCXX_USE_CXX11_ABI=0'] for path in paths: compiler.cxxincludes += [os.path.join(sdk.path, *path)] @@ -455,16 +526,20 @@ class SMConfig(object): lib_folder = os.path.join(sdk.path, 'linux_sdk') elif sdk.name in ['sdk2013', 'bms']: lib_folder = os.path.join(sdk.path, 'lib', 'public', 'linux32') + elif arch == 'x64': + lib_folder = os.path.join(sdk.path, 'lib', 'linux64') else: lib_folder = os.path.join(sdk.path, 'lib', 'linux') elif builder.target.platform == 'mac': if sdk.name in ['sdk2013', 'bms']: lib_folder = os.path.join(sdk.path, 'lib', 'public', 'osx32') + elif arch == 'x64': + lib_folder = os.path.join(sdk.path, 'lib', 'osx64') else: lib_folder = os.path.join(sdk.path, 'lib', 'mac') if builder.target.platform in ['linux', 'mac']: - if sdk.name in ['sdk2013', 'bms']: + if sdk.name in ['sdk2013', 'bms'] or arch == 'x64': compiler.postlink += [ compiler.Dep(os.path.join(lib_folder, 'tier1.a')), compiler.Dep(os.path.join(lib_folder, 'mathlib.a')) @@ -476,12 +551,17 @@ class SMConfig(object): ] if sdk.name in ['blade', 'insurgency', 'doi', 'csgo']: - compiler.postlink += [compiler.Dep(os.path.join(lib_folder, 'interfaces_i486.a'))] + if arch == 'x64': + compiler.postlink += [compiler.Dep(os.path.join(lib_folder, 'interfaces.a'))] + else: + compiler.postlink += [compiler.Dep(os.path.join(lib_folder, 'interfaces_i486.a'))] dynamic_libs = [] if builder.target.platform == 'linux': if sdk.name in ['css', 'hl2dm', 'dods', 'tf2', 'sdk2013', 'bms', 'nucleardawn', 'l4d2', 'insurgency', 'doi']: dynamic_libs = ['libtier0_srv.so', 'libvstdlib_srv.so'] + elif arch == 'x64' and sdk.name == 'csgo': + dynamic_libs = ['libtier0_client.so', 'libvstdlib_client.so'] elif sdk.name in ['l4d', 'blade', 'insurgency', 'doi', 'csgo']: dynamic_libs = ['libtier0.so', 'libvstdlib.so'] else: @@ -512,20 +592,21 @@ class SMConfig(object): return binary - def HL2Library(self, context, name, sdk): - binary = self.Library(context, name) + def HL2Library(self, context, name, sdk, arch): + binary = self.Library(context, name, arch) self.ConfigureForExtension(context, binary.compiler) - return self.ConfigureForHL2(binary, sdk) + return self.ConfigureForHL2(binary, sdk, arch) def HL2Project(self, context, name): project = context.cxx.LibraryProject(name) self.ConfigureForExtension(context, project.compiler) return project - def HL2Config(self, project, name, sdk): + def HL2Config(self, project, name, sdk, arch): binary = project.Configure(name, '{0} - {1}'.format(self.tag, sdk.name)) - self.AddVersioning(binary) - return self.ConfigureForHL2(binary, sdk) + AppendArchSuffix(binary, name, arch) + self.AddVersioning(binary, arch) + return self.ConfigureForHL2(binary, sdk, arch) SM = SMConfig() SM.detectProductVersion() @@ -548,10 +629,15 @@ SP = builder.Build('sourcepawn/AMBuildScript', { 'external_amtl': os.path.join(builder.sourcePath, 'public', 'amtl'), 'external_build': ['core'], }) -SM.spcomp = SP.spcomp -SM.binaries += [ - SP.libsourcepawn -] +if len(SP.spcomp) > 1: + SM.spcomp = SP.spcomp['x86'] +else: + SM.spcomp = SP.spcomp[list(SP.spcomp.keys())[0]] +SM.spcomp_bins = list(SP.spcomp.values()) +for arch in SM.archs: + SM.binaries += [ + SP.libsourcepawn[arch] + ] BuildScripts = [ 'loader/AMBuilder', diff --git a/bridge/include/BridgeAPI.h b/bridge/include/BridgeAPI.h index d9e1cdaf70..91c8d74f01 100644 --- a/bridge/include/BridgeAPI.h +++ b/bridge/include/BridgeAPI.h @@ -35,7 +35,7 @@ namespace SourceMod { // Add 1 to the RHS of this expression to bump the intercom file // This is to prevent mismatching core/logic binaries -static const uint32_t SM_LOGIC_MAGIC = 0x0F47C0DE - 55; +static const uint32_t SM_LOGIC_MAGIC = 0x0F47C0DE - 56; } // namespace SourceMod diff --git a/bridge/include/LogicProvider.h b/bridge/include/LogicProvider.h index 75821f3701..d9c4b958bb 100644 --- a/bridge/include/LogicProvider.h +++ b/bridge/include/LogicProvider.h @@ -74,6 +74,8 @@ struct sm_logic_t void (*FreeDataPack)(IDataPack *pack); ICellArray * (*CreateCellArray)(size_t blocksize); void (*FreeCellArray)(ICellArray *arr); + void * (*FromPseudoAddress)(uint32_t pseudoAddr); + uint32_t (*ToPseudoAddress)(void *addr); IScriptManager *scripts; IShareSys *sharesys; IExtensionSys *extsys; diff --git a/configure.py b/configure.py index 6bb0358c55..a0e99b9520 100644 --- a/configure.py +++ b/configure.py @@ -22,6 +22,8 @@ def make_objdir_name(p): help='Root search folder for HL2SDKs') parser.options.add_option('--mysql-path', type=str, dest='mysql_path', default=None, help='Path to MySQL 5') +parser.options.add_option('--mysql64-path', type=str, dest='mysql64_path', default=None, + help='Path to 64-bit MySQL 5') parser.options.add_option('--mms-path', type=str, dest='mms_path', default=None, help='Path to Metamod:Source') parser.options.add_option('--enable-debug', action='store_const', const='1', dest='debug', diff --git a/core/AMBuilder b/core/AMBuilder index f96b00fd97..9da1f6cf96 100644 --- a/core/AMBuilder +++ b/core/AMBuilder @@ -44,60 +44,70 @@ project.sources += [ for sdk_name in SM.sdks: sdk = SM.sdks[sdk_name] - binary_name = 'sourcemod.' + sdk.ext + for arch in SM.archs: + if not arch in sdk.platformSpec[builder.target.platform]: + continue - binary = SM.HL2Config(project, binary_name, sdk) - compiler = binary.compiler + binary_name = 'sourcemod.' + sdk.ext - compiler.cxxincludes += [ - builder.sourcePath - ] + binary = SM.HL2Config(project, binary_name, sdk, arch) + compiler = binary.compiler - if sdk.name == 'csgo': compiler.cxxincludes += [ - os.path.join(sdk.path, 'common', 'protobuf-2.5.0', 'src'), - os.path.join(sdk.path, 'public', 'engine', 'protobuf'), - os.path.join(sdk.path, 'public', 'game', 'shared', 'csgo', 'protobuf') + builder.sourcePath ] - if builder.target.platform == 'linux': - compiler.postlink += ['-lpthread', '-lrt'] + if sdk.name == 'csgo': + compiler.cxxincludes += [ + os.path.join(sdk.path, 'common', 'protobuf-2.5.0', 'src'), + os.path.join(sdk.path, 'public', 'engine', 'protobuf'), + os.path.join(sdk.path, 'public', 'game', 'shared', 'csgo', 'protobuf') + ] - if sdk.name == 'csgo': if builder.target.platform == 'linux': - lib_path = os.path.join(sdk.path, 'lib', 'linux32', 'release', 'libprotobuf.a') - compiler.linkflags += ['-Wl,--exclude-libs=libprotobuf.a'] - elif builder.target.platform == 'mac': - lib_path = os.path.join(sdk.path, 'lib', 'osx32', 'release', 'libprotobuf.a') - elif builder.target.platform == 'windows': - msvc_ver = compiler.version - vs_year = '' - if msvc_ver == 1800: - vs_year = '2013' - elif msvc_ver == 1900: - vs_year = '2015' - elif msvc_ver == 1910: - vs_year = '2017' - else: - raise Exception('Cannot find libprotobuf for MSVC version "' + str(compiler.version) + '"') + compiler.postlink += ['-lpthread', '-lrt'] - if 'DEBUG' in compiler.defines: - lib_path = os.path.join(sdk.path, 'lib', 'win32', 'debug', 'vs' + vs_year, 'libprotobuf.lib') - else: - lib_path = os.path.join(sdk.path, 'lib', 'win32', 'release', 'vs' + vs_year, 'libprotobuf.lib') - compiler.linkflags.insert(0, binary.Dep(lib_path)) + if sdk.name == 'csgo': + if builder.target.platform == 'linux': + if arch == 'x86': + lib_path = os.path.join(sdk.path, 'lib', 'linux32', 'release', 'libprotobuf.a') + elif arch == 'x64': + lib_path = os.path.join(sdk.path, 'lib', 'linux64', 'release', 'libprotobuf.a') + compiler.linkflags += ['-Wl,--exclude-libs=libprotobuf.a'] + elif builder.target.platform == 'mac': + if arch == 'x86': + lib_path = os.path.join(sdk.path, 'lib', 'osx32', 'release', 'libprotobuf.a') + elif arch == 'x64': + lib_path = os.path.join(sdk.path, 'lib', 'osx64', 'release', 'libprotobuf.a') + elif builder.target.platform == 'windows': + msvc_ver = compiler.version + vs_year = '' + if msvc_ver == 1800: + vs_year = '2013' + elif msvc_ver == 1900: + vs_year = '2015' + elif msvc_ver == 1910: + vs_year = '2017' + else: + raise Exception('Cannot find libprotobuf for MSVC version "' + str(compiler.version) + '"') + + if 'DEBUG' in compiler.defines: + lib_path = os.path.join(sdk.path, 'lib', 'win32', 'debug', 'vs' + vs_year, 'libprotobuf.lib') + else: + lib_path = os.path.join(sdk.path, 'lib', 'win32', 'release', 'vs' + vs_year, 'libprotobuf.lib') + compiler.linkflags.insert(0, binary.Dep(lib_path)) - if sdk.name == 'csgo': - binary.sources += ['smn_protobuf.cpp'] - else: - binary.sources += ['smn_bitbuffer.cpp'] + if sdk.name == 'csgo': + binary.sources += ['smn_protobuf.cpp'] + else: + binary.sources += ['smn_bitbuffer.cpp'] - if sdk.name == 'csgo': - binary.sources += [ - os.path.join(sdk.path, 'public', 'engine', 'protobuf', 'netmessages.pb.cc'), - os.path.join(sdk.path, 'public', 'game', 'shared', 'csgo', 'protobuf', 'cstrike15_usermessages.pb.cc'), - os.path.join(sdk.path, 'public', 'game', 'shared', 'csgo', 'protobuf', 'cstrike15_usermessage_helpers.cpp'), - ] + if sdk.name == 'csgo': + binary.sources += [ + os.path.join(sdk.path, 'public', 'engine', 'protobuf', 'netmessages.pb.cc'), + os.path.join(sdk.path, 'public', 'game', 'shared', 'csgo', 'protobuf', 'cstrike15_usermessages.pb.cc'), + os.path.join(sdk.path, 'public', 'game', 'shared', 'csgo', 'protobuf', 'cstrike15_usermessage_helpers.cpp'), + ] SM.binaries += builder.Add(project) diff --git a/core/EventManager.cpp b/core/EventManager.cpp index 5adaf0a8db..62b820bd8d 100644 --- a/core/EventManager.cpp +++ b/core/EventManager.cpp @@ -364,8 +364,8 @@ void EventManager::FireEvent(EventInfo *pInfo, bool bDontBroadcast) void EventManager::FireEventToClient(EventInfo *pInfo, IClient *pClient) { - // The IClient vtable is +4 from the IGameEventListener2 (CBaseClient) vtable due to multiple inheritance. - IGameEventListener2 *pGameClient = (IGameEventListener2 *)((intptr_t)pClient - 4); + // The IClient vtable is +sizeof(void *) from the IGameEventListener2 (CBaseClient) vtable due to multiple inheritance. + IGameEventListener2 *pGameClient = (IGameEventListener2 *)((intptr_t)pClient - sizeof(void *)); pGameClient->FireGameEvent(pInfo->pEvent); } diff --git a/core/HalfLife2.cpp b/core/HalfLife2.cpp index 28a3dd47a0..b0818272af 100644 --- a/core/HalfLife2.cpp +++ b/core/HalfLife2.cpp @@ -245,7 +245,12 @@ void CHalfLife2::InitLogicalEntData() return; } +#ifdef PLATFORM_X86 g_EntList = *reinterpret_cast(addr + offset); +#elif defined PLATFORM_X64 + int32_t varOffset = *reinterpret_cast(addr + offset); + g_EntList = reinterpret_cast(addr + offset + sizeof(int32_t) + varOffset); +#endif } } @@ -1357,7 +1362,7 @@ string_t CHalfLife2::AllocPooledString(const char *pszValue) bool CHalfLife2::GetServerSteam3Id(char *pszOut, size_t len) const { - CSteamID sid(GetServerSteamId64()); + CSteamID sid((uint64)GetServerSteamId64()); switch (sid.GetEAccountType()) { diff --git a/core/PlayerManager.cpp b/core/PlayerManager.cpp index d73a64b9f2..a1e154db86 100644 --- a/core/PlayerManager.cpp +++ b/core/PlayerManager.cpp @@ -102,7 +102,7 @@ class KickPlayerTimer : public ITimedEvent public: ResultType OnTimer(ITimer *pTimer, void *pData) { - int userid = (int)pData; + int userid = (int)(intptr_t)pData; int client = g_Players.GetClientOfUserId(userid); if (client) { @@ -2480,7 +2480,7 @@ void CPlayer::DoBasicAdminChecks() if (!g_Players.CheckSetAdminName(client, this, id)) { int userid = engine->GetPlayerUserId(m_pEdict); - g_Timers.CreateTimer(&s_KickPlayerTimer, 0.1f, (void *)userid, 0); + g_Timers.CreateTimer(&s_KickPlayerTimer, 0.1f, (void *)(intptr_t)userid, 0); } return; } diff --git a/core/logic/AMBuilder b/core/logic/AMBuilder index 3e90dc5519..8548f0bda7 100644 --- a/core/logic/AMBuilder +++ b/core/logic/AMBuilder @@ -1,92 +1,97 @@ # vim: set sts=2 ts=8 sw=2 tw=99 et ft=python: import os -binary = SM.Library(builder, 'sourcemod.logic') -binary.compiler.cxxincludes += [ - builder.sourcePath, - os.path.join(builder.sourcePath, 'core', 'logic'), - os.path.join(builder.sourcePath, 'public'), - os.path.join(builder.sourcePath, 'sourcepawn', 'include'), - os.path.join(builder.sourcePath, 'public', 'amtl', 'amtl'), - os.path.join(builder.sourcePath, 'public', 'amtl'), - os.path.join(SM.mms_root, 'core', 'sourcehook') -] -binary.compiler.defines += [ - 'SM_DEFAULT_THREADER', - 'SM_LOGIC' -] +for arch in SM.archs: + binary = SM.Library(builder, 'sourcemod.logic', arch) + binary.compiler.cxxincludes += [ + builder.sourcePath, + os.path.join(builder.sourcePath, 'core', 'logic'), + os.path.join(builder.sourcePath, 'public'), + os.path.join(builder.sourcePath, 'sourcepawn', 'include'), + os.path.join(builder.sourcePath, 'public', 'amtl', 'amtl'), + os.path.join(builder.sourcePath, 'public', 'amtl'), + os.path.join(SM.mms_root, 'core', 'sourcehook') + ] + binary.compiler.defines += [ + 'SM_DEFAULT_THREADER', + 'SM_LOGIC' + ] -if builder.target.platform == 'linux': - binary.compiler.postlink += ['-lpthread', '-lrt'] -elif builder.target.platform == 'mac': - binary.compiler.cflags += ['-Wno-deprecated-declarations'] - binary.compiler.postlink += ['-framework', 'CoreServices'] + if builder.target.platform == 'linux': + binary.compiler.postlink += ['-lpthread', '-lrt'] + elif builder.target.platform == 'mac': + binary.compiler.cflags += ['-Wno-deprecated-declarations'] + binary.compiler.postlink += ['-framework', 'CoreServices'] -if binary.compiler.family == 'gcc' or binary.compiler.family == 'clang': - binary.compiler.cxxflags += ['-fno-rtti'] -elif binary.compiler.family == 'msvc': - binary.compiler.cxxflags += ['/GR-'] + if binary.compiler.family == 'gcc' or binary.compiler.family == 'clang': + binary.compiler.cxxflags += ['-fno-rtti'] + elif binary.compiler.family == 'msvc': + binary.compiler.cxxflags += ['/GR-'] -binary.sources += [ - 'common_logic.cpp', - 'smn_adt_array.cpp', - 'smn_sorting.cpp', - 'smn_maplists.cpp', - 'ADTFactory.cpp', - 'smn_adt_stack.cpp', - 'thread/ThreadWorker.cpp', - 'thread/BaseWorker.cpp', - 'ThreadSupport.cpp', - 'smn_float.cpp', - 'TextParsers.cpp', - 'smn_textparse.cpp', - 'smn_adt_trie.cpp', - 'smn_functions.cpp', - 'smn_timers.cpp', - 'smn_players.cpp', - 'MemoryUtils.cpp', - 'smn_admin.cpp', - 'smn_banning.cpp', - 'smn_filesystem.cpp', - 'stringutil.cpp', - 'Translator.cpp', - 'PhraseCollection.cpp', - 'smn_lang.cpp', - 'smn_string.cpp', - 'smn_handles.cpp', - 'smn_datapacks.cpp', - 'smn_gameconfigs.cpp', - 'smn_fakenatives.cpp', - 'GameConfigs.cpp', - 'sm_crc32.cpp', - 'smn_profiler.cpp', - 'ShareSys.cpp', - 'PluginSys.cpp', - 'HandleSys.cpp', - 'NativeOwner.cpp', - 'ExtensionSys.cpp', - 'DebugReporter.cpp', - 'Database.cpp', - 'smn_database.cpp', - 'ForwardSys.cpp', - 'AdminCache.cpp', - 'sm_trie.cpp', - 'smn_console.cpp', - 'ProfileTools.cpp', - 'Logger.cpp', - 'smn_core.cpp', - 'smn_menus.cpp', - 'sprintf.cpp', - 'LibrarySys.cpp', - 'RootConsoleMenu.cpp', - 'CDataPack.cpp', - 'frame_tasks.cpp', - 'smn_halflife.cpp', - 'FrameIterator.cpp', -] -if builder.target.platform == 'windows': - binary.sources += ['thread/WinThreads.cpp'] -else: - binary.sources += ['thread/PosixThreads.cpp'] + binary.sources += [ + 'common_logic.cpp', + 'smn_adt_array.cpp', + 'smn_sorting.cpp', + 'smn_maplists.cpp', + 'ADTFactory.cpp', + 'smn_adt_stack.cpp', + 'thread/ThreadWorker.cpp', + 'thread/BaseWorker.cpp', + 'ThreadSupport.cpp', + 'smn_float.cpp', + 'TextParsers.cpp', + 'smn_textparse.cpp', + 'smn_adt_trie.cpp', + 'smn_functions.cpp', + 'smn_timers.cpp', + 'smn_players.cpp', + 'MemoryUtils.cpp', + 'smn_admin.cpp', + 'smn_banning.cpp', + 'smn_filesystem.cpp', + 'stringutil.cpp', + 'Translator.cpp', + 'PhraseCollection.cpp', + 'smn_lang.cpp', + 'smn_string.cpp', + 'smn_handles.cpp', + 'smn_datapacks.cpp', + 'smn_gameconfigs.cpp', + 'smn_fakenatives.cpp', + 'GameConfigs.cpp', + 'sm_crc32.cpp', + 'smn_profiler.cpp', + 'ShareSys.cpp', + 'PluginSys.cpp', + 'HandleSys.cpp', + 'NativeOwner.cpp', + 'ExtensionSys.cpp', + 'DebugReporter.cpp', + 'Database.cpp', + 'smn_database.cpp', + 'ForwardSys.cpp', + 'AdminCache.cpp', + 'sm_trie.cpp', + 'smn_console.cpp', + 'ProfileTools.cpp', + 'Logger.cpp', + 'smn_core.cpp', + 'smn_menus.cpp', + 'sprintf.cpp', + 'LibrarySys.cpp', + 'RootConsoleMenu.cpp', + 'CDataPack.cpp', + 'frame_tasks.cpp', + 'smn_halflife.cpp', + 'FrameIterator.cpp', + ] -SM.binaries += [builder.Add(binary)] + if arch == 'x64': + binary.sources += ['PseudoAddrManager.cpp'] + + if builder.target.platform == 'windows': + binary.sources += ['thread/WinThreads.cpp'] + else: + binary.sources += ['thread/PosixThreads.cpp'] + + SM.binaries += [builder.Add(binary)] diff --git a/core/logic/ExtensionSys.cpp b/core/logic/ExtensionSys.cpp index 75a4638302..1599af2512 100644 --- a/core/logic/ExtensionSys.cpp +++ b/core/logic/ExtensionSys.cpp @@ -80,7 +80,7 @@ CLocalExtension::CLocalExtension(const char *filename, bool bRequired) g_pSM->BuildPath(Path_SM, path, PLATFORM_MAX_PATH, - "extensions/%s.%s." PLATFORM_LIB_EXT, + "extensions/" PLATFORM_ARCH_FOLDER "%s.%s." PLATFORM_LIB_EXT, filename, bridge->gamesuffix); @@ -98,7 +98,7 @@ CLocalExtension::CLocalExtension(const char *filename, bool bRequired) g_pSM->BuildPath(Path_SM, path, PLATFORM_MAX_PATH, - "extensions/%s.2.ep2v." PLATFORM_LIB_EXT, + "extensions/" PLATFORM_ARCH_FOLDER "%s.2.ep2v." PLATFORM_LIB_EXT, filename); if (libsys->IsPathFile(path)) @@ -111,7 +111,7 @@ CLocalExtension::CLocalExtension(const char *filename, bool bRequired) g_pSM->BuildPath(Path_SM, path, PLATFORM_MAX_PATH, - "extensions/%s.2.l4d2." PLATFORM_LIB_EXT, + "extensions/" PLATFORM_ARCH_FOLDER "%s.2.l4d2." PLATFORM_LIB_EXT, filename); if (libsys->IsPathFile(path)) @@ -124,7 +124,7 @@ CLocalExtension::CLocalExtension(const char *filename, bool bRequired) g_pSM->BuildPath(Path_SM, path, PLATFORM_MAX_PATH, - "extensions/auto.%s/%s." PLATFORM_LIB_EXT, + "extensions/" PLATFORM_ARCH_FOLDER "auto.%s/%s." PLATFORM_LIB_EXT, filename, bridge->gamesuffix); @@ -135,7 +135,7 @@ CLocalExtension::CLocalExtension(const char *filename, bool bRequired) g_pSM->BuildPath(Path_SM, path, PLATFORM_MAX_PATH, - "extensions/%s." PLATFORM_LIB_EXT, + "extensions/" PLATFORM_ARCH_FOLDER "%s." PLATFORM_LIB_EXT, filename); } diff --git a/core/logic/GameConfigs.cpp b/core/logic/GameConfigs.cpp index 2c59400f0d..e97fa29b54 100644 --- a/core/logic/GameConfigs.cpp +++ b/core/logic/GameConfigs.cpp @@ -76,16 +76,22 @@ static const char *g_pParseEngine = NULL; #define PSTATE_GAMEDEFS_ADDRESSES_ADDRESS 13 #define PSTATE_GAMEDEFS_ADDRESSES_ADDRESS_READ 14 +#if defined PLATFORM_X86 +#define PLATFORM_ARCH_SUFFIX "" +#elif defined PLATFORM_X64 +#define PLATFORM_ARCH_SUFFIX "64" +#endif + #if defined PLATFORM_WINDOWS -#define PLATFORM_NAME "windows" +#define PLATFORM_NAME "windows" PLATFORM_ARCH_SUFFIX #define PLATFORM_SERVER_BINARY "server.dll" #elif defined PLATFORM_LINUX -#define PLATFORM_NAME "linux" -#define PLATFORM_COMPAT_ALT "mac" /* Alternate platform name if game data is missing for primary one */ +#define PLATFORM_NAME "linux" PLATFORM_ARCH_SUFFIX +#define PLATFORM_COMPAT_ALT "mac" PLATFORM_ARCH_SUFFIX /* Alternate platform name if game data is missing for primary one */ #define PLATFORM_SERVER_BINARY "server_i486.so" #elif defined PLATFORM_APPLE -#define PLATFORM_NAME "mac" -#define PLATFORM_COMPAT_ALT "linux" +#define PLATFORM_NAME "mac" PLATFORM_ARCH_SUFFIX +#define PLATFORM_COMPAT_ALT "linux" PLATFORM_ARCH_SUFFIX #define PLATFORM_SERVER_BINARY "server.dylib" #endif @@ -338,7 +344,8 @@ SMCResult CGameConfig::ReadSMC_NewSection(const SMCStates *states, const char *n } else { - if (strcmp(name, "linux") != 0 && strcmp(name, "windows") != 0 && strcmp(name, "mac") != 0) + if (strcmp(name, "linux") != 0 && strcmp(name, "windows") != 0 && strcmp(name, "mac") != 0 && + strcmp(name, "linux64") != 0 && strcmp(name, "windows64") != 0 && strcmp(name, "mac64") != 0) { logger->LogError("[SM] Error while parsing Address section for \"%s\" (%s):", m_Address, m_CurFile); logger->LogError("[SM] Unrecognized platform \"%s\"", name); diff --git a/core/logic/LibrarySys.cpp b/core/logic/LibrarySys.cpp index c0a383e1fd..8ac26ff39b 100644 --- a/core/logic/LibrarySys.cpp +++ b/core/logic/LibrarySys.cpp @@ -125,7 +125,9 @@ bool CDirectory::IsEntryDirectory() return ((m_fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY); #elif defined PLATFORM_POSIX char temppath[PLATFORM_MAX_PATH]; - snprintf(temppath, sizeof(temppath), "%s/%s", m_origpath, GetEntryName()); + int ret = snprintf(temppath, sizeof(temppath), "%s/%s", m_origpath, GetEntryName()); + if (static_cast(ret) >= sizeof(temppath)) + return false; return ke::file::IsDirectory(temppath); #endif } @@ -136,7 +138,9 @@ bool CDirectory::IsEntryFile() return !(m_fd.dwFileAttributes & (FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_DEVICE)); #elif defined PLATFORM_POSIX char temppath[PLATFORM_MAX_PATH]; - snprintf(temppath, sizeof(temppath), "%s/%s", m_origpath, GetEntryName()); + int ret = snprintf(temppath, sizeof(temppath), "%s/%s", m_origpath, GetEntryName()); + if (static_cast(ret) >= sizeof(temppath)) + return false; return ke::file::IsFile(temppath); #endif } diff --git a/core/logic/MemoryUtils.cpp b/core/logic/MemoryUtils.cpp index 151ede1b94..24423e01f0 100644 --- a/core/logic/MemoryUtils.cpp +++ b/core/logic/MemoryUtils.cpp @@ -43,18 +43,6 @@ #include #include #include - -/* Define things from 10.6 SDK for older SDKs */ -#ifndef MAC_OS_X_VERSION_10_6 -struct task_dyld_info -{ - mach_vm_address_t all_image_info_addr; - mach_vm_size_t all_image_info_size; -}; -typedef struct task_dyld_info task_dyld_info_data_t; -#define TASK_DYLD_INFO 17 -#define TASK_DYLD_INFO_COUNT (sizeof(task_dyld_info_data_t) / sizeof(natural_t)) -#endif // MAC_OS_X_VERSION_10_6 #endif // PLATFORM_APPLE MemoryUtils g_MemUtils; @@ -63,25 +51,10 @@ MemoryUtils::MemoryUtils() { #ifdef PLATFORM_APPLE - Gestalt(gestaltSystemVersionMajor, &m_OSXMajor); - Gestalt(gestaltSystemVersionMinor, &m_OSXMinor); - - /* Get pointer to struct that describes all loaded mach-o images in process */ - if ((m_OSXMajor == 10 && m_OSXMinor >= 6) || m_OSXMajor > 10) - { - task_dyld_info_data_t dyld_info; - mach_msg_type_number_t count = TASK_DYLD_INFO_COUNT; - task_info(mach_task_self(), TASK_DYLD_INFO, (task_info_t)&dyld_info, &count); - m_ImageList = (struct dyld_all_image_infos *)dyld_info.all_image_info_addr; - } - else - { - struct nlist list[2]; - memset(list, 0, sizeof(list)); - list[0].n_un.n_name = (char *)"_dyld_all_image_infos"; - nlist("/usr/lib/dyld", list); - m_ImageList = (struct dyld_all_image_infos *)list[0].n_value; - } + task_dyld_info_data_t dyld_info; + mach_msg_type_number_t count = TASK_DYLD_INFO_COUNT; + task_info(mach_task_self(), TASK_DYLD_INFO, (task_info_t)&dyld_info, &count); + m_ImageList = (struct dyld_all_image_infos *)dyld_info.all_image_info_addr; #endif } @@ -147,13 +120,25 @@ void *MemoryUtils::ResolveSymbol(void *handle, const char *symbol) #elif defined PLATFORM_LINUX +#ifdef PLATFORM_X86 + typedef Elf32_Ehdr ElfHeader; + typedef Elf32_Shdr ElfSHeader; + typedef Elf32_Sym ElfSymbol; + #define ELF_SYM_TYPE ELF32_ST_TYPE +#else + typedef Elf64_Ehdr ElfHeader; + typedef Elf64_Shdr ElfSHeader; + typedef Elf64_Sym ElfSymbol; + #define ELF_SYM_TYPE ELF64_ST_TYPE +#endif + struct link_map *dlmap; struct stat dlstat; int dlfile; uintptr_t map_base; - Elf32_Ehdr *file_hdr; - Elf32_Shdr *sections, *shstrtab_hdr, *symtab_hdr, *strtab_hdr; - Elf32_Sym *symtab; + ElfHeader *file_hdr; + ElfSHeader *sections, *shstrtab_hdr, *symtab_hdr, *strtab_hdr; + ElfSymbol *symtab; const char *shstrtab, *strtab; uint16_t section_count; uint32_t symbol_count; @@ -204,7 +189,7 @@ void *MemoryUtils::ResolveSymbol(void *handle, const char *symbol) } /* Map library file into memory */ - file_hdr = (Elf32_Ehdr *)mmap(NULL, dlstat.st_size, PROT_READ, MAP_PRIVATE, dlfile, 0); + file_hdr = (ElfHeader *)mmap(NULL, dlstat.st_size, PROT_READ, MAP_PRIVATE, dlfile, 0); map_base = (uintptr_t)file_hdr; if (file_hdr == MAP_FAILED) { @@ -219,7 +204,7 @@ void *MemoryUtils::ResolveSymbol(void *handle, const char *symbol) return NULL; } - sections = (Elf32_Shdr *)(map_base + file_hdr->e_shoff); + sections = (ElfSHeader *)(map_base + file_hdr->e_shoff); section_count = file_hdr->e_shnum; /* Get ELF section header string table */ shstrtab_hdr = §ions[file_hdr->e_shstrndx]; @@ -228,7 +213,7 @@ void *MemoryUtils::ResolveSymbol(void *handle, const char *symbol) /* Iterate sections while looking for ELF symbol table and string table */ for (uint16_t i = 0; i < section_count; i++) { - Elf32_Shdr &hdr = sections[i]; + ElfSHeader &hdr = sections[i]; const char *section_name = shstrtab + hdr.sh_name; if (strcmp(section_name, ".symtab") == 0) @@ -248,15 +233,15 @@ void *MemoryUtils::ResolveSymbol(void *handle, const char *symbol) return NULL; } - symtab = (Elf32_Sym *)(map_base + symtab_hdr->sh_offset); + symtab = (ElfSymbol *)(map_base + symtab_hdr->sh_offset); strtab = (const char *)(map_base + strtab_hdr->sh_offset); symbol_count = symtab_hdr->sh_size / symtab_hdr->sh_entsize; /* Iterate symbol table starting from the position we were at last time */ for (uint32_t i = libtable->last_pos; i < symbol_count; i++) { - Elf32_Sym &sym = symtab[i]; - unsigned char sym_type = ELF32_ST_TYPE(sym.st_info); + ElfSymbol &sym = symtab[i]; + unsigned char sym_type = ELF_SYM_TYPE(sym.st_info); const char *sym_name = strtab + sym.st_name; Symbol *cur_sym; @@ -280,14 +265,29 @@ void *MemoryUtils::ResolveSymbol(void *handle, const char *symbol) return symbol_entry ? symbol_entry->address : NULL; #elif defined PLATFORM_APPLE - + +#ifdef PLATFORM_X86 + typedef struct mach_header MachHeader; + typedef struct segment_command MachSegment; + typedef struct nlist MachSymbol; + const uint32_t MACH_LOADCMD_SEGMENT = LC_SEGMENT; +#else + typedef struct mach_header_64 MachHeader; + typedef struct segment_command_64 MachSegment; + typedef struct nlist_64 MachSymbol; + const uint32_t MACH_LOADCMD_SEGMENT = LC_SEGMENT_64; +#endif + + typedef struct load_command MachLoadCmd; + typedef struct symtab_command MachSymHeader; + uintptr_t dlbase, linkedit_addr; uint32_t image_count; - struct mach_header *file_hdr; - struct load_command *loadcmds; - struct segment_command *linkedit_hdr; - struct symtab_command *symtab_hdr; - struct nlist *symtab; + MachHeader *file_hdr; + MachLoadCmd *loadcmds; + MachSegment *linkedit_hdr; + MachSymHeader *symtab_hdr; + MachSymbol *symtab; const char *strtab; uint32_t loadcmd_count; uint32_t symbol_count; @@ -357,16 +357,16 @@ void *MemoryUtils::ResolveSymbol(void *handle, const char *symbol) /* If symbol isn't in our table, then we have to locate it in memory */ - file_hdr = (struct mach_header *)dlbase; - loadcmds = (struct load_command *)(dlbase + sizeof(struct mach_header)); + file_hdr = (MachHeader *)dlbase; + loadcmds = (MachLoadCmd *)(dlbase + sizeof(MachHeader)); loadcmd_count = file_hdr->ncmds; /* Loop through load commands until we find the ones for the symbol table */ for (uint32_t i = 0; i < loadcmd_count; i++) { - if (loadcmds->cmd == LC_SEGMENT && !linkedit_hdr) + if (loadcmds->cmd == MACH_LOADCMD_SEGMENT && !linkedit_hdr) { - struct segment_command *seg = (struct segment_command *)loadcmds; + MachSegment *seg = (MachSegment *)loadcmds; if (strcmp(seg->segname, "__LINKEDIT") == 0) { linkedit_hdr = seg; @@ -378,7 +378,7 @@ void *MemoryUtils::ResolveSymbol(void *handle, const char *symbol) } else if (loadcmds->cmd == LC_SYMTAB) { - symtab_hdr = (struct symtab_command *)loadcmds; + symtab_hdr = (MachSymHeader *)loadcmds; if (linkedit_hdr) { break; @@ -386,7 +386,7 @@ void *MemoryUtils::ResolveSymbol(void *handle, const char *symbol) } /* Load commands are not of a fixed size which is why we add the size */ - loadcmds = (struct load_command *)((uintptr_t)loadcmds + loadcmds->cmdsize); + loadcmds = (MachLoadCmd *)((uintptr_t)loadcmds + loadcmds->cmdsize); } if (!linkedit_hdr || !symtab_hdr || !symtab_hdr->symoff || !symtab_hdr->stroff) @@ -396,14 +396,14 @@ void *MemoryUtils::ResolveSymbol(void *handle, const char *symbol) } linkedit_addr = dlbase + linkedit_hdr->vmaddr; - symtab = (struct nlist *)(linkedit_addr + symtab_hdr->symoff - linkedit_hdr->fileoff); + symtab = (MachSymbol *)(linkedit_addr + symtab_hdr->symoff - linkedit_hdr->fileoff); strtab = (const char *)(linkedit_addr + symtab_hdr->stroff - linkedit_hdr->fileoff); symbol_count = symtab_hdr->nsyms; /* Iterate symbol table starting from the position we were at last time */ for (uint32_t i = libtable->last_pos; i < symbol_count; i++) { - struct nlist &sym = symtab[i]; + MachSymbol &sym = symtab[i]; /* Ignore the prepended underscore on all symbols, so +1 here */ const char *sym_name = strtab + sym.n_un.n_strx + 1; Symbol *cur_sym; @@ -440,6 +440,12 @@ bool MemoryUtils::GetLibraryInfo(const void *libPtr, DynLibInfo &lib) #ifdef PLATFORM_WINDOWS +#ifdef PLATFORM_X86 + const WORD PE_FILE_MACHINE = IMAGE_FILE_MACHINE_I386; +#else + const WORD PE_FILE_MACHINE = IMAGE_FILE_MACHINE_AMD64; +#endif + MEMORY_BASIC_INFORMATION info; IMAGE_DOS_HEADER *dos; IMAGE_NT_HEADERS *pe; @@ -465,10 +471,8 @@ bool MemoryUtils::GetLibraryInfo(const void *libPtr, DynLibInfo &lib) return false; } - /* Check architecture, which is 32-bit/x86 right now - * Should change this for 64-bit if Valve gets their act together - */ - if (file->Machine != IMAGE_FILE_MACHINE_I386) + /* Check architecture */ + if (file->Machine != PE_FILE_MACHINE) { return false; } @@ -484,9 +488,21 @@ bool MemoryUtils::GetLibraryInfo(const void *libPtr, DynLibInfo &lib) #elif defined PLATFORM_LINUX +#ifdef PLATFORM_X86 + typedef Elf32_Ehdr ElfHeader; + typedef Elf32_Phdr ElfPHeader; + const unsigned char ELF_CLASS = ELFCLASS32; + const uint16_t ELF_MACHINE = EM_386; +#else + typedef Elf64_Ehdr ElfHeader; + typedef Elf64_Phdr ElfPHeader; + const unsigned char ELF_CLASS = ELFCLASS64; + const uint16_t ELF_MACHINE = EM_X86_64; +#endif + Dl_info info; - Elf32_Ehdr *file; - Elf32_Phdr *phdr; + ElfHeader *file; + ElfPHeader *phdr; uint16_t phdrCount; if (!dladdr(libPtr, &info)) @@ -501,7 +517,7 @@ bool MemoryUtils::GetLibraryInfo(const void *libPtr, DynLibInfo &lib) /* This is for our insane sanity checks :o */ baseAddr = reinterpret_cast(info.dli_fbase); - file = reinterpret_cast(baseAddr); + file = reinterpret_cast(baseAddr); /* Check ELF magic */ if (memcmp(ELFMAG, file->e_ident, SELFMAG) != 0) @@ -514,11 +530,15 @@ bool MemoryUtils::GetLibraryInfo(const void *libPtr, DynLibInfo &lib) { return false; } + + /* Check ELF endianness */ + if (file->e_ident[EI_DATA] != ELFDATA2LSB) + { + return false; + } - /* Check ELF architecture, which is 32-bit/x86 right now - * Should change this for 64-bit if Valve gets their act together - */ - if (file->e_ident[EI_CLASS] != ELFCLASS32 || file->e_machine != EM_386 || file->e_ident[EI_DATA] != ELFDATA2LSB) + /* Check ELF architecture */ + if (file->e_ident[EI_CLASS] != ELF_CLASS || file->e_machine != ELF_MACHINE) { return false; } @@ -530,11 +550,11 @@ bool MemoryUtils::GetLibraryInfo(const void *libPtr, DynLibInfo &lib) } phdrCount = file->e_phnum; - phdr = reinterpret_cast(baseAddr + file->e_phoff); + phdr = reinterpret_cast(baseAddr + file->e_phoff); for (uint16_t i = 0; i < phdrCount; i++) { - Elf32_Phdr &hdr = phdr[i]; + ElfPHeader &hdr = phdr[i]; /* We only really care about the segment with executable code */ if (hdr.p_type == PT_LOAD && hdr.p_flags == (PF_X|PF_R)) @@ -553,9 +573,25 @@ bool MemoryUtils::GetLibraryInfo(const void *libPtr, DynLibInfo &lib) #elif defined PLATFORM_APPLE +#ifdef PLATFORM_X86 + typedef struct mach_header MachHeader; + typedef struct segment_command MachSegment; + const uint32_t MACH_MAGIC = MH_MAGIC; + const uint32_t MACH_LOADCMD_SEGMENT = LC_SEGMENT; + const cpu_type_t MACH_CPU_TYPE = CPU_TYPE_I386; + const cpu_subtype_t MACH_CPU_SUBTYPE = CPU_SUBTYPE_I386_ALL; +#else + typedef struct mach_header_64 MachHeader; + typedef struct segment_command_64 MachSegment; + const uint32_t MACH_MAGIC = MH_MAGIC_64; + const uint32_t MACH_LOADCMD_SEGMENT = LC_SEGMENT_64; + const cpu_type_t MACH_CPU_TYPE = CPU_TYPE_X86_64; + const cpu_subtype_t MACH_CPU_SUBTYPE = CPU_SUBTYPE_X86_64_ALL; +#endif + Dl_info info; - struct mach_header *file; - struct segment_command *seg; + MachHeader *file; + MachSegment *seg; uint32_t cmd_count; if (!dladdr(libPtr, &info)) @@ -570,16 +606,16 @@ bool MemoryUtils::GetLibraryInfo(const void *libPtr, DynLibInfo &lib) /* This is for our insane sanity checks :o */ baseAddr = (uintptr_t)info.dli_fbase; - file = (struct mach_header *)baseAddr; + file = (MachHeader *)baseAddr; /* Check Mach-O magic */ - if (file->magic != MH_MAGIC) + if (file->magic != MACH_MAGIC) { return false; } - /* Check architecture (32-bit/x86) */ - if (file->cputype != CPU_TYPE_I386 || file->cpusubtype != CPU_SUBTYPE_I386_ALL) + /* Check architecture */ + if (file->cputype != MACH_CPU_TYPE || file->cpusubtype != MACH_CPU_SUBTYPE) { return false; } @@ -591,17 +627,17 @@ bool MemoryUtils::GetLibraryInfo(const void *libPtr, DynLibInfo &lib) } cmd_count = file->ncmds; - seg = (struct segment_command *)(baseAddr + sizeof(struct mach_header)); + seg = (MachSegment *)(baseAddr + sizeof(MachHeader)); /* Add up memory sizes of mapped segments */ for (uint32_t i = 0; i < cmd_count; i++) { - if (seg->cmd == LC_SEGMENT) + if (seg->cmd == MACH_LOADCMD_SEGMENT) { lib.memorySize += seg->vmsize; } - seg = (struct segment_command *)((uintptr_t)seg + seg->cmdsize); + seg = (MachSegment *)((uintptr_t)seg + seg->cmdsize); } #endif diff --git a/core/logic/PseudoAddrManager.cpp b/core/logic/PseudoAddrManager.cpp new file mode 100644 index 0000000000..2979b1ab09 --- /dev/null +++ b/core/logic/PseudoAddrManager.cpp @@ -0,0 +1,169 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod + * Copyright (C) 2004-2017 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + */ + +#include "PseudoAddrManager.h" +#ifdef PLATFORM_APPLE +#include +#include +#endif +#ifdef PLATFORM_LINUX +#include +#endif + +PseudoAddressManager::PseudoAddressManager() : m_NumEntries(0) +{ +} + +// A pseudo address consists of a table index in the upper 6 bits and an offset in the +// lower 26 bits. The table consists of memory allocation base addresses. +void *PseudoAddressManager::FromPseudoAddress(uint32_t paddr) +{ +#ifdef PLATFORM_X64 + uint8_t index = paddr >> PSEUDO_OFFSET_BITS; + uint32_t offset = paddr & ((1 << PSEUDO_OFFSET_BITS) - 1); + + if (index >= m_NumEntries) + return nullptr; + + return reinterpret_cast(uintptr_t(m_AllocBases[index]) + offset); +#else + return nullptr; +#endif +} + +uint32_t PseudoAddressManager::ToPseudoAddress(void *addr) +{ +#ifdef PLATFORM_X64 + uint8_t index = 0; + uint32_t offset = 0; + bool hasEntry = false; + void *base = GetAllocationBase(addr); + + if (base) { + for (int i = 0; i < m_NumEntries; i++) { + if (m_AllocBases[i] == base) { + index = i; + hasEntry = true; + break; + } + } + } else { + return 0; + } + + if (!hasEntry) { + index = m_NumEntries; + if (m_NumEntries < SM_ARRAYSIZE(m_AllocBases)) + m_AllocBases[m_NumEntries++] = base; + else + return 0; // Table is full + } + + ptrdiff_t diff = uintptr_t(addr) - uintptr_t(base); + + // Ensure difference fits in 26 bits + if (diff > (UINT32_MAX >> PSEUDO_INDEX_BITS)) + return 0; + + return (index << PSEUDO_OFFSET_BITS) | diff; +#else + return 0; +#endif +} + +void *PseudoAddressManager::GetAllocationBase(void *ptr) +{ +#if defined PLATFORM_WINDOWS + + MEMORY_BASIC_INFORMATION info; + if (!VirtualQuery(ptr, &info, sizeof(MEMORY_BASIC_INFORMATION))) + return nullptr; + return info.AllocationBase; + +#elif defined PLATFORM_APPLE + +#ifdef PLATFORM_X86 + typedef vm_region_info_t mach_vm_region_info_t; + typedef vm_region_basic_info_data_t mach_vm_region_basic_info_data_t; + const vm_region_flavor_t MACH_VM_REGION_BASIC_INFO = VM_REGION_BASIC_INFO; + const mach_msg_type_number_t MACH_VM_REGION_BASIC_INFO_COUNT = VM_REGION_BASIC_INFO_COUNT; + #define mach_vm_region vm_region +#elif defined PLATFORM_X64 + typedef vm_region_info_64_t mach_vm_region_info_t ; + typedef vm_region_basic_info_data_64_t mach_vm_region_basic_info_data_t; + const vm_region_flavor_t MACH_VM_REGION_BASIC_INFO = VM_REGION_BASIC_INFO_64; + const mach_msg_type_number_t MACH_VM_REGION_BASIC_INFO_COUNT = VM_REGION_BASIC_INFO_COUNT_64; + #define mach_vm_region vm_region_64 +#endif + vm_size_t size; + vm_address_t vmaddr = reinterpret_cast(ptr); + mach_vm_region_basic_info_data_t info; + memory_object_name_t obj; + vm_region_flavor_t flavor = MACH_VM_REGION_BASIC_INFO; + mach_msg_type_number_t count = MACH_VM_REGION_BASIC_INFO_COUNT; + + kern_return_t kr = mach_vm_region(mach_task_self(), &vmaddr, &size, flavor, + reinterpret_cast(&info), + &count, &obj); + + if (kr != KERN_SUCCESS) + return nullptr; + + return reinterpret_cast(vmaddr); + +#elif defined PLATFORM_LINUX + + uintptr_t addr = reinterpret_cast(ptr); + + // Format: + // lower upper prot stuff path + // 08048000-0804c000 r-xp 00000000 03:03 1010107 /bin/cat + FILE *fp = fopen("/proc/self/maps", "r"); + if (fp) { + uintptr_t lower, upper; + while (fscanf(fp, "%" PRIxPTR "-%" PRIxPTR, &lower, &upper) != EOF) { + if (addr >= lower && addr <= upper) { + fclose(fp); + return reinterpret_cast(lower); + } + + // Read to end of line + int c; + while ((c = fgetc(fp)) != '\n') { + if (c == EOF) + break; + } + if (c == EOF) + break; + } + fclose(fp); + } + return nullptr; +#endif +} diff --git a/core/logic/PseudoAddrManager.h b/core/logic/PseudoAddrManager.h new file mode 100644 index 0000000000..5de802aa26 --- /dev/null +++ b/core/logic/PseudoAddrManager.h @@ -0,0 +1,51 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod + * Copyright (C) 2004-2017 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + */ + +#ifndef _INCLUDE_SOURCEMOD_PSEUDOADDRESSMANAGER_H_ +#define _INCLUDE_SOURCEMOD_PSEUDOADDRESSMANAGER_H_ + +#include "common_logic.h" + +class PseudoAddressManager +{ +public: + PseudoAddressManager(); +public: + void *FromPseudoAddress(uint32_t paddr); + uint32_t ToPseudoAddress(void *addr); +private: + void *GetAllocationBase(void *ptr); +private: + static constexpr uint8_t PSEUDO_OFFSET_BITS = 26; + static constexpr uint8_t PSEUDO_INDEX_BITS = sizeof(uint32_t) * 8 - PSEUDO_OFFSET_BITS; + void *m_AllocBases[1 << PSEUDO_INDEX_BITS]; + uint8_t m_NumEntries; +}; + +#endif // _INCLUDE_SOURCEMOD_PSEUDOADDRESSMANAGER_H_ diff --git a/core/logic/common_logic.cpp b/core/logic/common_logic.cpp index e6a3f333a1..66bcdf6378 100644 --- a/core/logic/common_logic.cpp +++ b/core/logic/common_logic.cpp @@ -86,6 +86,9 @@ IScriptManager *scripts = &g_PluginSys; IExtensionSys *extsys = &g_Extensions; ILogger *logger = &g_Logger; CNativeOwner g_CoreNatives; +#ifdef PLATFORM_X64 +PseudoAddressManager pseudoAddr; +#endif static void AddCorePhraseFile(const char *filename) { @@ -115,6 +118,24 @@ static void RegisterProfiler(IProfilingTool *tool) g_ProfileToolManager.RegisterTool(tool); } +static void *FromPseudoAddress(uint32_t paddr) +{ +#ifdef PLATFORM_X64 + return pseudoAddr.FromPseudoAddress(paddr); +#else + return nullptr; +#endif +} + +static uint32_t ToPseudoAddress(void *addr) +{ +#ifdef PLATFORM_X64 + return pseudoAddr.ToPseudoAddress(addr); +#else + return 0; +#endif +} + // Defined in smn_filesystem.cpp. extern bool OnLogPrint(const char *msg); @@ -150,6 +171,8 @@ static sm_logic_t logic = CDataPack::Free, CellArray::New, CellArray::Free, + FromPseudoAddress, + ToPseudoAddress, &g_PluginSys, &g_ShareSys, &g_Extensions, diff --git a/core/logic/common_logic.h b/core/logic/common_logic.h index f25102120b..464a4fd791 100644 --- a/core/logic/common_logic.h +++ b/core/logic/common_logic.h @@ -33,6 +33,9 @@ #define _INCLUDE_SOURCEMOD_COMMON_LOGIC_H_ #include "../sm_globals.h" +#ifdef PLATFORM_X64 +#include "PseudoAddrManager.h" +#endif namespace SourceMod { class CoreProvider; @@ -57,6 +60,7 @@ class IVEngineServerBridge; #endif } // namespace SourceMod struct ServerGlobals; +class PseudoAddressManager; extern SourceMod::CoreProvider *bridge; extern SourceMod::IHandleSys *handlesys; @@ -76,6 +80,7 @@ extern SourceMod::IScriptManager *scripts; extern SourceMod::IExtensionSys *extsys; extern SourceMod::ILogger *logger; extern SourceMod::IMenuManager *menus; +extern PseudoAddressManager pseudoAddr; #if defined SM_LOGIC extern SourceMod::IVEngineServerBridge *engine; diff --git a/core/logic/smn_core.cpp b/core/logic/smn_core.cpp index 06527d7ec9..214111e4ea 100644 --- a/core/logic/smn_core.cpp +++ b/core/logic/smn_core.cpp @@ -708,7 +708,11 @@ enum NumberType static cell_t LoadFromAddress(IPluginContext *pContext, const cell_t *params) { +#ifdef PLATFORM_X86 void *addr = reinterpret_cast(params[1]); +#else + void *addr = pseudoAddr.FromPseudoAddress(params[1]); +#endif if (addr == NULL) { @@ -736,7 +740,11 @@ static cell_t LoadFromAddress(IPluginContext *pContext, const cell_t *params) static cell_t StoreToAddress(IPluginContext *pContext, const cell_t *params) { +#ifdef PLATFORM_X86 void *addr = reinterpret_cast(params[1]); +#else + void *addr = pseudoAddr.FromPseudoAddress(params[1]); +#endif if (addr == NULL) { diff --git a/core/logic/smn_gameconfigs.cpp b/core/logic/smn_gameconfigs.cpp index eff28ae22d..ceeaf49395 100644 --- a/core/logic/smn_gameconfigs.cpp +++ b/core/logic/smn_gameconfigs.cpp @@ -152,7 +152,11 @@ static cell_t smn_GameConfGetAddress(IPluginContext *pCtx, const cell_t *params) if (!gc->GetAddress(key, &val)) return 0; +#ifdef PLATFORM_X86 return (cell_t)val; +#else + return pseudoAddr.ToPseudoAddress(val); +#endif } static GameConfigsNatives s_GameConfigsNatives; diff --git a/core/logic_bridge.cpp b/core/logic_bridge.cpp index 49f6213af9..a698269bd5 100644 --- a/core/logic_bridge.cpp +++ b/core/logic_bridge.cpp @@ -653,7 +653,7 @@ void CoreProviderImpl::InitializeBridge() char path[PLATFORM_MAX_PATH]; ke::path::Format(path, sizeof(path), - "%s/bin/matchmaking_ds%s.%s", + "%s/bin/" PLATFORM_FOLDER "matchmaking_ds%s.%s", g_SMAPI->GetBaseDir(), MATCHMAKINGDS_SUFFIX, MATCHMAKINGDS_EXT); @@ -691,7 +691,7 @@ bool CoreProviderImpl::LoadBridge(char *error, size_t maxlength) /* Now it's time to load the logic binary */ g_SMAPI->PathFormat(file, sizeof(file), - "%s/bin/sourcemod.logic." PLATFORM_LIB_EXT, + "%s/bin/" PLATFORM_ARCH_FOLDER "sourcemod.logic." PLATFORM_LIB_EXT, g_SourceMod.GetSourceModPath()); char myerror[255]; diff --git a/core/smn_entities.cpp b/core/smn_entities.cpp index 71fed68e76..8e4a609fe1 100644 --- a/core/smn_entities.cpp +++ b/core/smn_entities.cpp @@ -2609,7 +2609,12 @@ static cell_t GetEntityAddress(IPluginContext *pContext, const cell_t *params) { return pContext->ThrowNativeError("Entity %d (%d) is invalid", g_HL2.ReferenceToIndex(params[1]), params[1]); } + +#ifdef PLATFORM_X86 return reinterpret_cast(pEntity); +#else + return g_SourceMod.ToPseudoAddress(pEntity); +#endif } REGISTER_NATIVES(entityNatives) diff --git a/core/sourcemod.cpp b/core/sourcemod.cpp index 5522a7ecda..fb67ae55b6 100644 --- a/core/sourcemod.cpp +++ b/core/sourcemod.cpp @@ -185,7 +185,7 @@ bool SourceModBase::InitializeSourceMod(char *error, size_t maxlength, bool late /* Attempt to load the JIT! */ char file[PLATFORM_MAX_PATH]; char myerror[255]; - g_SMAPI->PathFormat(file, sizeof(file), "%s/bin/sourcepawn.jit.x86.%s", + g_SMAPI->PathFormat(file, sizeof(file), "%s/bin/" PLATFORM_ARCH_FOLDER "sourcepawn.jit.x86.%s", GetSourceModPath(), PLATFORM_LIB_EXT ); @@ -195,7 +195,7 @@ bool SourceModBase::InitializeSourceMod(char *error, size_t maxlength, bool late { if (error && maxlength) { - ke::SafeSprintf(error, maxlength, "%s (failed to load bin/sourcepawn.jit.x86.%s)", + ke::SafeSprintf(error, maxlength, "%s (failed to load bin/" PLATFORM_ARCH_FOLDER "sourcepawn.jit.x86.%s)", myerror, PLATFORM_LIB_EXT); } @@ -745,6 +745,16 @@ bool SourceModBase::IsMapRunning() return g_OnMapStarted; } +void *SourceModBase::FromPseudoAddress(uint32_t pseudoAddr) +{ + return logicore.FromPseudoAddress(pseudoAddr); +} + +uint32_t SourceModBase::ToPseudoAddress(void *addr) +{ + return logicore.ToPseudoAddress(addr); +} + class ConVarRegistrar : public IConCommandBaseAccessor, public SMGlobalClass diff --git a/core/sourcemod.h b/core/sourcemod.h index db16772f3b..3fac4301dc 100644 --- a/core/sourcemod.h +++ b/core/sourcemod.h @@ -135,6 +135,8 @@ class SourceModBase : int GetPluginId(); int GetShApiVersion(); bool IsMapRunning(); + void *FromPseudoAddress(uint32_t pseudoAddr); + uint32_t ToPseudoAddress(void *addr); private: void ShutdownServices(); private: diff --git a/extensions/bintools/AMBuilder b/extensions/bintools/AMBuilder index a7753a7a7a..2b226853d6 100644 --- a/extensions/bintools/AMBuilder +++ b/extensions/bintools/AMBuilder @@ -1,27 +1,30 @@ # vim: set sts=2 ts=8 sw=2 tw=99 et ft=python: import os -binary = SM.ExtLibrary(builder, 'bintools.ext') -binary.compiler.defines += ['HOOKING_ENABLED'] -binary.compiler.cxxincludes += [ - os.path.join(SM.mms_root, 'core', 'sourcehook'), - os.path.join(builder.sourcePath, 'public', 'jit'), - os.path.join(builder.sourcePath, 'public', 'jit', 'x86'), -] -if binary.compiler.family == 'gcc' or binary.compiler.family == 'clang': - binary.compiler.cxxflags += ['-fno-rtti'] -elif binary.compiler.family == 'msvc': - binary.compiler.cxxflags += ['/GR-'] +for arch in SM.archs: + binary = SM.ExtLibrary(builder, 'bintools.ext', arch) + binary.compiler.defines += ['HOOKING_ENABLED'] + binary.compiler.cxxincludes += [ + os.path.join(SM.mms_root, 'core', 'sourcehook'), + os.path.join(builder.sourcePath, 'public', 'jit'), + os.path.join(builder.sourcePath, 'public', 'jit', 'x86'), + ] + if binary.compiler.family == 'gcc' or binary.compiler.family == 'clang': + binary.compiler.cxxflags += ['-fno-rtti'] + elif binary.compiler.family == 'msvc': + binary.compiler.cxxflags += ['/GR-'] -binary.sources += [ - 'extension.cpp', - 'CallMaker.cpp', - 'CallWrapper.cpp', - 'HookWrapper.cpp', - 'jit_call.cpp', - 'jit_hook.cpp', - '../../public/smsdk_ext.cpp' -] + binary.sources += [ + 'extension.cpp', + 'CallMaker.cpp', + 'CallWrapper.cpp', + '../../public/smsdk_ext.cpp' + ] + + if arch == 'x64': + binary.sources += ['jit_call_x64.cpp'] + else: + binary.sources += ['jit_call.cpp'] -SM.extensions += [builder.Add(binary)] + SM.extensions += [builder.Add(binary)] diff --git a/extensions/bintools/CallMaker.cpp b/extensions/bintools/CallMaker.cpp index 5d25c6a875..ddf74c8931 100644 --- a/extensions/bintools/CallMaker.cpp +++ b/extensions/bintools/CallMaker.cpp @@ -82,7 +82,8 @@ ICallWrapper *CallMaker::CreateCall(void *address, CallConvention cv, const PassInfo *retInfo, const PassInfo paramInfo[], - unsigned int numParams) + unsigned int numParams, + unsigned int fnFlags) { SourceHook::CProtoInfoBuilder protoInfo(GetSHCallConvention(cv)); @@ -103,7 +104,11 @@ ICallWrapper *CallMaker::CreateCall(void *address, NULL, NULL, NULL, NULL); } +#if defined PLATFORM_X64 + return g_CallMaker2.CreateCall(address, &(*protoInfo), retInfo, paramInfo, fnFlags); +#else return g_CallMaker2.CreateCall(address, &(*protoInfo)); +#endif } ICallWrapper *CallMaker::CreateVCall(unsigned int vtblIdx, @@ -111,7 +116,8 @@ ICallWrapper *CallMaker::CreateVCall(unsigned int vtblIdx, unsigned int thisOffs, const PassInfo *retInfo, const PassInfo paramInfo[], - unsigned int numParams) + unsigned int numParams, + unsigned int fnFlags) { SourceHook::MemFuncInfo info; info.isVirtual = true; @@ -138,12 +144,16 @@ ICallWrapper *CallMaker::CreateVCall(unsigned int vtblIdx, NULL, NULL, NULL, NULL); } - +#if defined PLATFORM_X64 + return g_CallMaker2.CreateVirtualCall(&(*protoInfo), &info, retInfo, paramInfo, fnFlags); +#else return g_CallMaker2.CreateVirtualCall(&(*protoInfo), &info); +#endif } ICallWrapper *CallMaker2::CreateCall(void *address, const SourceHook::ProtoInfo *protoInfo) { +#ifdef PLATFORM_X86 CallWrapper *pWrapper = new CallWrapper(protoInfo); pWrapper->SetCalleeAddr(address); @@ -151,11 +161,15 @@ ICallWrapper *CallMaker2::CreateCall(void *address, const SourceHook::ProtoInfo pWrapper->SetCodeBaseAddr(addr); return pWrapper; +#else + return nullptr; +#endif } ICallWrapper *CallMaker2::CreateVirtualCall(const SourceHook::ProtoInfo *protoInfo, const SourceHook::MemFuncInfo *info) { +#ifdef PLATFORM_X86 CallWrapper *pWrapper = new CallWrapper(protoInfo); pWrapper->SetMemFuncInfo(info); @@ -163,9 +177,48 @@ ICallWrapper *CallMaker2::CreateVirtualCall(const SourceHook::ProtoInfo *protoIn pWrapper->SetCodeBaseAddr(addr); return pWrapper; +#else + return nullptr; +#endif +} + +ICallWrapper *CallMaker2::CreateCall(void *address, const SourceHook::ProtoInfo *protoInfo, + const PassInfo *retInfo, const PassInfo paramInfo[], + unsigned int fnFlags) +{ +#ifdef PLATFORM_X64 + CallWrapper *pWrapper = new CallWrapper(protoInfo, retInfo, paramInfo, fnFlags); + pWrapper->SetCalleeAddr(address); + + void *addr = JIT_CallCompile(pWrapper, FuncAddr_Direct); + pWrapper->SetCodeBaseAddr(addr); + + return pWrapper; +#else + return nullptr; +#endif +} + +ICallWrapper *CallMaker2::CreateVirtualCall(const SourceHook::ProtoInfo *protoInfo, + const SourceHook::MemFuncInfo *info, + const PassInfo *retInfo, + const PassInfo paramInfo[], + unsigned int fnFlags) +{ +#ifdef PLATFORM_X64 + CallWrapper *pWrapper = new CallWrapper(protoInfo, retInfo, paramInfo, fnFlags); + pWrapper->SetMemFuncInfo(info); + + void *addr = JIT_CallCompile(pWrapper, FuncAddr_VTable); + pWrapper->SetCodeBaseAddr(addr); + + return pWrapper; +#else + return nullptr; +#endif } -#if defined HOOKING_ENABLED +#if 0 IHookWrapper *CallMaker2::CreateVirtualHook(SourceHook::ISourceHook *pSH, const SourceHook::ProtoInfo *protoInfo, const SourceHook::MemFuncInfo *info, diff --git a/extensions/bintools/CallMaker.h b/extensions/bintools/CallMaker.h index c1ea738561..d97b10699b 100644 --- a/extensions/bintools/CallMaker.h +++ b/extensions/bintools/CallMaker.h @@ -34,7 +34,6 @@ #include "CallWrapper.h" -#include "HookWrapper.h" using namespace SourceMod; @@ -45,26 +44,30 @@ class CallMaker : public IBinTools CallConvention cv, const PassInfo *retInfo, const PassInfo paramInfo[], - unsigned int numParams); + unsigned int numParams, + unsigned int fnFlags); ICallWrapper *CreateVCall(unsigned int vtblIdx, unsigned int vtblOffs, unsigned int thisOffs, const PassInfo *retInfo, const PassInfo paramInfo[], - unsigned int numParams); + unsigned int numParams, + unsigned int fnFlags); }; class CallMaker2 -#if defined HOOKING_ENABLED - : public IBinTools2 -#endif { public: //IBinTools2 virtual ICallWrapper *CreateCall(void *address, const SourceHook::ProtoInfo *protoInfo); virtual ICallWrapper *CreateVirtualCall(const SourceHook::ProtoInfo *protoInfo, const SourceHook::MemFuncInfo *info); -#if defined HOOKING_ENABLED + ICallWrapper *CreateCall(void *address, const SourceHook::ProtoInfo *protoInfo, + const PassInfo *retInfo, const PassInfo paramInfo[], unsigned int fnFlags); + ICallWrapper *CreateVirtualCall(const SourceHook::ProtoInfo *protoInfo, + const SourceHook::MemFuncInfo *info, const PassInfo *retInfo, + const PassInfo paramInfo[], unsigned int fnFlags); +#if 0 virtual IHookWrapper *CreateVirtualHook(SourceHook::ISourceHook *pSH, const SourceHook::ProtoInfo *protoInfo, const SourceHook::MemFuncInfo *info, diff --git a/extensions/bintools/CallWrapper.cpp b/extensions/bintools/CallWrapper.cpp index 4ebea203fd..0ce55ee0b8 100644 --- a/extensions/bintools/CallWrapper.cpp +++ b/extensions/bintools/CallWrapper.cpp @@ -33,7 +33,7 @@ #include "CallWrapper.h" #include "CallMaker.h" -CallWrapper::CallWrapper(const SourceHook::ProtoInfo *protoInfo) +CallWrapper::CallWrapper(const SourceHook::ProtoInfo *protoInfo) : m_FnFlags(0) { m_AddrCodeBase = NULL; m_AddrCallee = NULL; @@ -77,6 +77,22 @@ CallWrapper::CallWrapper(const SourceHook::ProtoInfo *protoInfo) } } +CallWrapper::CallWrapper(const SourceHook::ProtoInfo *protoInfo, const PassInfo *retInfo, + const PassInfo paramInfo[], unsigned int fnFlags) : CallWrapper(protoInfo) +{ + m_RetParam->fields = retInfo->fields; + m_RetParam->numFields = retInfo->numFields; + + unsigned int argnum = protoInfo->numOfParams; + for (unsigned int i = 0; i < argnum; i++) + { + m_Params[i].info.fields = paramInfo[i].fields; + m_Params[i].info.numFields = paramInfo[i].numFields; + } + + m_FnFlags = fnFlags; +} + CallWrapper::~CallWrapper() { delete [] m_Params; @@ -184,3 +200,8 @@ unsigned int CallWrapper::GetParamOffset(unsigned int num) return m_Params[num].offset; } + +unsigned int CallWrapper::GetFunctionFlags() +{ + return m_FnFlags; +} diff --git a/extensions/bintools/CallWrapper.h b/extensions/bintools/CallWrapper.h index a6e5848f9b..38c65a21e3 100644 --- a/extensions/bintools/CallWrapper.h +++ b/extensions/bintools/CallWrapper.h @@ -47,6 +47,8 @@ class CallWrapper : public ICallWrapper { public: CallWrapper(const SourceHook::ProtoInfo *protoInfo); + CallWrapper(const SourceHook::ProtoInfo *protoInfo, const PassInfo *retInfo, + const PassInfo paramInfo[], unsigned int fnFlags); ~CallWrapper(); public: //ICallWrapper CallConvention GetCallConvention(); @@ -59,6 +61,7 @@ class CallWrapper : public ICallWrapper SourceHook::ProtoInfo::CallConvention GetSHCallConvention(); const SourceHook::PassInfo *GetSHParamInfo(unsigned int num); unsigned int GetParamOffset(unsigned int num); + unsigned int GetFunctionFlags(); public: void SetCalleeAddr(void *addr); void SetCodeBaseAddr(void *addr); @@ -74,6 +77,7 @@ class CallWrapper : public ICallWrapper void *m_AddrCallee; void *m_AddrCodeBase; SourceHook::MemFuncInfo m_FuncInfo; + unsigned int m_FnFlags; }; #endif //_INCLUDE_SOURCEMOD_CALLWRAPPER_H_ diff --git a/extensions/bintools/extension.cpp b/extensions/bintools/extension.cpp index 7f95679214..675480c2f4 100644 --- a/extensions/bintools/extension.cpp +++ b/extensions/bintools/extension.cpp @@ -50,12 +50,6 @@ bool BinTools::SDK_OnLoad(char *error, size_t maxlength, bool late) g_SPEngine = g_pSM->GetScriptingEngine(); g_pShareSys->AddInterface(myself, &g_CallMaker); - /* IBinTools2 is only compatible with SH v5 */ - if (g_pSM->GetShApiVersion() >= 5) - { - g_pShareSys->AddInterface(myself, &g_CallMaker2); - } - return true; } diff --git a/extensions/bintools/jit_call_x64.cpp b/extensions/bintools/jit_call_x64.cpp new file mode 100644 index 0000000000..a2a47fad02 --- /dev/null +++ b/extensions/bintools/jit_call_x64.cpp @@ -0,0 +1,1198 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod BinTools Extension + * Copyright (C) 2004-2017 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + */ + +#include +#include "extension.h" +#include +#include +#include "x64_macros.h" +#include "jit_compile.h" + +#if defined PLATFORM_WINDOWS +jit_uint32_t g_StackUsage = 32; // Shadow space +#else +jit_uint32_t g_StackUsage = 0; +#endif +jit_uint32_t g_StackAlign = 0; +jit_uint32_t g_RegDecoder = 0; +jit_uint32_t g_FloatRegDecoder = 0; +jit_uint32_t g_PODCount = 0; +jit_uint32_t g_FloatCount = 0; +jit_uint32_t g_ParamCount = 0; +jit_uint32_t g_StackOffset = 0; +jit_uint8_t g_ThisPtrReg; + +const jit_uint8_t STACK_PARAM = 16; +const jit_uint8_t INVALID_REG = 255; + +inline jit_uint8_t NextScratchReg() +{ + switch (g_RegDecoder++ % 3) + { + case 0: + return kREG_RAX; + case 1: + return kREG_R10; + case 2: + return kREG_R11; + default: + return INVALID_REG; + } +} + +#ifdef PLATFORM_POSIX +const int MAX_CLASSES = 2; +const int INT_REG_MAX = 6; +inline jit_uint8_t NextPODReg(size_t size) +{ + switch (g_PODCount++) + { + case 0: + return kREG_RDI; + case 1: + return kREG_RSI; + case 2: + return kREG_RDX; + case 3: + return kREG_RCX; + case 4: + return kREG_R8; + case 5: + if (size == 16) + { + g_PODCount--; + return STACK_PARAM; + } + return kREG_R9; + default: + return STACK_PARAM; + } +} + +const int FLOAT_REG_MAX = 8; +inline jit_uint8_t NextFloatReg(size_t size) +{ + switch (g_FloatCount++) + { + case 0: + return kREG_XMM0; + case 1: + return kREG_XMM1; + case 2: + return kREG_XMM2; + case 3: + return kREG_XMM3; + case 4: + return kREG_XMM4; + case 5: + return kREG_XMM5; + case 6: + return kREG_XMM6; + case 7: + if (size == 16) + { + g_FloatCount--; + return STACK_PARAM; + } + return kREG_XMM7; + default: + return STACK_PARAM; + } +} + +inline jit_uint8_t NextScratchFloatReg() +{ + switch (g_FloatRegDecoder++ % 8) + { + case 0: + return kREG_XMM8; + case 1: + return kREG_XMM9; + case 2: + return kREG_XMM10; + case 3: + return kREG_XMM11; + case 4: + return kREG_XMM12; + case 5: + return kREG_XMM13; + case 6: + return kREG_XMM14; + case 7: + return kREG_XMM15; + default: + return INVALID_REG; + } +} +#elif defined PLATFORM_WINDOWS +const int NUM_ARG_REGS = 4; +inline jit_uint8_t NextPODReg(size_t size) +{ + switch (g_ParamCount++) + { + case 0: + return kREG_RCX; + case 1: + return kREG_RDX; + case 2: + return kREG_R8; + case 3: + return kREG_R9; + default: + return STACK_PARAM; + } +} + +inline jit_uint8_t NextFloatReg(size_t size) +{ + switch (g_ParamCount++) + { + case 0: + return kREG_XMM0; + case 1: + return kREG_XMM1; + case 2: + return kREG_XMM2; + case 3: + return kREG_XMM3; + default: + return STACK_PARAM; + } +} + +inline jit_uint8_t NextScratchFloatReg() +{ + switch (g_FloatRegDecoder++ % 2) + { + case 0: + return kREG_XMM4; + case 1: + return kREG_XMM5; + default: + return INVALID_REG; + } +} +#endif + +/******************** + * Assembly Opcodes * + ********************/ +inline void Write_Execution_Prologue(JitWriter *jit, bool is_void, bool has_params) +{ + //push rbp + //mov rbp, rsp + //if !is_void + // push r14 + // mov r14, rsi | Windows: mov r14, rdx ; 2nd param (retbuf) + //if has_params + // push rbx + // mov rbx, rdi | Windows: mov rbx, rcx ; 1st param (param stack) + //push r15 + //mov r15, rsp + //and rsp, 0xFFFFFFF0 + //sub rsp, + X64_Push_Reg(jit, kREG_RBP); + X64_Mov_Reg_Rm(jit, kREG_RBP, kREG_RSP, MOD_REG); + if (!is_void) + { + X64_Push_Reg(jit, kREG_R14); +#ifdef PLATFORM_POSIX + X64_Mov_Reg_Rm(jit, kREG_R14, kREG_RSI, MOD_REG); +#elif defined PLATFORM_WINDOWS + X64_Mov_Reg_Rm(jit, kREG_R14, kREG_RDX, MOD_REG); +#endif + } + if (has_params) + { + X64_Push_Reg(jit, kREG_RBX); +#ifdef PLATFORM_POSIX + X64_Mov_Reg_Rm(jit, kREG_RBX, kREG_RDI, MOD_REG); +#elif defined PLATFORM_WINDOWS + X64_Mov_Reg_Rm(jit, kREG_RBX, kREG_RCX, MOD_REG); +#endif + } + X64_Push_Reg(jit, kREG_R15); + X64_Mov_Reg_Rm(jit, kREG_R15, kREG_RSP, MOD_REG); + X64_And_Rm_Imm8(jit, kREG_RSP, MOD_REG, -16); + + if (!jit->outbase) + { + /* Alloc this instruction before knowing the real stack usage */ + X64_Sub_Rm_Imm32(jit, kREG_RSP, 1337, MOD_REG); + } else { + if (g_StackAlign) + X64_Sub_Rm_Imm32(jit, kREG_RSP, g_StackAlign, MOD_REG); + } +} + +inline void Write_Function_Epilogue(JitWriter *jit, bool is_void, bool has_params) +{ + //mov rsp, r15 + //pop r15 + //if has_params + // pop rbx + //if !is_void + // pop r14 + //mov rsp, rbp + //pop rbp + //ret + X64_Mov_Reg_Rm(jit, kREG_RSP, kREG_R15, MOD_REG); + X64_Pop_Reg(jit, kREG_R15); + if (has_params) + X64_Pop_Reg(jit, kREG_RBX); + if (!is_void) + X64_Pop_Reg(jit, kREG_R14); + X64_Mov_Reg_Rm(jit, kREG_RSP, kREG_RBP, MOD_REG); + X64_Pop_Reg(jit, kREG_RBP); + X64_Return(jit); +} + +inline jit_uint8_t Write_PushPOD(JitWriter *jit, const SourceHook::PassInfo *info, unsigned int offset) +{ + bool needStack = false; + jit_uint8_t reg = NextPODReg(info->size); + jit_uint8_t reg2; + + if (reg == STACK_PARAM) + { + reg = NextScratchReg(); + needStack = true; + } + + if (info->flags & PASSFLAG_BYVAL) + { + switch (info->size) + { + case 1: + { + //movzx reg, BYTE PTR [ebx+] + if (!offset) + X64_Movzx_Reg64_Rm8(jit, reg, kREG_RBX, MOD_MEM_REG); + else if (offset < SCHAR_MAX) + X64_Movzx_Reg64_Rm8_Disp8(jit, reg, kREG_RBX, (jit_int8_t)offset); + else + X64_Movzx_Reg64_Rm8_Disp32(jit, reg, kREG_RBX, offset); + + break; + } + case 2: + { + //movzx reg, WORD PTR [ebx+] + if (!offset) + X64_Movzx_Reg64_Rm16(jit, reg, kREG_RBX, MOD_MEM_REG); + else if (offset < SCHAR_MAX) + X64_Movzx_Reg64_Rm16_Disp8(jit, reg, kREG_RBX, (jit_int8_t)offset); + else + X64_Movzx_Reg64_Rm16_Disp32(jit, reg, kREG_RBX, offset); + + break; + } + case 4: + { + //mov reg, DWORD PTR [ebx+] + if (!offset) + X64_Mov_Reg32_Rm(jit, reg, kREG_RBX, MOD_MEM_REG); + else if (offset < SCHAR_MAX) + X64_Mov_Reg32_Rm_Disp8(jit, reg, kREG_EBX, (jit_int8_t)offset); + else + X64_Mov_Reg32_Rm_Disp32(jit, reg, kREG_RBX, offset); + + break; + } + case 8: + { + //mov reg, DWORD PTR [ebx+] + if (!offset) + X64_Mov_Reg_Rm(jit, reg, kREG_RBX, MOD_MEM_REG); + else if (offset < SCHAR_MAX) + X64_Mov_Reg_Rm_Disp8(jit, reg, kREG_EBX, (jit_int8_t)offset); + else + X64_Mov_Reg_Rm_Disp32(jit, reg, kREG_RBX, offset); + + break; + } + case 16: + { + //mov reg, DWORD PTR [ebx+] + //mov reg2, DWORD PTR [ebx++8] + reg2 = needStack ? NextScratchReg() : NextPODReg(8); + + if (!offset) + X64_Mov_Reg_Rm(jit, reg, kREG_RBX, MOD_MEM_REG); + else if (offset < SCHAR_MAX) + X64_Mov_Reg_Rm_Disp8(jit, reg, kREG_RBX, (jit_int8_t)offset); + else + X64_Mov_Reg_Rm_Disp32(jit, reg, kREG_RBX, offset); + + if (offset+8 < SCHAR_MAX) + X64_Mov_Reg_Rm_Disp8(jit, reg2, kREG_RBX, (jit_int8_t)(offset+8)); + else + X64_Mov_Reg_Rm_Disp32(jit, reg2, kREG_RBX, offset+8); + + break; + } + } + } else if (info->flags & PASSFLAG_BYREF) { + //lea reg, [ebx+] + if (!offset) + X64_Mov_Reg_Rm(jit, reg, kREG_RBX, MOD_REG); + else if (offset < SCHAR_MAX) + X64_Lea_DispRegImm8(jit, reg, kREG_RBX, (jit_int8_t)offset); + else + X64_Lea_DispRegImm32(jit, reg, kREG_RBX, offset); + } + + if (needStack) + { + // Move register value onto stack + //if g_StackUsage == 0 + // mov [rsp], reg + //else + // mov [rsp+], reg + //if info->size == 16 + // mov [rsp++8], reg2 + if (g_StackUsage == 0) + X64_Mov_RmRSP_Reg(jit, reg); + else if (g_StackUsage < SCHAR_MAX) + X64_Mov_RmRSP_Disp8_Reg(jit, reg, (jit_int8_t)g_StackUsage); + else + X64_Mov_RmRSP_Disp32_Reg(jit, reg, g_StackUsage); + + if (info->size == 16) + { + if (g_StackUsage + 8 < SCHAR_MAX) + X64_Mov_RmRSP_Disp8_Reg(jit, reg2, (jit_int8_t)g_StackUsage + 8); + else + X64_Mov_RmRSP_Disp32_Reg(jit, reg2, (jit_int8_t)g_StackUsage + 8); + g_StackUsage += 16; + } else { + g_StackUsage += 8; + } + } + + return reg; +} + +inline void Write_PushFloat(JitWriter *jit, const SourceHook::PassInfo *info, unsigned int offset, uint8_t *floatRegs) +{ + bool needStack = false; + jit_uint8_t floatReg = NextFloatReg(info->size); + jit_uint8_t floatReg2; + + if (floatReg == STACK_PARAM) + { + floatReg = NextScratchFloatReg(); + needStack = true; + } + + if (info->flags & PASSFLAG_BYVAL) + { + switch (info->size) + { + case 4: + { + //if offset % 16 == 0 + // movaps floatReg, [ebx+] + //else + // movups floatReg, [ebx+] + if (!offset) { + X64_Movaps_Rm(jit, floatReg, kREG_EBX); + } else if (offset < SCHAR_MAX) { + if (offset % 16 == 0) + X64_Movaps_Rm_Disp8(jit, floatReg, kREG_EBX, (jit_int8_t)offset); + else + X64_Movups_Rm_Disp8(jit, floatReg, kREG_EBX, (jit_int8_t)offset); + } else { + if (offset % 16 == 0) + X64_Movaps_Rm_Disp32(jit, floatReg, kREG_EBX, offset); + else + X64_Movups_Rm_Disp32(jit, floatReg, kREG_EBX, offset); + } + break; + } + case 8: + { + //if offset % 16 == 0 + // movapd floatReg, [ebx+] + //else + // movupd floatReg, [ebx+] + if (!offset) { + X64_Movapd_Rm(jit, floatReg, kREG_EBX); + } else if (offset < SCHAR_MAX) { + if (offset % 16 == 0) + X64_Movapd_Rm_Disp8(jit, floatReg, kREG_EBX, (jit_int8_t)offset); + else + X64_Movupd_Rm_Disp8(jit, floatReg, kREG_EBX, (jit_int8_t)offset); + } else { + if (offset % 16 == 0) + X64_Movapd_Rm_Disp32(jit, floatReg, kREG_EBX, offset); + else + X64_Movupd_Rm_Disp32(jit, floatReg, kREG_EBX, offset); + } + break; + } + case 16: + //if offset % 16 == 0 + // movaps floatReg, [ebx+] + //else + // movads floatReg, [ebx+] + //if (offset+8) % 16 == 0 + // movaps floatReg2, [ebx++8] + //else + // movads floatReg2, [ebx++8] + floatReg2 = needStack ? NextScratchFloatReg() : NextFloatReg(8); + + if (!offset) { + X64_Movaps_Rm(jit, floatReg, kREG_EBX); + X64_Movups_Rm_Disp8(jit, floatReg2, kREG_EBX, offset+8); + } else if (offset < SCHAR_MAX) { + if (offset % 16 == 0) + X64_Movaps_Rm_Disp8(jit, floatReg, kREG_EBX, (jit_int8_t)offset); + else + X64_Movups_Rm_Disp8(jit, floatReg, kREG_EBX, (jit_int8_t)offset); + if ((offset + 8) % 16 == 0) + X64_Movaps_Rm_Disp8(jit, floatReg2, kREG_EBX, (jit_int8_t)offset+8); + else + X64_Movups_Rm_Disp8(jit, floatReg2, kREG_EBX, (jit_int8_t)offset+8); + } else { + if (offset % 16 == 0) + X64_Movaps_Rm_Disp32(jit, floatReg, kREG_EBX, offset); + else + X64_Movups_Rm_Disp32(jit, floatReg, kREG_EBX, offset); + if ((offset + 8) % 16 == 0) + X64_Movaps_Rm_Disp32(jit, floatReg2, kREG_EBX, offset+8); + else + X64_Movups_Rm_Disp32(jit, floatReg2, kREG_EBX, offset+8); + } + } + } else if (info->flags & PASSFLAG_BYREF) { + //lea reg, [ebx+] + Write_PushPOD(jit, info, offset); + return; + } + + if (needStack) + { + // Move register value onto stack + //if g_StackUsage == 0 + // movaps [rsp], floatReg + //else + // movaps [rsp+], floatReg + //if info->size == 16 + // movaps [rsp++8], floatReg2 + if (g_StackUsage == 0) { + X64_Movaps_Rm_Reg(jit, kREG_RSP, floatReg); + } else if (g_StackUsage < SCHAR_MAX) { + if (g_StackUsage % 16 == 0) + X64_Movaps_Rm_Disp8_Reg(jit, kREG_RSP, floatReg, (jit_int8_t)g_StackUsage); + else + X64_Movups_Rm_Disp8_Reg(jit, kREG_RSP, floatReg, (jit_int8_t)g_StackUsage); + } else { + if (g_StackUsage % 16 == 0) + X64_Movaps_Rm_Disp32_Reg(jit, kREG_RSP, floatReg, g_StackUsage); + else + X64_Movups_Rm_Disp32_Reg(jit, kREG_RSP, floatReg, g_StackUsage); + } + + if (info->size == 16) + { + if (g_StackUsage + 8 < SCHAR_MAX) { + if ((g_StackUsage + 8) % 16 == 0) + X64_Movaps_Rm_Disp8_Reg(jit, kREG_RSP, floatReg2, (jit_int8_t)g_StackUsage+8); + else + X64_Movups_Rm_Disp8_Reg(jit, kREG_RSP, floatReg2, (jit_int8_t)g_StackUsage+8); + } else { + if ((g_StackUsage + 8) % 16 == 0) + X64_Movaps_Rm_Disp32_Reg(jit, kREG_RSP, floatReg, g_StackUsage+8); + else + X64_Movups_Rm_Disp32_Reg(jit, kREG_RSP, floatReg, g_StackUsage+8); + } + g_StackUsage += 16; + } else { + g_StackUsage += 8; + } + } + + if (floatRegs) + { + floatRegs[0] = floatReg; + floatRegs[1] = info->size == 16 ? floatReg2 : INVALID_REG; + } +} + +#ifdef PLATFORM_WINDOWS +inline uint8_t MapFloatToIntReg(uint8_t floatReg) +{ + switch (floatReg) + { + case kREG_XMM0: + return kREG_RCX; + case kREG_XMM1: + return kREG_RDX; + case kREG_XMM2: + return kREG_R8; + case kREG_XMM3: + return kREG_R9; + default: + return INVALID_REG; + } +} + +inline void Write_VarArgFloatCopy(JitWriter *jit, const SourceHook::PassInfo *info, uint8_t *floatRegs) +{ + if (!floatRegs || floatRegs[0] == STACK_PARAM) + return; + + uint8_t intReg1 = MapFloatToIntReg(floatRegs[0]); + + switch (info->size) + { + case 4: + //movd intReg1, floatReg[0] + X64_Movd_Reg32_Xmm(jit, intReg1, floatRegs[0]); + break; + case 8: + //movq intReg1, floatReg[0] + X64_Movq_Reg_Xmm(jit, intReg1, floatRegs[0]); + break; + case 16: + //movq intReg1, floatReg[0] + //movq intReg2, floatReg[1] + X64_Movq_Reg_Xmm(jit, intReg1, floatRegs[0]); + if (floatRegs[1] != STACK_PARAM) + { + int intReg2 = MapFloatToIntReg(floatRegs[1]); + X64_Movq_Reg_Xmm(jit, intReg2, floatRegs[1]); + } + break; + } +} +#endif // PLATFORM_WINDOWS + + +enum class ObjectClass +{ + None, + Integer, + Pointer, // Special case of Integer + SSE, + SSEUp, + X87, // TODO? Really only applies to long doubles which Source doesn't use + X87Up, // TODO? + X87Complex, // TODO? + Memory +}; + +inline ObjectClass ClassifyType(ObjectField field) +{ + switch (field) + { + case ObjectField::Boolean: + case ObjectField::Int8: + case ObjectField::Int16: + case ObjectField::Int32: + case ObjectField::Int64: + case ObjectField::Pointer: + return ObjectClass::Integer; + case ObjectField::Float: + case ObjectField::Double: + return ObjectClass::SSE; + default: + return ObjectClass::None; + } +} + +inline size_t TypeSize(ObjectField field) +{ + switch (field) + { + case ObjectField::Boolean: + case ObjectField::Int8: + return 1; + case ObjectField::Int16: + return 2; + case ObjectField::Int32: + case ObjectField::Float: + return 4; + case ObjectField::Int64: + case ObjectField::Pointer: + case ObjectField::Double: + return 8; + default: + assert(false); + return 0; + } +} + +inline ObjectClass MergeClasses(ObjectClass class1, ObjectClass class2) +{ + if (class1 == class2) + return class1; + else if (class1 == ObjectClass::None) + return class2; + else if (class2 == ObjectClass::None) + return class1; + else if (class1 == ObjectClass::Integer || class2 == ObjectClass::Integer) + return ObjectClass::Integer; + + return ObjectClass::SSE; +} + +inline int ClassifyObject(const PassInfo *info, ObjectClass *classes) +{ + ObjectField *fields = info->fields; + unsigned int numFields = info->numFields; + int numWords = 1; + + if (info->size > 16 || info->flags & PASSFLAG_OUNALIGN) + classes[0] = ObjectClass::Memory; + else if (info->flags & (PASSFLAG_ODTOR|PASSFLAG_OCOPYCTOR)) + classes[0] = ObjectClass::Pointer; + else if (info->size > 8) + classes[0] = ObjectClass::None; + else if (numFields == 1 || numFields == 2) + classes[0] = ClassifyType(fields[0]); + else + classes[0] = ObjectClass::Integer; + + if (classes[0] == ObjectClass::None) + { + numWords = int((info->size + 7) / 8); + + unsigned int j = 0; + for (int i = 0; i < numWords; i++) + { + classes[i] = ObjectClass::None; + size_t sizeSoFar = 0; + for (int k = 0; j < numFields; j++, k++) + { + size_t sz = TypeSize(fields[j]); + if (sizeSoFar + sz > 8) + break; + else + sizeSoFar += sz; + + if (k == 0 && sizeSoFar == 8) { + classes[i] = ClassifyType(fields[j++]); + break; + } else if (j + 1 >= numFields) { + break; + } + + const ObjectField &field1 = fields[j]; + const ObjectField &field2 = fields[j + 1]; + + classes[i] = MergeClasses(ClassifyType(field1), ClassifyType(field2)); + } + } + } + + return numWords; +} + +inline void Write_PushObject(JitWriter *jit, const SourceHook::PassInfo *info, unsigned int offset, + const PassInfo *smInfo) +{ + if (info->flags & PASSFLAG_BYVAL) + { +#ifdef PLATFORM_POSIX + ObjectClass classes[MAX_CLASSES]; + int numWords = ClassifyObject(smInfo, classes); + + if (classes[0] == ObjectClass::Pointer) + goto push_byref; + + int neededIntRegs = 0; + int neededFloatRegs = 0; + for (int i = 0; i < numWords; i++) + { + switch (classes[i]) + { + case ObjectClass::Integer: + neededIntRegs++; + break; + case ObjectClass::SSE: + neededFloatRegs++; + break; + default: + assert(false); + break; + } + } + + if (neededIntRegs + g_PODCount > INT_REG_MAX || + neededFloatRegs + g_FloatCount > FLOAT_REG_MAX) + classes[0] = ObjectClass::Memory; + + if (classes[0] != ObjectClass::Memory) + { + size_t sizeLeft = info->size; + for (int i = 0; i < numWords; i++) + { + switch (classes[i]) + { + case ObjectClass::Integer: + { + SourceHook::PassInfo podInfo; + podInfo.size = (sizeLeft > 8) ? 8 : sizeLeft; + podInfo.type = SourceHook::PassInfo::PassType_Basic; + podInfo.flags = SourceHook::PassInfo::PassFlag_ByVal; + Write_PushPOD(jit, &podInfo, offset + (i * 8)); + break; + } + case ObjectClass::SSE: + { + SourceHook::PassInfo floatInfo; + floatInfo.size = (sizeLeft > 8) ? 8 : sizeLeft; + floatInfo.type = SourceHook::PassInfo::PassType_Float; + floatInfo.flags = SourceHook::PassInfo::PassFlag_ByVal; + Write_PushFloat(jit, &floatInfo, offset + (i * 8), nullptr); + break; + } + default: + assert(false); + break; + } + if (sizeLeft > 8) + sizeLeft -= 8; + } + } + + return; + +#elif defined PLATFORM_WINDOWS + if (info->size < 64 && (info->size & (info->size - 1)) == 0) + goto push_byref; + else { + SourceHook::PassInfo podInfo; + podInfo.size = info->size; + podInfo.type = SourceHook::PassInfo::PassType_Basic; + podInfo.flags = SourceHook::PassInfo::PassFlag_ByVal; + Write_PushPOD(jit, &podInfo, offset); + } + + return; +#endif + + jit_uint32_t qwords = info->size >> 3; + jit_uint32_t bytes = info->size & 0x7; + + //sub rsp, + //cld + //push rdi + //push rsi + //lea rdi, [rsp+16] + //lea rsi, [rbx+] + //if dwords + // mov rcx, + // rep movsq + //if bytes + // mov rcx, + // rep movsb + //pop rsi + //pop rdi + + //if (info->size < SCHAR_MAX) + //{ + // X64_Sub_Rm_Imm8(jit, kREG_RSP, (jit_int8_t)info->size, MOD_REG); + //} else { + // X64_Sub_Rm_Imm32(jit, kREG_RSP, info->size, MOD_REG); + ///} + X64_Cld(jit); + X64_Push_Reg(jit, kREG_RDI); + X64_Push_Reg(jit, kREG_RSI); + if (g_StackUsage + 16 < SCHAR_MAX) + X64_Lea_Reg_DispRegMultImm8(jit, kREG_RDI, kREG_NOIDX, kREG_RSP, NOSCALE, g_StackUsage+16); + else + X64_Lea_Reg_DispRegMultImm32(jit, kREG_RDI, kREG_NOIDX, kREG_RSP, NOSCALE, g_StackUsage+16); + + if (!offset) + X64_Mov_Reg_Rm(jit, kREG_RSI, kREG_RBX, MOD_REG); + else if (offset < SCHAR_MAX) + X64_Lea_DispRegImm8(jit, kREG_RSI, kREG_RBX, (jit_int8_t)offset); + else + X64_Lea_DispRegImm32(jit, kREG_RSI, kREG_RBX, offset); + + if (qwords) + { + X64_Mov_Reg_Imm32(jit, kREG_RCX, qwords); + X64_Rep(jit); + X64_Movsq(jit); + } + if (bytes) + { + X64_Mov_Reg_Imm32(jit, kREG_RCX, bytes); + X64_Rep(jit); + X64_Movsb(jit); + } + X64_Pop_Reg(jit, kREG_RSI); + X64_Pop_Reg(jit, kREG_RDI); + + g_StackUsage += info->size; + } else if (info->flags & PASSFLAG_BYREF) { +push_byref: + //lea reg, [ebx+] + SourceHook::PassInfo podInfo; + podInfo.size = sizeof(void *); + podInfo.type = SourceHook::PassInfo::PassType_Basic; + podInfo.flags = SourceHook::PassInfo::PassFlag_ByRef; + Write_PushPOD(jit, &podInfo, offset); + } +} + +inline void Write_PushThisPtr(JitWriter *jit) +{ + SourceHook::PassInfo podInfo; + podInfo.size = 8; + podInfo.type = SourceHook::PassInfo::PassType_Basic; + podInfo.flags = SourceHook::PassInfo::PassFlag_ByVal; + g_ThisPtrReg = Write_PushPOD(jit, &podInfo, 0); +} + +inline void Write_PushRetBuffer(JitWriter *jit) +{ + jit_uint8_t reg = NextPODReg(8); + + //mov reg, r14 + X64_Mov_Reg_Rm(jit, reg, kREG_R14, MOD_REG); +} + +inline void Write_CallFunction(JitWriter *jit, FuncAddrMethod method, CallWrapper *pWrapper) +{ + if (method == FuncAddr_Direct) + { + int64_t diff = (intptr_t)pWrapper->GetCalleeAddr() - ((intptr_t)jit->outbase + jit->get_outputpos() + 5); + int32_t upperBits = (diff >> 32); + if (upperBits == 0 || upperBits == -1) { + //call + jitoffs_t call = X64_Call_Imm32(jit, 0); + X64_Write_Jump32_Abs(jit, call, pWrapper->GetCalleeAddr()); + } else { + //mov rax, + //call rax + X64_Mov_Reg_Imm64(jit, kREG_RAX, (jit_int64_t)pWrapper->GetCalleeAddr()); + X64_Call_Reg(jit, kREG_RAX); + } + } else if (method == FuncAddr_VTable) { + //*(this + thisOffs + vtblOffs)[vtblIdx] + // mov r10, [g_ThisPtrReg++] + // mov r11, [r10+*8] + // call r11 + SourceHook::MemFuncInfo *funcInfo = pWrapper->GetMemFuncInfo(); + jit_uint32_t total_offs = funcInfo->thisptroffs + funcInfo->vtbloffs; + jit_uint32_t vfunc_pos = funcInfo->vtblindex * 8; + + //X64_Mov_Reg_Rm(jit, kREG_RAX, kREG_RBX, MOD_MEM_REG); + if (total_offs < SCHAR_MAX) + { + X64_Mov_Reg_Rm_Disp8(jit, kREG_R10, g_ThisPtrReg, (jit_int8_t)total_offs); + } else if (!total_offs) { + X64_Mov_Reg_Rm(jit, kREG_R10, g_ThisPtrReg, MOD_MEM_REG); + } else { + X64_Mov_Reg_Rm_Disp32(jit, kREG_R10, g_ThisPtrReg, total_offs); + } + if (vfunc_pos < SCHAR_MAX) + { + X64_Mov_Reg_Rm_Disp8(jit, kREG_R11, kREG_R10, (jit_int8_t)vfunc_pos); + } else if (!vfunc_pos) { + X64_Mov_Reg_Rm(jit, kREG_R11, kREG_R10, MOD_MEM_REG); + } else { + X64_Mov_Reg_Rm_Disp32(jit, kREG_R11, kREG_R10, vfunc_pos); + } + X64_Call_Reg(jit, kREG_R11); + } +} + +inline void Write_VarArgFloatCount(JitWriter *jit) +{ + //mov al, g_FloatCount + X64_Mov_Reg8_Imm8(jit, kREG_RAX, (jit_int8_t)g_FloatCount); +} + +inline void Write_RectifyStack(JitWriter *jit, jit_uint32_t value) +{ + //add rsp, + if (value < SCHAR_MAX) + { + X64_Add_Rm_Imm8(jit, kREG_RSP, (jit_int8_t)value, MOD_REG); + } else { + X64_Add_Rm_Imm32(jit, kREG_RSP, value, MOD_REG); + } +} + +inline void Write_MovRet2Buf(JitWriter *jit, const PassInfo *pRet, ObjectClass *classes, int numWords) +{ + if (pRet->type == PassType_Float) + { + switch (pRet->size) + { + case 4: + { + //movups xmmword ptr [r14], xmm0 + X64_Movups_Rm_Reg(jit, kREG_R14, kREG_XMM0); + break; + } + case 8: + { + //movupd xmmword ptr [r14], xmm0 + X64_Movupd_Rm_Reg(jit, kREG_R14, kREG_XMM0); + break; + } + } + return; + } + else if (pRet->type == PassType_Basic) + { + switch (pRet->size) + { + case 1: + { + //mov BYTE PTR [r14], al + X64_Mov_Rm8_Reg8(jit, kREG_R14, kREG_RAX, MOD_MEM_REG); + break; + } + case 2: + { + //mov WORD PTR [r14], ax + X64_Mov_Rm16_Reg16(jit, kREG_R14, kREG_RAX, MOD_MEM_REG); + break; + } + case 4: + { + //mov DWORD PTR [r14], rax + X64_Mov_Rm32_Reg32(jit, kREG_R14, kREG_RAX, MOD_MEM_REG); + break; + } + case 8: + { + //mov QWORD PTR [r14], rax + X64_Mov_Rm_Reg(jit, kREG_R14, kREG_RAX, MOD_MEM_REG); + break; + } + } + } +#ifdef PLATFORM_POSIX + else + { + // Return value registers + jit_uint8_t intRetReg = kREG_RAX; + jit_uint8_t floatRetReg = kREG_XMM0; + jit_int8_t offset = 0; + + assert(numWords <= 2); + + for (int i = 0; i < numWords; i++) + { + ObjectClass &cls = classes[i]; + + if (cls == ObjectClass::Integer) + { + //mov QWORD PTR [r14+offset], intRetReg ; rax or rdx + if (!offset) + X64_Mov_Rm_Reg(jit, kREG_R14, intRetReg, MOD_MEM_REG); + else + X64_Mov_Rm_Reg_Disp8(jit, kREG_R14, intRetReg, offset); + intRetReg = kREG_RDX; + } + else if (cls == ObjectClass::SSE) + { + //movupd xmmword ptr [r14+offset], floatRetReg ; xmm0 or xmm1 + if (!offset) + X64_Movupd_Rm_Reg(jit, kREG_R14, floatRetReg); + else + X64_Movupd_Rm_Disp8_Reg(jit, kREG_R14, floatRetReg, offset); + floatRetReg = kREG_XMM1; + } + offset += 8; + } + } +#endif +} + +/****************************** + * Assembly Compiler Function * + ******************************/ + +void *JIT_CallCompile(CallWrapper *pWrapper, FuncAddrMethod method) +{ + JitWriter writer; + JitWriter *jit = &writer; + + jit_uint32_t CodeSize = 0; + bool Needs_Retbuf = false; + CallConvention Convention = pWrapper->GetCallConvention(); + jit_uint32_t ParamCount = pWrapper->GetParamCount(); + const PassInfo *pRet = pWrapper->GetReturnInfo(); + bool hasParams = (ParamCount || Convention == CallConv_ThisCall); +#ifdef PLATFORM_POSIX + ObjectClass classes[MAX_CLASSES]; + int numWords; +#endif + + g_StackUsage = 0; + + writer.outbase = NULL; + writer.outptr = NULL; + +jit_rewind: + /* Write function prologue */ + Write_Execution_Prologue(jit, (pRet) ? false : true, hasParams); + +#if defined PLATFORM_WINDOWS + /* This ptr is always first on Windows */ + if (Convention == CallConv_ThisCall) + { + Write_PushThisPtr(jit); + } +#endif + + /* Skip the return buffer stuff if this is a void function */ + if (!pRet) + { + goto skip_retbuffer; + } + + if ((pRet->type == PassType_Object) && (pRet->flags & PASSFLAG_BYVAL)) + { +#ifdef PLATFORM_POSIX + numWords = ClassifyObject(pRet, classes); + + if (classes[0] == ObjectClass::Memory || classes[0] == ObjectClass::Pointer) + Needs_Retbuf = true; +#elif defined PLATFORM_WINDOWS + if (pRet->size > 8 || (pRet->size & (pRet->size - 1)) != 0 || + (pRet->flags & PASSFLAG_ODTOR|PASSFLAG_OCTOR|PASSFLAG_OASSIGNOP)) + Needs_Retbuf = true; +#endif + } + + /* Prepare the return buffer in case we are returning objects by value. */ + if (Needs_Retbuf) + { + Write_PushRetBuffer(jit); + } + +skip_retbuffer: +#if defined PLATFORM_POSIX + /* This ptr comes after retbuf ptr on Linux/macOS */ + if (Convention == CallConv_ThisCall) + { + Write_PushThisPtr(jit); + } +#endif + + /* Write parameter push code */ + for (jit_uint32_t i = 0; i < ParamCount; i++) + { + unsigned int offset = pWrapper->GetParamOffset(i); + const SourceHook::PassInfo *info = pWrapper->GetSHParamInfo(i); + assert(info != NULL); + + switch (info->type) + { + case SourceHook::PassInfo::PassType_Basic: + { + Write_PushPOD(jit, info, offset); + break; + } + case SourceHook::PassInfo::PassType_Float: + { +#ifdef PLATFORM_WINDOWS + if ((info->flags & PASSFLAG_BYVAL) && (pWrapper->GetFunctionFlags() & FNFLAG_VARARGS)) + { + uint8_t floatRegs[2]; + Write_PushFloat(jit, info, offset, floatRegs); + Write_VarArgFloatCopy(jit, info, floatRegs); + } + else +#endif + { + Write_PushFloat(jit, info, offset, nullptr); + } + break; + } + case SourceHook::PassInfo::PassType_Object: + { + const PassEncode *paramInfo = pWrapper->GetParamInfo(i); + Write_PushObject(jit, info, offset, ¶mInfo->info); + break; + } + } + } + + /* Write the calling code */ + Write_CallFunction(jit, method, pWrapper); + +#ifdef PLATFORM_POSIX + if (pWrapper->GetFunctionFlags() & FNFLAG_VARARGS) + Write_VarArgFloatCount(jit); +#endif + + /* Clean up the calling stack */ + if (hasParams && g_StackUsage) + Write_RectifyStack(jit, g_StackAlign); + + /* Copy the return type to the return buffer if the function is not void */ + if (pRet && !Needs_Retbuf) + { +#ifdef PLATFORM_POSIX + Write_MovRet2Buf(jit, pRet, classes, numWords); +#elif defined PLATFORM_WINDOWS + Write_MovRet2Buf(jit, pRet, nullptr, 0); +#endif + } + + /* Write Function Epilogue */ + Write_Function_Epilogue(jit, (pRet) ? false : true, hasParams); + + if (writer.outbase == NULL) + { + CodeSize = writer.get_outputpos(); + writer.outbase = (jitcode_t)g_SPEngine->AllocatePageMemory(CodeSize); + g_SPEngine->SetReadWrite(writer.outbase); + writer.outptr = writer.outbase; + pWrapper->SetCodeBaseAddr(writer.outbase); + g_StackAlign = (g_StackUsage) ? ((g_StackUsage & 0xFFFFFFF0) + 16) - g_StackUsage : 0; + g_StackAlign = (g_StackAlign == 16) ? g_StackUsage : g_StackUsage + g_StackAlign; +#ifdef PLATFORM_POSIX + g_StackUsage = 0; +#elif defined PLATFORM_WINDOWS + g_StackUsage = 32; // Shadow space +#endif + g_RegDecoder = 0; + g_FloatRegDecoder = 0; + g_PODCount = 0; + g_FloatCount = 0; + g_ParamCount = 0; + Needs_Retbuf = false; + goto jit_rewind; + } + g_SPEngine->SetReadExecute(writer.outbase); + return writer.outbase; +} diff --git a/extensions/bintools/jit_compile.h b/extensions/bintools/jit_compile.h index ef35145a54..c500edced0 100644 --- a/extensions/bintools/jit_compile.h +++ b/extensions/bintools/jit_compile.h @@ -34,11 +34,12 @@ #include #include +#include #include "CallWrapper.h" -#include "HookWrapper.h" void *JIT_CallCompile(CallWrapper *pWrapper, FuncAddrMethod method); -#if defined HOOKING_ENABLED + +#if 0 void *JIT_HookCompile(HookWrapper *pWrapper); void JIT_FreeHook(void *addr); #endif diff --git a/extensions/bintools/jit_hook.cpp b/extensions/bintools/jit_hook.cpp index e3b6bec203..e9d6af6913 100644 --- a/extensions/bintools/jit_hook.cpp +++ b/extensions/bintools/jit_hook.cpp @@ -214,7 +214,7 @@ inline void Write_Push_Params(JitWriter *jit, IA32_Push_Reg(jit, kREG_EBX); //push - IA32_Push_Imm32(jit, (jit_int32_t)pWrapper); + IA32_Push_Imm32(jit, (jit_int32_t)(intptr_t)pWrapper); } inline void Write_Call_Handler(JitWriter *jit, void *addr) diff --git a/extensions/bintools/x64_macros.h b/extensions/bintools/x64_macros.h new file mode 100644 index 0000000000..fc2cf2cd75 --- /dev/null +++ b/extensions/bintools/x64_macros.h @@ -0,0 +1,656 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod BinTools Extension + * Copyright (C) 2004-2017 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + */ + +#include +#include + +// 64-bit registers +const jit_uint8_t kREG_RAX = kREG_EAX; +const jit_uint8_t kREG_RCX = kREG_ECX; +const jit_uint8_t kREG_RDX = kREG_EDX; +const jit_uint8_t kREG_RBX = kREG_EBX; +const jit_uint8_t kREG_RSP = kREG_ESP; +const jit_uint8_t kREG_RBP = kREG_EBP; +const jit_uint8_t kREG_RSI = kREG_ESI; +const jit_uint8_t kREG_RDI = kREG_EDI; +const jit_uint8_t kREG_R8 = 8; +const jit_uint8_t kREG_R9 = 9; +const jit_uint8_t kREG_R10 = 10; +const jit_uint8_t kREG_R11 = 11; +const jit_uint8_t kREG_R12 = 12; +const jit_uint8_t kREG_R13 = 13; +const jit_uint8_t kREG_R14 = 14; +const jit_uint8_t kREG_R15 = 15; + +const jit_uint8_t kREG_XMM0 = 0; +const jit_uint8_t kREG_XMM1 = 1; +const jit_uint8_t kREG_XMM2 = 2; +const jit_uint8_t kREG_XMM3 = 3; +const jit_uint8_t kREG_XMM4 = 4; +const jit_uint8_t kREG_XMM5 = 5; +const jit_uint8_t kREG_XMM6 = 6; +const jit_uint8_t kREG_XMM7 = 7; +const jit_uint8_t kREG_XMM8 = 8; +const jit_uint8_t kREG_XMM9 = 9; +const jit_uint8_t kREG_XMM10 = 10; +const jit_uint8_t kREG_XMM11 = 11; +const jit_uint8_t kREG_XMM12 = 12; +const jit_uint8_t kREG_XMM13 = 13; +const jit_uint8_t kREG_XMM14 = 14; +const jit_uint8_t kREG_XMM15 = 15; + +#define X64_REX_PREFIX 0x40 + +#define IA32_MOV_REG8_IMM8 0xB0 + +inline jit_uint8_t x64_rex(bool w, jit_uint8_t r, jit_uint8_t x, jit_uint8_t b) +{ + return (X64_REX_PREFIX | ((jit_uint8_t)w << 3) | ((r>>3) << 2) | ((x>>3) << 1) | (b >> 3)); +} + +inline void X64_Push_Reg(JitWriter *jit, jit_uint8_t reg) +{ + if (reg >= kREG_R8) + jit->write_ubyte(x64_rex(false, 0, 0, reg)); + IA32_Push_Reg(jit, reg & 7); +} + +inline void X64_Mov_Reg_Rm(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode) +{ + jit->write_ubyte(x64_rex(true, dest, 0, src)); + IA32_Mov_Reg_Rm(jit, dest & 7, src & 7, mode); +} + +inline void X64_Mov_Reg_Rm_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp) +{ + jit->write_ubyte(x64_rex(true, dest, 0, src)); + IA32_Mov_Reg_Rm_Disp8(jit, dest & 7, src & 7, disp); +} + +inline void X64_Mov_Reg_Rm_Disp32(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int32_t disp) +{ + jit->write_ubyte(x64_rex(true, dest, 0, src)); + IA32_Mov_Reg_Rm_Disp32(jit, dest & 7, src & 7, disp); +} + +inline void X64_Mov_Reg32_Rm(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode) +{ + if (src>= kREG_R8 || dest >= kREG_R8) + jit->write_ubyte(x64_rex(false, dest, 0, src)); + IA32_Mov_Reg_Rm(jit, dest & 7, src & 7, mode); +} + +inline void X64_Mov_Reg32_Rm_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp) +{ + if (src>= kREG_R8 || dest >= kREG_R8) + jit->write_ubyte(x64_rex(false, dest, 0, src)); + IA32_Mov_Reg_Rm_Disp8(jit, dest & 7, src & 7, disp); +} + +inline void X64_Mov_Reg32_Rm_Disp32(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int32_t disp) +{ + if (src>= kREG_R8 || dest >= kREG_R8) + jit->write_ubyte(x64_rex(false, dest, 0, src)); + IA32_Mov_Reg_Rm_Disp32(jit, dest & 7, src & 7, disp); +} + +inline void X64_And_Rm_Imm8(JitWriter *jit, jit_uint8_t reg, jit_uint8_t mode, jit_int8_t value) +{ + jit->write_ubyte(x64_rex(true, 0, 0, reg)); + IA32_And_Rm_Imm8(jit, reg & 7, mode, value); +} + +inline void X64_Sub_Rm_Imm8(JitWriter *jit, jit_uint8_t reg, jit_int8_t val, jit_uint8_t mode) +{ + jit->write_ubyte(x64_rex(true, 5, 0, reg)); + IA32_Sub_Rm_Imm8(jit, reg & 7, val, mode); +} + +inline void X64_Sub_Rm_Imm32(JitWriter *jit, jit_uint8_t reg, jit_int32_t val, jit_uint8_t mode) +{ + jit->write_ubyte(x64_rex(true, 5, 0, reg)); + IA32_Sub_Rm_Imm32(jit, reg & 7, val, mode); +} + +inline void X64_Pop_Reg(JitWriter *jit, jit_uint8_t reg) +{ + if (reg >= kREG_R8) + jit->write_ubyte(x64_rex(false, 0, 0, reg)); + IA32_Pop_Reg(jit, reg & 7); +} + +inline void X64_Return(JitWriter *jit) +{ + IA32_Return(jit); +} + +inline void X64_Movzx_Reg64_Rm8_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp) +{ + jit->write_ubyte(x64_rex(true, dest, 0, src)); + IA32_Movzx_Reg32_Rm8_Disp8(jit, dest & 7, src & 7, disp); +} + +inline void X64_Movzx_Reg64_Rm8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode) +{ + jit->write_ubyte(x64_rex(true, dest, 0, src)); + IA32_Movzx_Reg32_Rm8(jit, dest & 7, src & 7, mode); +} + +inline void X64_Movzx_Reg64_Rm8_Disp32(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int32_t disp) +{ + jit->write_ubyte(x64_rex(true, dest, 0, src)); + IA32_Movzx_Reg32_Rm8_Disp32(jit, dest & 7, src & 7, disp); +} + +inline void X64_Mov_RmRSP_Reg(JitWriter *jit, jit_uint8_t src) +{ + jit->write_ubyte(x64_rex(true, kREG_RSP, 0, src)); + jit->write_ubyte(IA32_MOV_RM_REG); + jit->write_ubyte(ia32_modrm(MOD_MEM_REG, src & 7, kREG_RSP)); + jit->write_ubyte(ia32_sib(NOSCALE, kREG_NOIDX, kREG_RSP)); +} + +inline void X64_Mov_RmRSP_Disp8_Reg(JitWriter *jit, jit_uint8_t src, jit_int8_t disp) +{ + jit->write_ubyte(x64_rex(true, src, 0, kREG_RSP)); + jit->write_ubyte(IA32_MOV_RM_REG); + jit->write_ubyte(ia32_modrm(MOD_DISP8, src & 7, kREG_RSP)); + jit->write_ubyte(ia32_sib(NOSCALE, kREG_NOIDX, kREG_RSP)); + jit->write_byte(disp); +} + +inline void X64_Mov_RmRSP_Disp32_Reg(JitWriter *jit, jit_uint8_t src, jit_int8_t disp) +{ + jit->write_ubyte(x64_rex(true, src, 0, kREG_RSP)); + jit->write_ubyte(IA32_MOV_RM_REG); + jit->write_ubyte(ia32_modrm(MOD_DISP32, src & 7, kREG_RSP)); + jit->write_ubyte(ia32_sib(NOSCALE, kREG_NOIDX, kREG_RSP)); + jit->write_byte(disp); +} + +inline void X64_Movzx_Reg64_Rm16(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode) +{ + jit->write_ubyte(x64_rex(true, dest, 0, src)); + IA32_Movzx_Reg32_Rm16(jit, dest & 7, src & 7, mode); +} + +inline void X64_Movzx_Reg64_Rm16_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp) +{ + jit->write_ubyte(x64_rex(true, dest, 0, src)); + IA32_Movzx_Reg32_Rm16_Disp8(jit, dest & 7, src & 7, disp); +} + +inline void X64_Movzx_Reg64_Rm16_Disp32(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int32_t disp) +{ + jit->write_ubyte(x64_rex(true, dest, 0, src)); + IA32_Movzx_Reg32_Rm16_Disp32(jit, dest & 7, src & 7, disp); +} + +inline void X64_Lea_DispRegImm8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src_base, jit_int8_t val) +{ + jit->write_ubyte(x64_rex(true, dest, 0, src_base)); + IA32_Lea_DispRegImm8(jit, dest & 7, src_base & 7, val); +} + +inline void X64_Lea_DispRegImm32(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src_base, jit_int32_t val) +{ + jit->write_ubyte(x64_rex(true, dest, 0, src_base)); + IA32_Lea_DispRegImm32(jit, dest & 7, src_base & 7, val); +} + +inline void X64_Add_Rm_Imm8(JitWriter *jit, jit_uint8_t reg, jit_int8_t value, jit_uint8_t mode) +{ + jit->write_ubyte(x64_rex(true, 0, 0, reg)); + IA32_Add_Rm_Imm8(jit, reg & 7, value, mode); +} + +inline void X64_Add_Rm_Imm32(JitWriter *jit, jit_uint8_t reg, jit_int32_t value, jit_uint8_t mode) +{ + jit->write_ubyte(x64_rex(true, 0, 0, reg)); + IA32_Add_Rm_Imm32(jit, reg & 7, value, mode); +} + +inline void X64_Movaps_Rm(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src) +{ + if (dest >= kREG_XMM8 || src >= kREG_XMM8) + jit->write_ubyte(x64_rex(false, dest, 0, src)); + jit->write_ubyte(0x0F); + jit->write_ubyte(0x28); + jit->write_ubyte(ia32_modrm(MOD_MEM_REG, dest & 7, src & 7)); +} + +inline void X64_Movups_Rm(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src) +{ + if (dest >= kREG_XMM8 || src >= kREG_XMM8) + jit->write_ubyte(x64_rex(false, dest, 0, src)); + jit->write_ubyte(0x0F); + jit->write_ubyte(0x10); + jit->write_ubyte(ia32_modrm(MOD_MEM_REG, dest & 7, src & 7)); +} + +inline void X64_Movaps_Rm_Reg(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src) +{ + if (dest >= kREG_XMM8 || src >= kREG_XMM8) + jit->write_ubyte(x64_rex(false, src, 0, dest)); + jit->write_ubyte(0x0F); + jit->write_ubyte(0x29); + jit->write_ubyte(ia32_modrm(MOD_MEM_REG, src & 7, dest & 7)); + jit->write_ubyte(ia32_sib(NOSCALE, kREG_NOIDX, dest & 7)); +} + +inline void X64_Movapd_Rm_Reg(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src) +{ + jit->write_ubyte(0x66); + if (dest >= kREG_XMM8 || src >= kREG_XMM8) + jit->write_ubyte(x64_rex(false, src, 0, dest)); + jit->write_ubyte(0x0F); + jit->write_ubyte(0x29); + jit->write_ubyte(ia32_modrm(MOD_MEM_REG, src & 7, dest & 7)); + jit->write_ubyte(ia32_sib(NOSCALE, kREG_NOIDX, dest & 7)); +} + +inline void X64_Movups_Rm_Reg(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src) +{ + if (dest >= kREG_XMM8 || src >= kREG_XMM8) + jit->write_ubyte(x64_rex(false, src, 0, dest)); + jit->write_ubyte(0x0F); + jit->write_ubyte(0x11); + jit->write_ubyte(ia32_modrm(MOD_MEM_REG, src & 7, dest & 7)); +} + +inline void X64_Movupd_Rm_Reg(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src) +{ + jit->write_ubyte(0x66); + if (dest >= kREG_XMM8 || src >= kREG_XMM8) + jit->write_ubyte(x64_rex(false, src, 0, dest)); + jit->write_ubyte(0x0F); + jit->write_ubyte(0x11); + jit->write_ubyte(ia32_modrm(MOD_MEM_REG, src & 7, dest & 7)); +} + +inline void X64_Movupd_Rm_Disp8_Reg(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp) +{ + jit->write_ubyte(0x66); + if (dest >= kREG_XMM8 || src >= kREG_XMM8) + jit->write_ubyte(x64_rex(false, src, 0, dest)); + jit->write_ubyte(0x0F); + jit->write_ubyte(0x11); + jit->write_ubyte(ia32_modrm(MOD_DISP8, src & 7, dest & 7)); + jit->write_byte(disp); +} + +inline void X64_Movaps_Rm_Disp8_Reg(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp) +{ + if (dest >= kREG_XMM8 || src >= kREG_XMM8) + jit->write_ubyte(x64_rex(false, src, 0, dest)); + jit->write_ubyte(0x0F); + jit->write_ubyte(0x29); + jit->write_ubyte(ia32_modrm(MOD_DISP8, src & 7, dest & 7)); + jit->write_byte(disp); +} + +inline void X64_Movups_Rm_Disp8_Reg(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp) +{ + if (dest >= kREG_XMM8 || src >= kREG_XMM8) + jit->write_ubyte(x64_rex(false, src, 0, dest)); + jit->write_ubyte(0x0F); + jit->write_ubyte(0x11); + jit->write_ubyte(ia32_modrm(MOD_DISP8, src & 7, dest & 7)); + jit->write_byte(disp); +} + +inline void X64_Movaps_Rm_Disp32_Reg(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int32_t disp) +{ + if (dest >= kREG_XMM8 || src >= kREG_XMM8) + jit->write_ubyte(x64_rex(false, src, 0, dest)); + jit->write_ubyte(0x0F); + jit->write_ubyte(0x29); + jit->write_ubyte(ia32_modrm(MOD_DISP32, src & 7, dest & 7)); + jit->write_byte(disp); +} + +inline void X64_Movups_Rm_Disp32_Reg(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int32_t disp) +{ + if (dest >= kREG_XMM8 || src >= kREG_XMM8) + jit->write_ubyte(x64_rex(false, src, 0, dest)); + jit->write_ubyte(0x0F); + jit->write_ubyte(0x11); + jit->write_ubyte(ia32_modrm(MOD_DISP32, src & 7, dest & 7)); + jit->write_byte(disp); +} + +inline void X64_Movlps_Rm(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src) +{ + if (dest >= kREG_XMM8 || src >= kREG_XMM8) + jit->write_ubyte(x64_rex(false, dest, 0, src)); + jit->write_ubyte(0x0F); + jit->write_ubyte(0x12); + jit->write_ubyte(ia32_modrm(MOD_MEM_REG, dest & 7, src & 7)); +} + +inline void X64_Movhps_Rm(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src) +{ + if (dest >= kREG_XMM8 || src >= kREG_XMM8) + jit->write_ubyte(x64_rex(false, dest, 0, src)); + jit->write_ubyte(0x0F); + jit->write_ubyte(0x16); + jit->write_ubyte(ia32_modrm(MOD_MEM_REG, dest & 7, src & 7)); +} + +inline void X64_Movaps_Rm_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp) +{ + if (dest >= kREG_XMM8 || src >= kREG_XMM8) + jit->write_ubyte(x64_rex(false, dest, 0, src)); + jit->write_ubyte(0x0F); + jit->write_ubyte(0x28); + jit->write_ubyte(ia32_modrm(MOD_DISP8, dest & 7, src & 7)); + jit->write_byte(disp); +} + +inline void X64_Movups_Rm_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp) +{ + if (dest >= kREG_XMM8 || src >= kREG_XMM8) + jit->write_ubyte(x64_rex(false, dest, 0, src)); + jit->write_ubyte(0x0F); + jit->write_ubyte(0x10); + jit->write_ubyte(ia32_modrm(MOD_DISP8, dest & 7, src & 7)); + jit->write_byte(disp); +} + +inline void X64_Movlps_Rm_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp) +{ + if (dest >= kREG_XMM8 || src >= kREG_XMM8) + jit->write_ubyte(x64_rex(false, dest, 0, src)); + jit->write_ubyte(0x0F); + jit->write_ubyte(0x12); + jit->write_ubyte(ia32_modrm(MOD_DISP8, dest & 7, src & 7)); + jit->write_byte(disp); +} + +inline void X64_Movhps_Rm_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp) +{ + if (dest >= kREG_XMM8 || src >= kREG_XMM8) + jit->write_ubyte(x64_rex(false, dest, 0, src)); + jit->write_ubyte(0x0F); + jit->write_ubyte(0x16); + jit->write_ubyte(ia32_modrm(MOD_DISP8, dest & 7, src & 7)); + jit->write_byte(disp); +} + +inline void X64_Movaps_Rm_Disp32(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int32_t disp) +{ + if (dest >= kREG_XMM8 || src >= kREG_XMM8) + jit->write_ubyte(x64_rex(false, dest, 0, src)); + jit->write_ubyte(0x0F); + jit->write_ubyte(0x28); + jit->write_ubyte(ia32_modrm(MOD_DISP32, dest & 7, src & 7)); + jit->write_byte(disp); +} + +inline void X64_Movups_Rm_Disp32(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int32_t disp) +{ + if (dest >= kREG_XMM8 || src >= kREG_XMM8) + jit->write_ubyte(x64_rex(false, dest, 0, src)); + jit->write_ubyte(0x0F); + jit->write_ubyte(0x10); + jit->write_ubyte(ia32_modrm(MOD_DISP32, dest & 7, src & 7)); + jit->write_byte(disp); +} + +inline void X64_Movapd_Rm(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src) +{ + if (dest >= kREG_XMM8 || src >= kREG_XMM8) + jit->write_ubyte(x64_rex(false, dest, 0, src)); + jit->write_ubyte(0x66); + jit->write_ubyte(0x0F); + jit->write_ubyte(0x28); + jit->write_ubyte(ia32_modrm(MOD_MEM_REG, dest & 7, src & 7)); +} + +inline void X64_Movupd_Rm(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src) +{ + if (dest >= kREG_XMM8 || src >= kREG_XMM8) + jit->write_ubyte(x64_rex(false, dest, 0, src)); + jit->write_ubyte(0x66); + jit->write_ubyte(0x0F); + jit->write_ubyte(0x10); + jit->write_ubyte(ia32_modrm(MOD_MEM_REG, dest & 7, src & 7)); +} + +inline void X64_Movapd_Rm_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp) +{ + if (dest >= kREG_XMM8 || src >= kREG_XMM8) + jit->write_ubyte(x64_rex(false, dest, 0, src)); + jit->write_ubyte(0x66); + jit->write_ubyte(0x0F); + jit->write_ubyte(0x28); + jit->write_ubyte(ia32_modrm(MOD_DISP8, dest & 7, src & 7)); + jit->write_byte(disp); +} + +inline void X64_Movupd_Rm_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp) +{ + if (dest >= kREG_XMM8 || src >= kREG_XMM8) + jit->write_ubyte(x64_rex(false, dest, 0, src)); + jit->write_ubyte(0x66); + jit->write_ubyte(0x0F); + jit->write_ubyte(0x10); + jit->write_ubyte(ia32_modrm(MOD_DISP8, dest & 7, src & 7)); + jit->write_byte(disp); +} + +inline void X64_Movapd_Rm_Disp32(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int32_t disp) +{ + if (dest >= kREG_XMM8 || src >= kREG_XMM8) + jit->write_ubyte(x64_rex(false, dest, 0, src)); + jit->write_ubyte(0x66); + jit->write_ubyte(0x0F); + jit->write_ubyte(0x28); + jit->write_ubyte(ia32_modrm(MOD_DISP32, dest & 7, src & 7)); + jit->write_byte(disp); +} + +inline void X64_Movupd_Rm_Disp32(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int32_t disp) +{ + if (dest >= kREG_XMM8 || src >= kREG_XMM8) + jit->write_ubyte(x64_rex(false, dest, 0, src)); + jit->write_ubyte(0x66); + jit->write_ubyte(0x0F); + jit->write_ubyte(0x10); + jit->write_ubyte(ia32_modrm(MOD_DISP32, dest & 7, src & 7)); + jit->write_byte(disp); +} + +inline void X64_Cld(JitWriter *jit) +{ + IA32_Cld(jit); +} + +inline void X64_Rep(JitWriter *jit) +{ + IA32_Rep(jit); +} + +inline void X64_Movsq(JitWriter *jit) +{ + jit->write_ubyte(x64_rex(true, 0, 0, 0)); + jit->write_ubyte(IA32_MOVSD); +} + +inline void X64_Movsb(JitWriter *jit) +{ + jit->write_ubyte(IA32_MOVSB); +} + +inline void X64_Lea_Reg_DispRegMultImm8(JitWriter *jit, + jit_uint8_t dest, + jit_uint8_t src_base, + jit_uint8_t src_index, + jit_uint8_t scale, + jit_int8_t val) +{ + jit->write_ubyte(x64_rex(true, dest, 0, src_index)); + IA32_Lea_Reg_DispRegMultImm8(jit, dest & 7, src_base, src_index & 7, scale, val); +} + +inline void X64_Lea_Reg_DispRegMultImm32(JitWriter *jit, + jit_uint8_t dest, + jit_uint8_t src_base, + jit_uint8_t src_index, + jit_uint8_t scale, + jit_int32_t val) +{ + jit->write_ubyte(x64_rex(true, dest, 0, src_index)); + jit->write_ubyte(IA32_LEA_REG_MEM); + jit->write_ubyte(ia32_modrm(MOD_DISP32, dest & 7, kREG_SIB)); + jit->write_ubyte(ia32_sib(scale, src_index & 7, src_base)); + jit->write_int32(val); +} + +inline jitoffs_t X64_Mov_Reg_Imm32(JitWriter *jit, jit_uint8_t dest, jit_int32_t num) +{ + jitoffs_t offs; + jit->write_ubyte(x64_rex(true, 0, 0, dest)); + jit->write_ubyte(0xC7); + jit->write_ubyte(ia32_modrm(MOD_REG, 0, dest & 7)); + offs = jit->get_outputpos(); + jit->write_int32(num); + return offs; +} + +inline jitoffs_t X64_Mov_Reg_Imm64(JitWriter *jit, jit_uint8_t dest, jit_int64_t num) +{ + jitoffs_t offs; + jit->write_ubyte(x64_rex(true, 0, 0, dest)); + jit->write_ubyte(IA32_MOV_REG_IMM+(dest & 7)); + offs = jit->get_outputpos(); + jit->write_int64(num); + return offs; +} + +inline void X64_Mov_Rm8_Reg8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode) +{ + if (dest >= kREG_R8 || src > kREG_R8) + jit->write_ubyte(x64_rex(false, src, 0, dest)); + jit->write_ubyte(IA32_MOV_RM8_REG8); + if ((dest & 7) == kREG_RBP) // Using rbp/r13 requires a displacement + mode = MOD_DISP8; + jit->write_ubyte(ia32_modrm(mode, src & 7, dest & 7)); + if ((dest & 7) == kREG_RSP) // rsp/r12 needs SIB byte + jit->write_ubyte(ia32_sib(NOSCALE, kREG_NOIDX, dest & 7)); + else if ((dest & 7) == kREG_RBP) + jit->write_ubyte(0); // Displacement of 0 needed to use rbp/r13 +} + +inline void X64_Mov_Rm32_Reg32(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode) +{ + if (dest >= kREG_R8 || src > kREG_R8) + jit->write_ubyte(x64_rex(false, src, 0, dest)); + jit->write_ubyte(IA32_MOV_RM_REG); + if ((dest & 7) == kREG_RBP) // Using rbp/r13 requires a displacement + mode = MOD_DISP8; + jit->write_ubyte(ia32_modrm(mode, src & 7, dest & 7)); + if ((dest & 7) == kREG_RSP) // rsp/r12 needs SIB byte + jit->write_ubyte(ia32_sib(NOSCALE, kREG_NOIDX, dest & 7)); + else if ((dest & 7) == kREG_RBP) + jit->write_ubyte(0); // Displacement of 0 needed to use rbp/r13 +} + +inline void X64_Mov_Rm16_Reg16(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode) +{ + jit->write_ubyte(IA32_16BIT_PREFIX); + X64_Mov_Rm32_Reg32(jit, dest, src, mode); +} + + +inline void X64_Mov_Rm_Reg(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_uint8_t mode) +{ + jit->write_ubyte(x64_rex(true, src, 0, dest)); + jit->write_ubyte(IA32_MOV_RM_REG); + if ((dest & 7) == kREG_RBP) // Using rbp/r13 requires a displacement + mode = MOD_DISP8; + jit->write_ubyte(ia32_modrm(mode, src & 7, dest & 7)); + if ((dest & 7) == kREG_RSP) // rsp/r12 needs SIB byte + jit->write_ubyte(ia32_sib(NOSCALE, kREG_NOIDX, dest & 7)); + else if ((dest & 7) == kREG_RBP) + jit->write_ubyte(0); // Displacement of 0 needed to use rbp/r13 +} + +inline void X64_Mov_Rm_Reg_Disp8(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src, jit_int8_t disp) +{ + jit->write_ubyte(x64_rex(true, src, 0, dest)); + IA32_Mov_Rm_Reg_Disp8(jit, dest & 7, src & 7, disp); +} + +inline jitoffs_t X64_Call_Imm32(JitWriter *jit, jit_int32_t disp) +{ + return IA32_Call_Imm32(jit, disp); +} + +inline void X64_Write_Jump32_Abs(JitWriter *jit, jitoffs_t jmp, void *target) +{ + IA32_Write_Jump32_Abs(jit, jmp, target); +} + +inline void X64_Call_Reg(JitWriter *jit, jit_uint8_t reg) +{ + if (reg >= kREG_R8) + jit->write_ubyte(x64_rex(false, 0, 0, reg)); + IA32_Call_Reg(jit, reg & 7); +} + +inline jitoffs_t X64_Mov_Reg8_Imm8(JitWriter *jit, jit_uint8_t dest, jit_int8_t value) +{ + jitoffs_t offs; + if (dest >= kREG_R8) + jit->write_ubyte(x64_rex(false, 0, 0, dest)); + jit->write_ubyte(IA32_MOV_REG8_IMM8+(dest & 7)); + offs = jit->get_outputpos(); + jit->write_byte(value); + return offs; +} + +inline void X64_Movd_Reg32_Xmm(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src) +{ + jit->write_ubyte(0x66); + if (dest >= kREG_R8 || src >= kREG_XMM8) + jit->write_ubyte(x64_rex(false, src, 0, dest)); + jit->write_ubyte(0x0F); + jit->write_ubyte(0x7E); + jit->write_ubyte(ia32_modrm(MOD_REG, src & 7, dest & 7)); +} + +inline void X64_Movq_Reg_Xmm(JitWriter *jit, jit_uint8_t dest, jit_uint8_t src) +{ + jit->write_ubyte(0x66); + jit->write_ubyte(x64_rex(true, src, 0, dest)); + jit->write_ubyte(0x0F); + jit->write_ubyte(0x7E); + jit->write_ubyte(ia32_modrm(MOD_REG, src & 7, dest & 7)); +} \ No newline at end of file diff --git a/extensions/clientprefs/AMBuilder b/extensions/clientprefs/AMBuilder index 585058add3..e8b43a7e9d 100644 --- a/extensions/clientprefs/AMBuilder +++ b/extensions/clientprefs/AMBuilder @@ -1,23 +1,24 @@ # vim: set sts=2 ts=8 sw=2 tw=99 et ft=python: import os -binary = SM.ExtLibrary(builder, 'clientprefs.ext') -binary.compiler.cxxincludes += [ - os.path.join(SM.mms_root, 'core', 'sourcehook'), -] -if binary.compiler.family == 'gcc' or binary.compiler.family == 'clang': - binary.compiler.cxxflags += ['-fno-rtti'] -elif binary.compiler.family == 'msvc': - binary.compiler.cxxflags += ['/GR-'] +for arch in SM.archs: + binary = SM.ExtLibrary(builder, 'clientprefs.ext', arch) + binary.compiler.cxxincludes += [ + os.path.join(SM.mms_root, 'core', 'sourcehook'), + ] + if binary.compiler.family == 'gcc' or binary.compiler.family == 'clang': + binary.compiler.cxxflags += ['-fno-rtti'] + elif binary.compiler.family == 'msvc': + binary.compiler.cxxflags += ['/GR-'] -binary.sources += [ - 'extension.cpp', - 'cookie.cpp', - 'menus.cpp', - 'natives.cpp', - 'query.cpp', - '../../public/smsdk_ext.cpp' -] + binary.sources += [ + 'extension.cpp', + 'cookie.cpp', + 'menus.cpp', + 'natives.cpp', + 'query.cpp', + '../../public/smsdk_ext.cpp' + ] -SM.extensions += [builder.Add(binary)] + SM.extensions += [builder.Add(binary)] diff --git a/extensions/cstrike/AMBuilder b/extensions/cstrike/AMBuilder index 8c6fbda3b6..c8e62028df 100644 --- a/extensions/cstrike/AMBuilder +++ b/extensions/cstrike/AMBuilder @@ -11,14 +11,24 @@ project.sources += [ 'util_cstrike.cpp', '../../public/smsdk_ext.cpp', '../../public/CDetour/detours.cpp', - '../../public/asm/asm.c' + '../../public/asm/asm.c', + '../../public/libudis86/decode.c', + '../../public/libudis86/itab.c', + '../../public/libudis86/syn-att.c', + '../../public/libudis86/syn-intel.c', + '../../public/libudis86/syn.c', + '../../public/libudis86/udis86.c', ] +project.compiler.defines += ['HAVE_STRING_H']; for sdk_name in ['css', 'csgo']: if sdk_name not in SM.sdks: continue sdk = SM.sdks[sdk_name] - - SM.HL2Config(project, 'game.cstrike.ext.' + sdk.ext, sdk) + for arch in SM.archs: + if not arch in sdk.platformSpec[builder.target.platform]: + continue + + SM.HL2Config(project, 'game.cstrike.ext.' + sdk.ext, sdk, arch) SM.extensions += builder.Add(project) diff --git a/extensions/cstrike/itemdef-hash.h b/extensions/cstrike/itemdef-hash.h index 7642804fa3..dec06d15f4 100644 --- a/extensions/cstrike/itemdef-hash.h +++ b/extensions/cstrike/itemdef-hash.h @@ -18,7 +18,11 @@ struct HashItemDef_Node class CHashItemDef { public: +#ifdef PLATFORM_X86 unsigned char padding[36]; +#else + unsigned char padding[56]; +#endif HashItemDef_Node *pMem; int nAllocatedCount; int nGrowSize; diff --git a/extensions/cstrike/util_cstrike.cpp b/extensions/cstrike/util_cstrike.cpp index 99e6f5fea9..5d9ca86596 100644 --- a/extensions/cstrike/util_cstrike.cpp +++ b/extensions/cstrike/util_cstrike.cpp @@ -192,9 +192,9 @@ CEconItemSchema *GetItemSchema() void *pSchema = NULL; pWrapper->Execute(NULL, &pSchema); - //In windows this is actually ItemSystem() + 4 is ItemSchema -#ifdef WIN32 - return (CEconItemSchema *)((intptr_t)pSchema + 4); + //On windows/mac this is actually ItemSystem() + sizeof(void *) is ItemSchema +#if defined(PLATFORM_WINDOWS) || defined(PLATFORM_APPLE) + return (CEconItemSchema *)((intptr_t)pSchema + sizeof(void *)); #else return (CEconItemSchema *)pSchema; #endif diff --git a/extensions/curl/AMBuilder b/extensions/curl/AMBuilder index 523d94b8d0..6af02a94c1 100644 --- a/extensions/curl/AMBuilder +++ b/extensions/curl/AMBuilder @@ -2,27 +2,27 @@ import os libcurl = builder.Build('curl-src/lib/AMBuilder') +for arch in SM.archs: + binary = SM.ExtLibrary(builder, 'webternet.ext', arch) + binary.compiler.includes += [ + os.path.join(builder.sourcePath, 'extensions', 'curl', 'curl-src', 'include') + ] + binary.compiler.defines += ['CURL_STATICLIB'] + if binary.compiler.family == 'gcc' or binary.compiler.family == 'clang': + binary.compiler.cxxflags += ['-fno-rtti'] + elif binary.compiler.family == 'msvc': + binary.compiler.cxxflags += ['/GR-'] + binary.compiler.postlink += [libcurl[arch].binary] + if builder.target.platform == 'linux': + binary.compiler.postlink += ['-lrt'] + elif builder.target.platform == 'windows': + binary.compiler.postlink += ['ws2_32.lib'] -binary = SM.ExtLibrary(builder, 'webternet.ext') -binary.compiler.includes += [ - os.path.join(builder.sourcePath, 'extensions', 'curl', 'curl-src', 'include') -] -binary.compiler.defines += ['CURL_STATICLIB'] -if binary.compiler.family == 'gcc' or binary.compiler.family == 'clang': - binary.compiler.cxxflags += ['-fno-rtti'] -elif binary.compiler.family == 'msvc': - binary.compiler.cxxflags += ['/GR-'] -binary.compiler.postlink += [libcurl.binary] -if builder.target.platform == 'linux': - binary.compiler.postlink += ['-lrt'] -elif builder.target.platform == 'windows': - binary.compiler.postlink += ['ws2_32.lib'] + binary.sources += [ + 'extension.cpp', + 'curlapi.cpp', + '../../public/smsdk_ext.cpp' + ] -binary.sources += [ - 'extension.cpp', - 'curlapi.cpp', - '../../public/smsdk_ext.cpp' -] - -SM.extensions += [builder.Add(binary)] + SM.extensions += [builder.Add(binary)] diff --git a/extensions/curl/curl-src/lib/AMBuilder b/extensions/curl/curl-src/lib/AMBuilder index 71859c50fd..fe11dd2b4f 100644 --- a/extensions/curl/curl-src/lib/AMBuilder +++ b/extensions/curl/curl-src/lib/AMBuilder @@ -3,96 +3,98 @@ import os, platform builder.SetBuildFolder('libcurl') -binary = SM.StaticLibrary(builder, 'curl') -binary.compiler.includes += [ - os.path.join(builder.sourcePath, 'extensions', 'curl', 'curl-src', 'lib'), - os.path.join(builder.sourcePath, 'extensions', 'curl', 'curl-src', 'include') -] - -if builder.target.platform == 'mac': - mac_version, ignore, ignore = platform.mac_ver() - mac_tuple = mac_version.split('.') - if int(mac_tuple[0]) >= 10 and int(mac_tuple[1]) >= 9: - binary.compiler.defines += ['BUILTIN_STRLCAT'] -elif builder.target.platform == 'windows': - binary.compiler.defines += [ - 'BUILDING_LIBCURL', - 'CURL_STATICLIB', - 'CURL_DISABLE_LDAP', +rvalue = {} +for arch in SM.archs: + binary = SM.StaticLibrary(builder, 'curl', arch) + binary.compiler.includes += [ + os.path.join(builder.sourcePath, 'extensions', 'curl', 'curl-src', 'lib'), + os.path.join(builder.sourcePath, 'extensions', 'curl', 'curl-src', 'include') ] -elif builder.target.platform == 'linux': - binary.compiler.defines += ['_GNU_SOURCE'] -if binary.compiler.family == 'clang': - # https://llvm.org/bugs/show_bug.cgi?id=16428 - binary.compiler.cflags += ['-Wno-attributes'] + if builder.target.platform == 'mac': + mac_version, ignore, ignore = platform.mac_ver() + mac_tuple = mac_version.split('.') + if int(mac_tuple[0]) >= 10 and int(mac_tuple[1]) >= 9: + binary.compiler.defines += ['BUILTIN_STRLCAT'] + elif builder.target.platform == 'windows': + binary.compiler.defines += [ + 'BUILDING_LIBCURL', + 'CURL_STATICLIB', + 'CURL_DISABLE_LDAP', + ] + elif builder.target.platform == 'linux': + binary.compiler.defines += ['_GNU_SOURCE'] + + if binary.compiler.family == 'clang': + # https://llvm.org/bugs/show_bug.cgi?id=16428 + binary.compiler.cflags += ['-Wno-attributes'] -binary.sources += [ - 'base64.c', - 'connect.c', - 'content_encoding.c', - 'cookie.c', - 'curl_addrinfo.c', - 'dict.c', - 'easy.c', - 'escape.c', - 'file.c', - 'formdata.c', - 'ftp.c', - 'getenv.c', - 'getinfo.c', - 'gtls.c', - 'hash.c', - 'hostares.c', - 'hostasyn.c', - 'hostip.c', - 'hostip4.c', - 'hostip6.c', - 'hostsyn.c', - 'hostthre.c', - 'http.c', - 'http_chunks.c', - 'http_digest.c', - 'http_negotiate.c', - 'http_ntlm.c', - 'if2ip.c', - 'inet_ntop.c', - 'inet_pton.c', - 'krb4.c', - 'krb5.c', - 'ldap.c', - 'llist.c', - 'md5.c', - 'memdebug.c', - 'mprintf.c', - 'multi.c', - 'netrc.c', - 'nss.c', - 'parsedate.c', - 'progress.c', - 'qssl.c', - 'rawstr.c', - 'security.c', - 'select.c', - 'sendf.c', - 'share.c', - 'socks.c', - 'speedcheck.c', - 'splay.c', - 'ssh.c', - 'sslgen.c', - 'ssluse.c', - 'strdup.c', - 'strequal.c', - 'strerror.c', - 'strtok.c', - 'strtoofft.c', - 'telnet.c', - 'tftp.c', - 'timeval.c', - 'transfer.c', - 'url.c', - 'version.c' -] -rvalue = builder.Add(binary) + binary.sources += [ + 'base64.c', + 'connect.c', + 'content_encoding.c', + 'cookie.c', + 'curl_addrinfo.c', + 'dict.c', + 'easy.c', + 'escape.c', + 'file.c', + 'formdata.c', + 'ftp.c', + 'getenv.c', + 'getinfo.c', + 'gtls.c', + 'hash.c', + 'hostares.c', + 'hostasyn.c', + 'hostip.c', + 'hostip4.c', + 'hostip6.c', + 'hostsyn.c', + 'hostthre.c', + 'http.c', + 'http_chunks.c', + 'http_digest.c', + 'http_negotiate.c', + 'http_ntlm.c', + 'if2ip.c', + 'inet_ntop.c', + 'inet_pton.c', + 'krb4.c', + 'krb5.c', + 'ldap.c', + 'llist.c', + 'md5.c', + 'memdebug.c', + 'mprintf.c', + 'multi.c', + 'netrc.c', + 'nss.c', + 'parsedate.c', + 'progress.c', + 'qssl.c', + 'rawstr.c', + 'security.c', + 'select.c', + 'sendf.c', + 'share.c', + 'socks.c', + 'speedcheck.c', + 'splay.c', + 'ssh.c', + 'sslgen.c', + 'ssluse.c', + 'strdup.c', + 'strequal.c', + 'strerror.c', + 'strtok.c', + 'strtoofft.c', + 'telnet.c', + 'tftp.c', + 'timeval.c', + 'transfer.c', + 'url.c', + 'version.c' + ] + rvalue[arch] = builder.Add(binary) diff --git a/extensions/geoip/AMBuilder b/extensions/geoip/AMBuilder index 7afcedd1bb..40bb19bdd6 100644 --- a/extensions/geoip/AMBuilder +++ b/extensions/geoip/AMBuilder @@ -1,19 +1,20 @@ # vim: set sts=2 ts=8 sw=2 tw=99 et ft=python: import os -binary = SM.ExtLibrary(builder, 'geoip.ext') -if binary.compiler.family == 'gcc' or binary.compiler.family == 'clang': - binary.compiler.cxxflags += ['-fno-rtti'] -elif binary.compiler.family == 'msvc': - binary.compiler.cxxflags += ['/GR-'] -if builder.target.platform == 'windows': - binary.compiler.postlink += ['wsock32.lib'] +for arch in SM.archs: + binary = SM.ExtLibrary(builder, 'geoip.ext', arch) + if binary.compiler.family == 'gcc' or binary.compiler.family == 'clang': + binary.compiler.cxxflags += ['-fno-rtti'] + elif binary.compiler.family == 'msvc': + binary.compiler.cxxflags += ['/GR-'] + if builder.target.platform == 'windows': + binary.compiler.postlink += ['wsock32.lib'] -binary.sources += [ - 'extension.cpp', - 'GeoIP.c', - '../../public/smsdk_ext.cpp' -] + binary.sources += [ + 'extension.cpp', + 'GeoIP.c', + '../../public/smsdk_ext.cpp' + ] -SM.extensions += [builder.Add(binary)] + SM.extensions += [builder.Add(binary)] diff --git a/extensions/mysql/AMBuilder b/extensions/mysql/AMBuilder index 3254754dd0..575bb10120 100644 --- a/extensions/mysql/AMBuilder +++ b/extensions/mysql/AMBuilder @@ -2,45 +2,46 @@ import os if SM.mysql_root: - binary = SM.ExtLibrary(builder, 'dbi.mysql.ext') - binary.compiler.cxxincludes += [ - os.path.join(SM.mysql_root, 'include'), - os.path.join(SM.mms_root, 'core', 'sourcehook') - ] - if binary.compiler.family == 'gcc' or binary.compiler.family == 'clang': - binary.compiler.cxxflags += ['-fno-rtti'] - elif binary.compiler.family == 'msvc': - binary.compiler.cxxflags += ['/GR-'] - - if builder.target.platform == 'linux' or builder.target.platform == 'mac': - binary.compiler.postlink += [ - os.path.join(SM.mysql_root, 'lib', 'libmysqlclient_r.a'), - '-lz', - '-lpthread', - '-lm', - ] - if builder.target.platform == 'linux': - binary.compiler.postlink += ['-lrt'] - elif builder.target.platform == 'windows': - binary.compiler.postlink += [ - os.path.join(SM.mysql_root, 'lib', 'opt', 'mysqlclient.lib'), - os.path.join(SM.mysql_root, 'lib', 'opt', 'zlib.lib'), - 'wsock32.lib' + for arch in SM.archs: + binary = SM.ExtLibrary(builder, 'dbi.mysql.ext', arch) + binary.compiler.cxxincludes += [ + os.path.join(SM.mysql_root[arch], 'include'), + os.path.join(SM.mms_root, 'core', 'sourcehook') ] + if binary.compiler.family == 'gcc' or binary.compiler.family == 'clang': + binary.compiler.cxxflags += ['-fno-rtti'] + elif binary.compiler.family == 'msvc': + binary.compiler.cxxflags += ['/GR-'] - binary.sources += [ - '../../public/smsdk_ext.cpp', - 'mysql/MyBasicResults.cpp', - 'mysql/MyBoundResults.cpp', - 'mysql/MyDatabase.cpp', - 'mysql/MyDriver.cpp', - 'mysql/MyStatement.cpp', - 'extension.cpp' - ] + if builder.target.platform == 'linux' or builder.target.platform == 'mac': + binary.compiler.postlink += [ + os.path.join(SM.mysql_root[arch], 'lib', 'libmysqlclient_r.a'), + '-lz', + '-lpthread', + '-lm', + ] + if builder.target.platform == 'linux': + binary.compiler.postlink += ['-lrt'] + elif builder.target.platform == 'windows': + binary.compiler.postlink += [ + os.path.join(SM.mysql_root, 'lib', 'opt', 'mysqlclient.lib'), + os.path.join(SM.mysql_root, 'lib', 'opt', 'zlib.lib'), + 'wsock32.lib' + ] + + binary.sources += [ + '../../public/smsdk_ext.cpp', + 'mysql/MyBasicResults.cpp', + 'mysql/MyBoundResults.cpp', + 'mysql/MyDatabase.cpp', + 'mysql/MyDriver.cpp', + 'mysql/MyStatement.cpp', + 'extension.cpp' + ] - if binary.compiler.family == 'msvc' and binary.compiler.version >= 1900: - binary.sources += [ 'msvc15hack.c' ] - binary.compiler.linkflags += ['legacy_stdio_definitions.lib', 'legacy_stdio_wide_specifiers.lib'] + if binary.compiler.family == 'msvc' and binary.compiler.version >= 1900: + binary.sources += [ 'msvc15hack.c' ] + binary.compiler.linkflags += ['legacy_stdio_definitions.lib', 'legacy_stdio_wide_specifiers.lib'] - SM.extensions += [builder.Add(binary)] + SM.extensions += [builder.Add(binary)] diff --git a/extensions/regex/AMBuilder b/extensions/regex/AMBuilder index f5d668097a..747b120bcf 100644 --- a/extensions/regex/AMBuilder +++ b/extensions/regex/AMBuilder @@ -1,28 +1,35 @@ # vim: set sts=2 ts=8 sw=2 tw=99 et ft=python: import os -binary = SM.ExtLibrary(builder, 'regex.ext') -binary.compiler.cxxincludes += [ - os.path.join(SM.mms_root, 'core', 'sourcehook'), -] -if binary.compiler.family == 'gcc' or binary.compiler.family == 'clang': - binary.compiler.cxxflags += ['-fno-rtti'] -elif binary.compiler.family == 'msvc': - binary.compiler.cxxflags += ['/GR-'] +for arch in SM.archs: + binary = SM.ExtLibrary(builder, 'regex.ext', arch) + binary.compiler.cxxincludes += [ + os.path.join(SM.mms_root, 'core', 'sourcehook'), + ] + if binary.compiler.family == 'gcc' or binary.compiler.family == 'clang': + binary.compiler.cxxflags += ['-fno-rtti'] + elif binary.compiler.family == 'msvc': + binary.compiler.cxxflags += ['/GR-'] -if builder.target.platform == 'linux': - path = os.path.join(builder.sourcePath, 'extensions', 'regex', 'lib_linux', 'libpcre.a') -elif builder.target.platform == 'windows': - path = os.path.join(builder.sourcePath, 'extensions', 'regex', 'lib_win', 'pcre.lib') -elif builder.target.platform == 'mac': - path = os.path.join(builder.sourcePath, 'extensions', 'regex', 'lib_darwin', 'libpcre.a') -binary.compiler.postlink += [binary.Dep(path)] + if builder.target.platform == 'linux': + if arch == 'x86': + path = os.path.join(builder.sourcePath, 'extensions', 'regex', 'lib_linux', 'libpcre.a') + elif arch == 'x64': + path = os.path.join(builder.sourcePath, 'extensions', 'regex', 'lib_linux64', 'libpcre.a') + elif builder.target.platform == 'windows': + path = os.path.join(builder.sourcePath, 'extensions', 'regex', 'lib_win', 'pcre.lib') + elif builder.target.platform == 'mac': + if arch == 'x86': + path = os.path.join(builder.sourcePath, 'extensions', 'regex', 'lib_darwin', 'libpcre.a') + elif arch == 'x64': + path = os.path.join(builder.sourcePath, 'extensions', 'regex', 'lib_darwin64', 'libpcre.a') + binary.compiler.postlink += [binary.Dep(path)] -binary.sources += [ - 'extension.cpp', - 'CRegEx.cpp', - '../../public/smsdk_ext.cpp' -] + binary.sources += [ + 'extension.cpp', + 'CRegEx.cpp', + '../../public/smsdk_ext.cpp' + ] -SM.extensions += [builder.Add(binary)] + SM.extensions += [builder.Add(binary)] diff --git a/extensions/regex/lib_darwin64/libpcre.a b/extensions/regex/lib_darwin64/libpcre.a new file mode 100644 index 0000000000000000000000000000000000000000..2c6eb3e165d28bcbb52b27cf632f874f527ff6a1 GIT binary patch literal 631368 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�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

rfi}qMwTWk(vhJ%^P9bZ1}X!8 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„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 literal 0 HcmV?d00001 diff --git a/extensions/regex/lib_linux64/libpcre.a b/extensions/regex/lib_linux64/libpcre.a new file mode 100644 index 0000000000000000000000000000000000000000..804204212d61ef310cb883a3f7bfa4532341e588 GIT binary patch literal 556222 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 pc1vtype, retInfo->type, retInfo->flags, &retBuf, retbuf_needs_extra)) == 0) { delete vc; @@ -110,12 +112,14 @@ ValveCall *CreateValveCall(void *addr, /* Get parameter info */ PassInfo paramBuf[32]; + ObjectField fieldBuf[32][16]; size_t sizes[32]; size_t normSize = 0; size_t extraSize = 0; for (unsigned int i=0; i(params[1]); +#else + s_call_addr = g_pSM->FromPseudoAddress(params[1]); +#endif return (s_call_addr != NULL) ? 1 : 0; } diff --git a/extensions/sdktools/vdecoder.cpp b/extensions/sdktools/vdecoder.cpp index 8bac65558a..98e43e09ae 100644 --- a/extensions/sdktools/vdecoder.cpp +++ b/extensions/sdktools/vdecoder.cpp @@ -74,6 +74,8 @@ size_t ValveParamToBinParam(ValveType type, info->type = PassType_Object; info->flags = flags | PASSFLAG_OASSIGNOP | PASSFLAG_OCTOR; info->size = sizeof(Vector); + info->fields[0] = info->fields[1] = info->fields[2] = ObjectField::Float; + info->numFields = 3; } else { return 0; } @@ -97,6 +99,8 @@ size_t ValveParamToBinParam(ValveType type, info->type = PassType_Object; info->flags = flags | PASSFLAG_OASSIGNOP | PASSFLAG_OCTOR; info->size = sizeof(QAngle); + info->fields[0] = info->fields[1] = info->fields[2] = ObjectField::Float; + info->numFields = 3; } else { return 0; } diff --git a/extensions/sdktools/vglobals.cpp b/extensions/sdktools/vglobals.cpp index 76e90fbbe4..a6c9963754 100644 --- a/extensions/sdktools/vglobals.cpp +++ b/extensions/sdktools/vglobals.cpp @@ -199,12 +199,18 @@ bool UTIL_VerifySignature(const void *addr, const char *sig, size_t len) return true; } +#ifdef PLATFORM_X64 +#define KEY_SUFFIX "64" +#else +#define KEY_SUFFIX "" +#endif + #if defined PLATFORM_WINDOWS -#define FAKECLIENT_KEY "CreateFakeClient_Windows" +#define FAKECLIENT_KEY "CreateFakeClient_Windows" KEY_SUFFIX #elif defined PLATFORM_LINUX -#define FAKECLIENT_KEY "CreateFakeClient_Linux" +#define FAKECLIENT_KEY "CreateFakeClient_Linux" KEY_SUFFIX #elif defined PLATFORM_APPLE -#define FAKECLIENT_KEY "CreateFakeClient_Mac" +#define FAKECLIENT_KEY "CreateFakeClient_Mac" KEY_SUFFIX #else #error "Unsupported platform" #endif @@ -273,7 +279,12 @@ void GetIServer() } /* Finally we have the interface we were looking for */ +#ifdef PLATFORM_X86 iserver = *reinterpret_cast(reinterpret_cast(vfunc) + offset); +#elif defined PLATFORM_X64 + int32_t varOffset = *reinterpret_cast(reinterpret_cast(vfunc) + offset); + iserver = reinterpret_cast(reinterpret_cast(vfunc) + offset + sizeof(int32_t) + varOffset); +#endif } void GetResourceEntity() diff --git a/extensions/sdktools/vnatives.cpp b/extensions/sdktools/vnatives.cpp index 92694e2276..f3f581dd7e 100644 --- a/extensions/sdktools/vnatives.cpp +++ b/extensions/sdktools/vnatives.cpp @@ -1349,8 +1349,8 @@ static cell_t SetClientName(IPluginContext *pContext, const cell_t *params) } } - // The IClient vtable is +4 from the CBaseClient vtable due to multiple inheritance. - void *pGameClient = (void *)((intptr_t)pClient - 4); + // The IClient vtable is +sizeof(void *) from the CBaseClient vtable due to multiple inheritance. + void *pGameClient = (void *)((intptr_t)pClient - sizeof(void *)); // Change the name in the engine. START_CALL(); @@ -1427,7 +1427,7 @@ static cell_t SetClientInfo(IPluginContext *pContext, const cell_t *params) } #endif - unsigned char *CGameClient = (unsigned char *)pClient - 4; + unsigned char *CGameClient = (unsigned char *)pClient - sizeof(void *); START_CALL(); /* Not really a CBaseEntity* but this works */ diff --git a/extensions/sqlite/AMBuilder b/extensions/sqlite/AMBuilder index 485a824959..0d5e9b2238 100644 --- a/extensions/sqlite/AMBuilder +++ b/extensions/sqlite/AMBuilder @@ -1,33 +1,34 @@ # vim: set sts=2 ts=8 sw=2 tw=99 et ft=python: import os -binary = SM.ExtLibrary(builder, 'dbi.sqlite.ext') -binary.compiler.cxxincludes += [ - os.path.join(SM.mms_root, 'core', 'sourcehook'), -] -if binary.compiler.family == 'gcc' or binary.compiler.family == 'clang': - binary.compiler.cxxflags += ['-fno-rtti'] -elif binary.compiler.family == 'msvc': - binary.compiler.cxxflags += ['/GR-'] +for arch in SM.archs: + binary = SM.ExtLibrary(builder, 'dbi.sqlite.ext', arch) + binary.compiler.cxxincludes += [ + os.path.join(SM.mms_root, 'core', 'sourcehook'), + ] + if binary.compiler.family == 'gcc' or binary.compiler.family == 'clang': + binary.compiler.cxxflags += ['-fno-rtti'] + elif binary.compiler.family == 'msvc': + binary.compiler.cxxflags += ['/GR-'] -binary.compiler.defines += [ - 'SQLITE_OMIT_LOAD_EXTENSION', - 'SQLITE_THREADSAFE', - 'SQLITE_USE_URI', - 'SQLITE_ALLOW_URI_AUTHORITY', -] -if builder.target.platform == 'linux': - binary.compiler.postlink += ['-ldl', '-lpthread'] + binary.compiler.defines += [ + 'SQLITE_OMIT_LOAD_EXTENSION', + 'SQLITE_THREADSAFE', + 'SQLITE_USE_URI', + 'SQLITE_ALLOW_URI_AUTHORITY', + ] + if builder.target.platform == 'linux': + binary.compiler.postlink += ['-ldl', '-lpthread'] -binary.sources += [ - '../../public/smsdk_ext.cpp', - 'extension.cpp', - 'driver/SqDatabase.cpp', - 'driver/SqDriver.cpp', - 'driver/SqQuery.cpp', - 'driver/SqResults.cpp', - 'sqlite-source/sqlite3.c' -] + binary.sources += [ + '../../public/smsdk_ext.cpp', + 'extension.cpp', + 'driver/SqDatabase.cpp', + 'driver/SqDriver.cpp', + 'driver/SqQuery.cpp', + 'driver/SqResults.cpp', + 'sqlite-source/sqlite3.c' + ] -SM.extensions += [builder.Add(binary)] + SM.extensions += [builder.Add(binary)] diff --git a/extensions/tf2/AMBuilder b/extensions/tf2/AMBuilder index e7882a8707..d2cfc89111 100644 --- a/extensions/tf2/AMBuilder +++ b/extensions/tf2/AMBuilder @@ -4,19 +4,27 @@ import os if 'tf2' in SM.sdks: sdk = SM.sdks['tf2'] - binary = SM.HL2Library(builder, 'game.tf2.ext.' + sdk.ext, sdk) - binary.sources += [ - 'extension.cpp', - 'natives.cpp', - 'RegNatives.cpp', - 'util.cpp', - 'criticals.cpp', - 'holiday.cpp', - 'teleporter.cpp', - 'gameplayrules.cpp', - 'conditions.cpp', - '../../public/smsdk_ext.cpp', - '../../public/CDetour/detours.cpp', - '../../public/asm/asm.c' - ] - SM.extensions += [builder.Add(binary)] + for arch in SM.archs: + binary = SM.HL2Library(builder, 'game.tf2.ext.' + sdk.ext, sdk, arch) + binary.sources += [ + 'extension.cpp', + 'natives.cpp', + 'RegNatives.cpp', + 'util.cpp', + 'criticals.cpp', + 'holiday.cpp', + 'teleporter.cpp', + 'gameplayrules.cpp', + 'conditions.cpp', + '../../public/smsdk_ext.cpp', + '../../public/CDetour/detours.cpp', + '../../public/asm/asm.c', + '../../public/libudis86/decode.c', + '../../public/libudis86/itab.c', + '../../public/libudis86/syn-att.c', + '../../public/libudis86/syn-intel.c', + '../../public/libudis86/syn.c', + '../../public/libudis86/udis86.c', + ] + binary.compiler.defines += ['HAVE_STRING_H']; + SM.extensions += [builder.Add(binary)] diff --git a/extensions/topmenus/AMBuilder b/extensions/topmenus/AMBuilder index d901cf8024..61eb8b4fdb 100644 --- a/extensions/topmenus/AMBuilder +++ b/extensions/topmenus/AMBuilder @@ -1,21 +1,22 @@ # vim: set sts=2 ts=8 sw=2 tw=99 et ft=python: import os -binary = SM.ExtLibrary(builder, 'topmenus.ext') -binary.compiler.cxxincludes += [ - os.path.join(SM.mms_root, 'core', 'sourcehook'), -] -if binary.compiler.family == 'gcc' or binary.compiler.family == 'clang': - binary.compiler.cxxflags += ['-fno-rtti'] -elif binary.compiler.family == 'msvc': - binary.compiler.cxxflags += ['/GR-'] +for arch in SM.archs: + binary = SM.ExtLibrary(builder, 'topmenus.ext', arch) + binary.compiler.cxxincludes += [ + os.path.join(SM.mms_root, 'core', 'sourcehook'), + ] + if binary.compiler.family == 'gcc' or binary.compiler.family == 'clang': + binary.compiler.cxxflags += ['-fno-rtti'] + elif binary.compiler.family == 'msvc': + binary.compiler.cxxflags += ['/GR-'] -binary.sources += [ - 'extension.cpp', - 'smn_topmenus.cpp', - 'TopMenu.cpp', - 'TopMenuManager.cpp', - '../../public/smsdk_ext.cpp', -] + binary.sources += [ + 'extension.cpp', + 'smn_topmenus.cpp', + 'TopMenu.cpp', + 'TopMenuManager.cpp', + '../../public/smsdk_ext.cpp', + ] -SM.extensions += [builder.Add(binary)] + SM.extensions += [builder.Add(binary)] diff --git a/extensions/updater/AMBuilder b/extensions/updater/AMBuilder index 1ef40552a8..8c641e33bf 100644 --- a/extensions/updater/AMBuilder +++ b/extensions/updater/AMBuilder @@ -1,22 +1,23 @@ # vim: set sts=2 ts=8 sw=2 tw=99 et ft=python: import os -binary = SM.ExtLibrary(builder, 'updater.ext') -binary.compiler.cxxincludes += [ - os.path.join(SM.mms_root, 'core', 'sourcehook'), -] -if binary.compiler.family == 'gcc' or binary.compiler.family == 'clang': - binary.compiler.cxxflags += ['-fno-rtti'] -elif binary.compiler.family == 'msvc': - binary.compiler.cxxflags += ['/GR-'] +for arch in SM.archs: + binary = SM.ExtLibrary(builder, 'updater.ext', arch) + binary.compiler.cxxincludes += [ + os.path.join(SM.mms_root, 'core', 'sourcehook'), + ] + if binary.compiler.family == 'gcc' or binary.compiler.family == 'clang': + binary.compiler.cxxflags += ['-fno-rtti'] + elif binary.compiler.family == 'msvc': + binary.compiler.cxxflags += ['/GR-'] -binary.sources += [ - 'extension.cpp', - 'MemoryDownloader.cpp', - 'Updater.cpp', - 'md5.cpp', - '../../public/smsdk_ext.cpp' -] + binary.sources += [ + 'extension.cpp', + 'MemoryDownloader.cpp', + 'Updater.cpp', + 'md5.cpp', + '../../public/smsdk_ext.cpp' + ] -SM.extensions += [builder.Add(binary)] + SM.extensions += [builder.Add(binary)] diff --git a/gamedata/core.games/common.games.txt b/gamedata/core.games/common.games.txt index 6e49ca4580..26571fe75d 100644 --- a/gamedata/core.games/common.games.txt +++ b/gamedata/core.games/common.games.txt @@ -108,7 +108,9 @@ { "windows" "11" "linux" "12" + "linux64" "12" "mac" "12" + "mac64" "12" } } } diff --git a/gamedata/core.games/engine.csgo.txt b/gamedata/core.games/engine.csgo.txt index e52ad97b1a..3dc79005e9 100644 --- a/gamedata/core.games/engine.csgo.txt +++ b/gamedata/core.games/engine.csgo.txt @@ -31,12 +31,16 @@ "EntInfo" { "linux" "4" + "linux64" "8" + "mac64" "8" } /* Offset into LevelShutdown */ "gEntList" { "linux" "13" + "linux64" "13" + "mac64" "13" } } @@ -53,6 +57,8 @@ { "library" "server" "linux" "\xE8\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\xC7\x2A\x2A\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\xE8" + "linux64" "\xE8\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x48\x8B\x3D\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\xE8" + "mac64" "\xE8\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x48\x8D\x3D\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\xE8" } } } diff --git a/gamedata/sdkhooks.games/engine.csgo.txt b/gamedata/sdkhooks.games/engine.csgo.txt index 66a8fbb493..8b90b96b66 100644 --- a/gamedata/sdkhooks.games/engine.csgo.txt +++ b/gamedata/sdkhooks.games/engine.csgo.txt @@ -8,145 +8,169 @@ { "windows" "105" "linux" "106" - "mac" "106" + "linux64" "106" + "mac64" "106" } "EndTouch" { "windows" "103" "linux" "104" - "mac" "104" + "linux64" "104" + "mac64" "104" } "FireBullets" { "windows" "117" "linux" "118" - "mac" "118" + "linux64" "118" + "mac64" "118" } "GetMaxHealth" { "windows" "121" "linux" "122" - "mac" "122" + "linux64" "122" + "mac64" "122" } "GroundEntChanged" { "windows" "175" "linux" "177" - "mac" "177" + "linux64" "177" + "mac64" "177" } "OnTakeDamage" { "windows" "67" "linux" "68" - "mac" "68" + "linux64" "68" + "mac64" "68" } "OnTakeDamage_Alive" { "windows" "295" "linux" "296" - "mac" "296" + "linux64" "296" + "mac64" "296" } "PreThink" { "windows" "368" "linux" "369" - "mac" "369" + "linux64" "369" + "mac64" "369" } "PostThink" { "windows" "369" "linux" "370" - "mac" "370" + "linux64" "370" + "mac64" "370" } "Reload" { "windows" "306" "linux" "312" - "mac" "312" + "linux64" "312" + "mac64" "312" } "SetTransmit" { "windows" "22" "linux" "23" - "mac" "23" + "linux64" "23" + "mac64" "23" } "ShouldCollide" { "windows" "17" "linux" "18" - "mac" "18" + "linux64" "18" + "mac64" "18" } "Spawn" { "windows" "24" "linux" "25" - "mac" "25" + "linux64" "25" + "mac64" "25" } "StartTouch" { "windows" "101" "linux" "102" - "mac" "102" + "linux64" "102" + "mac64" "102" } "Think" { "windows" "51" "linux" "52" - "mac" "52" + "linux64" "52" + "mac64" "52" } "Touch" { "windows" "102" "linux" "103" - "mac" "103" + "linux64" "103" + "mac64" "103" } "TraceAttack" { "windows" "65" "linux" "66" - "mac" "66" + "linux64" "66" + "mac64" "66" } "Use" { "windows" "100" "linux" "101" - "mac" "101" + "linux64" "101" + "mac64" "101" } "VPhysicsUpdate" { "windows" "154" "linux" "155" - "mac" "155" + "linux64" "155" + "mac64" "155" } "Weapon_CanSwitchTo" { "windows" "287" "linux" "288" - "mac" "288" + "linux64" "288" + "mac64" "288" } "Weapon_CanUse" { "windows" "281" "linux" "282" - "mac" "282" + "linux64" "282" + "mac64" "282" } "Weapon_Drop" { "windows" "284" "linux" "285" - "mac" "285" + "linux64" "285" + "mac64" "285" } "Weapon_Equip" { "windows" "282" "linux" "283" - "mac" "283" + "linux64" "283" + "mac64" "283" } "Weapon_Switch" { "windows" "285" "linux" "286" - "mac" "286" + "linux64" "286" + "mac64" "286" } } } @@ -158,7 +182,8 @@ "EntityListeners" { "linux" "196644" - "mac" "196644" + "linux64" "393272" + "mac64" "393272" } } diff --git a/gamedata/sdktools.games/engine.csgo.txt b/gamedata/sdktools.games/engine.csgo.txt index 8ffcf98638..513d584367 100644 --- a/gamedata/sdktools.games/engine.csgo.txt +++ b/gamedata/sdktools.games/engine.csgo.txt @@ -33,21 +33,29 @@ { "windows" "4" "linux" "20" + "linux64" "18" + "mac64" "21" } "GetTEName" { "windows" "4" "linux" "4" + "linux64" "8" + "mac64" "8" } "GetTENext" { "windows" "8" "linux" "8" + "linux64" "16" + "mac64" "16" } "TE_GetServerClass" { "windows" "0" "linux" "0" + "linux64" "0" + "mac64" "0" } } @@ -58,6 +66,8 @@ "library" "server" "windows" "\x89\x41\x04\xA1\x2A\x2A\x2A\x2A\x89\x41\x08\x89\x0D\x2A\x2A\x2A\x2A\xC7" "linux" "\x55\x89\xE5\x8B\x45\x08\x8B\x55\x0C\xC7\x00\x2A\x2A\x2A\x2A\x89\x50\x04\x8B\x15\x2A\x2A\x2A\x2A" + "linux64" "\x48\x8D\x05\x2A\x2A\x2A\x2A\x55\x48\x89\x07\x48\x89\xE5\x5D\x48\x8B\x05\x2A\x2A\x2A\x2A" + "mac64" "\x55\x48\x89\xE5\x48\x8D\x05\x2A\x2A\x2A\x2A\x48\x89\x07\x48\x89\x77\x08\x48\x8B\x05\x2A\x2A\x2A\x2A" } } } @@ -73,6 +83,8 @@ "library" "server" // Fallback to IServerTools method instead on Windows, lest we add custom logic since it's no longer a thiscall on Windows in CS:GO "linux" "\x55\x89\xE5\x57\x56\x53\x83\xEC\x1C\x8B\x45\x0C\x8B\x5D\x08\x8B\x7D\x10\x85\xC0\x0F\x84\x2A\x2A\x2A\x2A\x8B\x10\x89\x04\x24\xFF\x52\x0C\x8B\x10\xB8\xFF\x1F\x00\x00\x0F\xB7\xCA\x83\xFA\xFF\x0F\x45\xC1\x8D\x04\x40\x8B\x5C\xC3\x10\xEB\x2A\x90\x2A\x2A\x2A\x2A\x89" + "linux64" "\x55\x48\x89\xE5\x41\x55\x49\x89\xD5\x41\x54\x53\x48\x89\xFB\x48\x83\xEC\x08\x48\x85\xF6\x0F\x84\xBC\x00\x00\x00" + "mac64" "\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x54\x53\x49\x89\xD7\x48\x89\xFB\x48\x85\xF6\x74\x29\x48\x8B\x06\x48\x89\xF7\xFF\x50\x18\x8B\x00\x83\xF8\xFF\x0F\xB7\xC0\xB9\xFF\x1F\x00\x00\x48\x0F\x45\xC8\x48\x8D\x04\x49\x48\xC1\xE0\x04\x48\x8D\x5C\x03\x20\xEB\x07\x48\x81\xC3\x08\x00\x06\x00\x48\x8B\x1B\x45\x31\xE4\x48\x85\xDB\x74\x58\x4C\x8D\x35\x2A\x2A\x2A\x2A\x0F" } } } @@ -102,6 +114,8 @@ */ "CreateFakeClient_Windows" "\x55\x8B\xEC\x56\xFF\x2A\x2A\xB9\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x8B" "CreateFakeClient_Linux" "\x55\x89\xE5\x53\x83\xEC\x14\x8B\x45\x0C\xC7\x04\x24\x2A\x2A\x2A\x2A" + "CreateFakeClient_Linux64" "\x55\x48\x89\xE5\x53\x48\x83\xEC\x08\x48\x8B\x3D\x2A\x2A\x2A\x2A\xE8" + "CreateFakeClient_Mac64" "\x55\x48\x89\xE5\x53\x50\x48\x8D\x3D\x2A\x2A\x2A\x2A\x48\x8B\x07\xFF\x90\x78" } "Offsets" @@ -111,6 +125,8 @@ { "windows" "8" "linux" "13" + "linux64" "12" + "mac64" "9" } } @@ -132,6 +148,8 @@ { "library" "server" "linux" "\x55\x89\xE5\x53\x83\xEC\x14\x8B\x5D\x08\xE8\x2A\x2A\x2A\x2A\x8B\x10\x89\x04\x24" + "linux64" "\x55\x48\x89\xE5\x53\x48\x89\xFB\x48\x83\xEC\x08\xE8\x2A\x2A\x2A\x2A\x48\x89\xDE\x48\x8B\x10\x48\x89\xC7\xFF\x52\x08" + "mac64" "\xE8\x2A\x2A\x2A\x2A\x48\x8B\x08\x48\x89\xC7\x4C\x89\xFE\xFF\x51\x08" } } @@ -144,6 +162,8 @@ "EntityFactoryCallOffset" { "linux" "11" + "linux64" "13" + "mac64" "1" } } } @@ -158,6 +178,8 @@ "library" "server" "windows" "\x55\x8B\xEC\x83\x2A\x2A\x81\xEC\x2A\x2A\x2A\x2A\x8B\xC1\x53\x56\x57\x8B\x2A\x2A\x89\x2A\x2A\x2A\x33" "linux" "\x55\x89\xE5\x57\x56\x53\x81\xEC\x7C\x01\x00\x00\x8B\x55\x08\x8B\x75\x14" + "linux64" "\x55\x48\x89\xE5\x41\x57\x41\x56\x49\x89\xF6\x41\x55\x41\x54\x49\x89\xCC\x53" + "mac64" "\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x55\x41\x54\x53\x48\x81\xEC\x88\x01\x00\x00\xF3\x0F\x11\x85\x8C\xFE\xFF\xFF" } } } @@ -178,7 +200,8 @@ /* Not 100% sure on this, why would windows change and not linux - TEST ME */ "windows" "31" "linux" "69" - "mac" "69" + "linux64" "69" + "mac64" "69" } /** * CBaseClient::SetName(char const*); @@ -189,7 +212,8 @@ { "windows" "30" "linux" "68" - "mac" "68" + "linux64" "68" + "mac64" "68" } /** * Offset into CBaseClient - Used by CBaseServer::UpdateUserSettings to determine when changes have been made. @@ -203,7 +227,8 @@ { "windows" "484" "linux" "464" - "mac" "464" + "linux64" "592" + "mac64" "608" } } } @@ -221,91 +246,106 @@ { "windows" "450" "linux" "451" - "mac" "451" + "linux64" "451" + "mac64" "451" } "RemovePlayerItem" { "windows" "293" "linux" "294" - "mac" "294" + "linux64" "294" + "mac64" "294" } "Weapon_GetSlot" { "windows" "289" "linux" "290" - "mac" "290" + "linux64" "290" + "mac64" "290" } "Ignite" { "windows" "223" "linux" "224" - "mac" "224" + "linux64" "224" + "mac64" "224" } "Extinguish" { "windows" "226" "linux" "227" - "mac" "227" + "linux64" "227" + "mac64" "227" } "Teleport" { "windows" "113" "linux" "114" - "mac" "114" + "linux64" "114" + "mac64" "114" } "CommitSuicide" { "windows" "500" "linux" "500" - "mac" "500" + "linux64" "500" + "mac64" "500" } "GetVelocity" { "windows" "138" "linux" "139" - "mac" "139" + "linux64" "139" + "mac64" "139" } "EyeAngles" { "windows" "129" "linux" "130" - "mac" "130" + "linux64" "130" + "mac64" "130" } "AcceptInput" { "windows" "40" "linux" "41" - "mac" "41" + "linux64" "41" + "mac64" "41" } "SetEntityModel" { "windows" "26" "linux" "27" - "mac" "27" + "linux64" "27" + "mac64" "27" } "WeaponEquip" { "windows" "282" "linux" "283" - "mac" "283" + "linux64" "283" + "mac64" "283" } "Activate" { "windows" "37" "linux" "38" - "mac" "38" + "linux64" "38" + "mac64" "38" } "PlayerRunCmd" { "windows" "470" "linux" "471" - "mac" "471" + "linux64" "471" + "mac64" "471" } "GiveAmmo" { "windows" "275" "linux" "276" - "mac" "276" + "linux64" "276" + "mac64" "276" } } } diff --git a/gamedata/sm-cstrike.games/game.csgo.txt b/gamedata/sm-cstrike.games/game.csgo.txt index efdf7ce2a3..4ad5594f6e 100644 --- a/gamedata/sm-cstrike.games/game.csgo.txt +++ b/gamedata/sm-cstrike.games/game.csgo.txt @@ -24,7 +24,8 @@ { "windows" "4" "linux" "4" - "mac" "4" + "linux64" "8" + "mac64" "8" } // In HandleCommand_Buy_Internal // -*(_DWORD *)(v34 + 204) @@ -32,46 +33,54 @@ { "windows" "204" "linux" "204" - "mac" "204" + "linux64" "324" + "mac64" "324" } //Offset into CheckRestartRound "CTTeamScoreOffset" { "windows" "98" "linux" "115" - "mac" "150" + "linux64" "117" + "mac64" "148" } //Offset into CheckRestartRound "TTeamScoreOffset" { "windows" "125" "linux" "148" - "mac" "185" + "linux64" "148" + "mac64" "177" } "ClanTagOffset" { "windows" "12" "linux" "29" - "mac" "22" + "linux64" "13" + "mac64" "12" } //Offset into HandleCommand_Buy_Internal "CCSPlayerInventoryOffset" { "windows" "60" "linux" "97" - "mac" "109" + "linux64" "108" + "mac64" "73" } "GetItemInLoadout" { "windows" "8" "linux" "9" "mac" "9" + "linux64" "9" + "mac64" "9" } "GetItemDefintionByName" //_ZN15CEconItemSchema23GetItemDefinitionByNameEPKc { "windows" "42" "linux" "41" - "mac" "41" + "linux64" "41" + "mac64" "41" } // Search for "%s (ID %llu) at backpack slot %d" (CCSPlayerInventory::DumpInventoryToConsole(bool)) // Jump to the vtable 2 functions above calls CCStrike15ItemDefinition::GetLoadoutSlot(CCStrike15ItemDefinition *this, int) @@ -80,7 +89,8 @@ { "windows" "588" "linux" "588" - "mac" "588" + "linux64" "908" + "mac64" "908" } // Offset into CEconItemSchema * to a hashmap of all itemdefs // Offset can be found in... GetItemDefinitionMutable (easy to get offset on windows should be the same) @@ -88,7 +98,8 @@ { "windows" "172" "linux" "172" - "mac" "172" + "linux64" "232" + "mac64" "232" } } "Signatures" @@ -98,42 +109,56 @@ "library" "server" "windows" "\xA1\x2A\x2A\x2A\x2A\x85\xC0\x75\x2A\xA1\x2A\x2A\x2A\x2A\x56\x68\x2A\x2A\x00\x00\x8B" "linux" "\x55\x89\xE5\x83\xEC\x08\xE8\x2A\x2A\x2A\x2A\xC9\x83\xC0\x04\xC3" + "linux64" "\x55\x48\x89\xE5\xE8\x2A\x2A\x2A\x2A\x5D\x48\x83\xC0\x08\xC3" + "mac64" "\x55\x48\x89\xE5\x41\x56\x53\x48\x8B\x1D\x2A\x2A\x2A\x2A\x48\x85\xDB\x75" } "RoundRespawn" { "library" "server" "windows" "\x55\x8B\xEC\x83\xEC\x0C\x53\x56\x8B\xF1\x8B\x0D\x2A\x2A\x2A\x2A\x57\x8B\x01" "linux" "\x55\x89\xE5\x57\x56\x53\x83\xEC\x4C\xA1\x2A\x2A\x2A\x2A\x8B\x5D\x08\x89\x04\x24" + "linux64" "\x55\x48\x89\xE5\x41\x56\x41\x55\x41\x54\x53\x48\x89\xFB\x48\x83\xEC\x10\x4C\x8B\x25" + "mac64" "\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x54\x53\x48\x83\xEC\x10\x49\x89\xFC\x4C\x8D\x3D" } "SwitchTeam" { "library" "server" "windows" "\x55\x8B\xEC\x83\xEC\x10\x53\x56\x8B\x75\x08\x57\x8B\xF9\x85\xF6\x0F\x88\x2A\x2A\x2A\x2A\x3B\x35" - "linux" "\x55\x89\xE5\x83\xEC\x68\x89\x75\xF8\x8B\x75\x0C\x89\x5D\xF4\x8B\x5D\x08\x89\x7D\xFC\x89\x34\x24\xE8\x2A\x2A\x2A\x2A\x85\xC0" + "linux" "55\x89\xE5\x83\xEC\x68\x89\x75\xF8\x8B\x75\x0C\x89\x5D\xF4\x8B\x5D\x08\x89\x7D\xFC\x89\x34\x24\xE8\x2A\x2A\x2A\x2A\x85\xC0" + "linux64" "\x55\x48\x89\xE5\x48\x89\x5D\xD8\x48\x89\xFB\x89\xF7\x4C\x89\x65\xE0\x41\x89\xF4" + "mac64" "\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x55\x41\x54\x53\x48\x83\xEC\x18\x89\xF3\x49\x89\xFC" } "HandleCommand_Buy_Internal"//Wildcard first 6 bytes for getting address for weapon price. { "library" "server" "windows" "\x2A\x2A\x2A\x2A\x2A\x2A\x83\xEC\x0C\x53\x56\x57\x6A\x01" "linux" "\x2A\x2A\x2A\x2A\x2A\x2A\x0F\xB6\x55\x14\x89\x75\xF8\x8B\x75\x08" + "linux64" "\x2A\x2A\x2A\x2A\x2A\x2A\x5D\xD8\xBB\x03\x00\x00\x00" + "mac64" "\x2A\x2A\x2A\x2A\x2A\x2A\x41\x56\x41\x55\x41\x54\x53\x48\x83\xEC\x58\x41\x89\xCF\x49\x89\xD4" } "CSWeaponDrop"//Wildcard first 6 bytes for CS:S DM (kept for backcompat with old SM versions) { "library" "server" "windows" "\x2A\x2A\x2A\x2A\x2A\x2A\x81\xEC\x2A\x2A\x2A\x2A\x53\x8B\x5D\x08\x56\x57\x6A\x00\x68" "linux" "\x2A\x2A\x2A\x2A\x2A\x2A\x56\x53\x81\xEC\x7C\x02\x00\x00\x8B\x5D\x0C\x8B\x75\x08\x85\xDB\x74\x2A\xC7\x44\x24\x2A\x2A\x2A\x2A\x00" + "linux64" "\x2A\x2A\x2A\x2A\x2A\x2A\x41\x56\x41\x55\x45\x31\xED\x41\x54\x49\x89\xFC\x53\x48\x89\xF3\x48\x81\xEC\xE8" + "mac64" "\x2A\x2A\x2A\x2A\x2A\x2A\x41\x56\x41\x55\x41\x54\x53\x48\x81\xEC\x78\x03\x00\x00\x49\x89\xF4" } "CSWeaponDropBB" //Revert back to using CSWeaponDrop(weapon, bool, bool) { "library" "server" "windows" "\x2A\x2A\x2A\x2A\x2A\x2A\x83\xE4\xF8\x83\xC4\x04\x55\x8B\x6B\x04\x89\x6C\x24\x04\x8B\xEC\x83\xEC\x34\x56" "linux" "\x2A\x2A\x2A\x2A\x2A\x2A\x83\xEC\x7C\x8B\x5D\x08\x0F\xB6\x7D\x14" + "linux64" "\x55\x48\x89\xE5\x48\x89\x5D\xE0\x48\x89\xFB\x4C\x89\x65\xE8\x49\x89\xF4\x4C\x89\x6D\xF0\x41\x89\xD5\x4C\x89\x75\xF8\x48\x83\xEC\x70" + "mac64" "\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x54\x53\x48\x83\xEC\x30\x41\x89\xCC\x41\x89\xD7" } "TerminateRound" { "library" "server" "windows" "\x55\x8B\xEC\x83\xE4\xF8\x83\xEC\x2A\x53\x8B\xD9\xF3\x0F\x2A\x2A\x2A\x2A\x56\x57\x89\x2A\x2A\x2A\x83\xBB" "linux" "\x55\x89\xE5\x57\x56\x53\x81\xEC\xBC\x00\x00\x00\x8B\x7D\x08\x8B\x9F" + "linux64" "\x55\x48\x89\xE5\x41\x57\x41\x56\x49\x89\xFE\x41\x55\x41\x54\x53\x48\x81\xEC\xE8" + "mac64" "\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x55\x41\x54\x53\x48\x81\xEC\x08\x01\x00\x00\x41\x89\xF6" } //In CS:GO this is actually CCSGameRules::CheckRestartRound(void) but to keep same gamedata as cs:s. "CheckWinLimit" @@ -141,18 +166,24 @@ "library" "server" "windows" "\x55\x8B\xEC\x83\xE4\xF8\x83\xEC\x2A\x53\x56\x57\x8B\xF9\x8B\x0D\x2A\x2A\x2A\x2A\x81\xF9" "linux" "\x55\x89\xE5\x56\x53\x83\xEC\x70\xA1\x2A\x2A\x2A\x2A\x8B\x35\x2A\x2A\x2A\x2A\x8B" + "linux64" "\x55\x48\x89\xE5\x41\x56\x41\x55\x41\x54\x53\x48\x89\xFB\x48\x83\xEC\x50\x4C\x8B\x25\x2A\x2A\x2A\x2A\x49" + "mac64" "\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x55\x41\x54\x53\x48\x83\xEC\x58\x49\x89\xFD\x48\x8B\x1D" } "SetClanTag" { "library" "server" "windows" "\x55\x8B\xEC\x8B\x55\x08\x85\xD2\x74\x2A\x8D\x81\x34\x25\x00\x00" "linux" "\x55\x89\xE5\x83\xEC\x18\x8B\x45\x0C\x85\xC0\x74\x2A\x89\x44\x24\x04\x8B\x45\x08\xC7\x44\x24\x08\x10\x00\x00\x00" + "linux64" "\x55\x48\x85\xF6\x48\x89\xE5\x74\x17\x5D\x48\x81\xC7\x2A\x2A\x2A\x2A\xBA\x10" + "mac64" "\x55\x48\x89\xE5\x48\x85\xF6\x74\x12\x48\x81\xC7\x2A\x2A\x2A\x2A\xBA\x10" } "SetModelFromClass" { "library" "server" "windows" "\x53\x56\x57\x8B\xF9\x8B\x87\x00\x03\x00\x00" "linux" "\x55\x89\xE5\x83\xEC\x28\x89\x5D\xF4\x8B\x5D\x08\x89\x75\xF8\x89\x7D\xFC\x89\x1C\x24\xE8\x2A\x2A\x2A\x2A\x83\xF8\x02" + "linux64" "\x55\x48\x89\xE5\x48\x89\x5D\xE0\x48\x89\xFB\x4C\x89\x65\xE8\x4C\x89\x6D\xF0\x4C\x89\x75\xF8\x48\x83\xEC\x20\xE8\x2A\x2A\x2A\x2A\x83\xF8\x02" + "mac64" "\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x54\x53\x49\x89\xFC\xE8\x2A\x2A\x2A\x2A\x83\xF8\x02" } //GetCCSWeaponData Found in HandleCommand_Buy_Internal //Uses an econitemview @@ -161,6 +192,8 @@ "library" "server" "windows" "\x85\xC9\x75\x2A\x33\xC0\xC3\xE8\x2A\x2A\x2A\x2A\x8B" "linux" "\x55\x89\xE5\x83\xEC\x18\x8B\x45\x08\x85\xC0\x74\x2A\x89\x04\x24" + "linux64" "\x55\x48\x85\xFF\x48\x89\xE5\x74\x17\xE8\x2A\x2A\x2A\x2A\x5D" + "mac64" "\x55\x48\x89\xE5\x41\x56\x53\x31\xC0\x48\x85\xFF\x74\x2E" } } } @@ -178,7 +211,8 @@ { "windows" "4" "linux" "4" - "mac" "4" + "linux64" "4" + "mac64" "4" } } } @@ -196,7 +230,8 @@ { "windows" "75" "linux" "75" - "mac" "75" + "linux64" "75" + "mac64" "75" } } } @@ -214,7 +249,8 @@ { "windows" "15" "linux" "15" - "mac" "15" + "linux64" "15" + "mac64" "15" } } } diff --git a/loader/AMBuilder b/loader/AMBuilder index 2db3a509e6..266c107e48 100644 --- a/loader/AMBuilder +++ b/loader/AMBuilder @@ -1,27 +1,31 @@ # vim: set sts=2 ts=8 sw=2 tw=99 et ft=python: import os.path -if builder.target.platform in ['windows', 'mac']: - name = 'sourcemod_mm' - extra_ldflags = [] -elif builder.target.platform == 'linux': - name = 'sourcemod_mm_i486' - extra_ldflags = ['-ldl'] +for arch in SM.archs: + if builder.target.platform in ['windows', 'mac']: + name = 'sourcemod_mm' + extra_ldflags = [] + elif builder.target.platform == 'linux': + name = 'sourcemod_mm_i486' + extra_ldflags = ['-ldl'] -binary = SM.Library(builder, name) -binary.compiler.cxxincludes += [ - os.path.join(SM.mms_root, 'core'), - os.path.join(SM.mms_root, 'sourcehook') -] -binary.compiler.defines += ['META_NO_HL2SDK'] -if binary.compiler.family == 'gcc' or binary.compiler.family == 'clang': - binary.compiler.cxxflags += ['-fno-rtti'] -elif binary.compiler.family == 'msvc': - binary.compiler.cxxflags += ['/GR-'] -binary.compiler.linkflags += extra_ldflags -binary.sources = [ - 'loader.cpp' -] + if arch == 'x64': + name = 'sourcemod_mm.x64' -nodes = builder.Add(binary) -SM.binaries += [nodes] + binary = SM.Library(builder, name, arch) + binary.compiler.cxxincludes += [ + os.path.join(SM.mms_root, 'core'), + os.path.join(SM.mms_root, 'sourcehook') + ] + binary.compiler.defines += ['META_NO_HL2SDK'] + if binary.compiler.family == 'gcc' or binary.compiler.family == 'clang': + binary.compiler.cxxflags += ['-fno-rtti'] + elif binary.compiler.family == 'msvc': + binary.compiler.cxxflags += ['/GR-'] + binary.compiler.linkflags += extra_ldflags + binary.sources = [ + 'loader.cpp' + ] + + nodes = builder.Add(binary) + SM.binaries += [nodes] diff --git a/loader/loader.cpp b/loader/loader.cpp index 48389445e5..9e2421712a 100644 --- a/loader/loader.cpp +++ b/loader/loader.cpp @@ -57,28 +57,34 @@ #include #endif +#if defined(_WIN64) || defined(__x86_64__) +#define PLATFORM_ARCH_FOLDER "x64" PATH_SEP_CHAR +#else +#define PLATFORM_ARCH_FOLDER "" +#endif + #define METAMOD_API_MAJOR 2 -#define FILENAME_1_6_EP2 "sourcemod.2.ep2" PLATFORM_EXT -#define FILENAME_1_6_EP1 "sourcemod.2.ep1" PLATFORM_EXT -#define FILENAME_1_6_L4D "sourcemod.2.l4d" PLATFORM_EXT -#define FILENAME_1_6_DARKM "sourcemod.2.darkm" PLATFORM_EXT -#define FILENAME_1_6_L4D2 "sourcemod.2.l4d2" PLATFORM_EXT -#define FILENAME_1_6_SWARM "sourcemod.2.swarm" PLATFORM_EXT -#define FILENAME_1_6_BGT "sourcemod.2.bgt" PLATFORM_EXT -#define FILENAME_1_6_EYE "sourcemod.2.eye" PLATFORM_EXT -#define FILENAME_1_6_PORTAL2 "sourcemod.2.portal2" PLATFORM_EXT -#define FILENAME_1_6_CSGO "sourcemod.2.csgo" PLATFORM_EXT -#define FILENAME_1_6_CSS "sourcemod.2.css" PLATFORM_EXT -#define FILENAME_1_6_HL2DM "sourcemod.2.hl2dm" PLATFORM_EXT -#define FILENAME_1_6_DODS "sourcemod.2.dods" PLATFORM_EXT -#define FILENAME_1_6_SDK2013 "sourcemod.2.sdk2013" PLATFORM_EXT -#define FILENAME_1_6_TF2 "sourcemod.2.tf2" PLATFORM_EXT -#define FILENAME_1_6_ND "sourcemod.2.nd" PLATFORM_EXT -#define FILENAME_1_6_BLADE "sourcemod.2.blade" PLATFORM_EXT -#define FILENAME_1_6_INSURGENCY "sourcemod.2.insurgency" PLATFORM_EXT -#define FILENAME_1_6_DOI "sourcemod.2.doi" PLATFORM_EXT -#define FILENAME_1_6_CONTAGION "sourcemod.2.contagion" PLATFORM_EXT -#define FILENAME_1_6_BMS "sourcemod.2.bms" PLATFORM_EXT +#define FILENAME_1_6_EP2 PLATFORM_ARCH_FOLDER "sourcemod.2.ep2" PLATFORM_EXT +#define FILENAME_1_6_EP1 PLATFORM_ARCH_FOLDER "sourcemod.2.ep1" PLATFORM_EXT +#define FILENAME_1_6_L4D PLATFORM_ARCH_FOLDER "sourcemod.2.l4d" PLATFORM_EXT +#define FILENAME_1_6_DARKM PLATFORM_ARCH_FOLDER "sourcemod.2.darkm" PLATFORM_EXT +#define FILENAME_1_6_L4D2 PLATFORM_ARCH_FOLDER "sourcemod.2.l4d2" PLATFORM_EXT +#define FILENAME_1_6_SWARM PLATFORM_ARCH_FOLDER "sourcemod.2.swarm" PLATFORM_EXT +#define FILENAME_1_6_BGT PLATFORM_ARCH_FOLDER "sourcemod.2.bgt" PLATFORM_EXT +#define FILENAME_1_6_EYE PLATFORM_ARCH_FOLDER "sourcemod.2.eye" PLATFORM_EXT +#define FILENAME_1_6_PORTAL2 PLATFORM_ARCH_FOLDER "sourcemod.2.portal2" PLATFORM_EXT +#define FILENAME_1_6_CSGO PLATFORM_ARCH_FOLDER "sourcemod.2.csgo" PLATFORM_EXT +#define FILENAME_1_6_CSS PLATFORM_ARCH_FOLDER "sourcemod.2.css" PLATFORM_EXT +#define FILENAME_1_6_HL2DM PLATFORM_ARCH_FOLDER "sourcemod.2.hl2dm" PLATFORM_EXT +#define FILENAME_1_6_DODS PLATFORM_ARCH_FOLDER "sourcemod.2.dods" PLATFORM_EXT +#define FILENAME_1_6_SDK2013 PLATFORM_ARCH_FOLDER "sourcemod.2.sdk2013" PLATFORM_EXT +#define FILENAME_1_6_TF2 PLATFORM_ARCH_FOLDER "sourcemod.2.tf2" PLATFORM_EXT +#define FILENAME_1_6_ND PLATFORM_ARCH_FOLDER "sourcemod.2.nd" PLATFORM_EXT +#define FILENAME_1_6_BLADE PLATFORM_ARCH_FOLDER "sourcemod.2.blade" PLATFORM_EXT +#define FILENAME_1_6_INSURGENCY PLATFORM_ARCH_FOLDER "sourcemod.2.insurgency" PLATFORM_EXT +#define FILENAME_1_6_DOI PLATFORM_ARCH_FOLDER "sourcemod.2.doi" PLATFORM_EXT +#define FILENAME_1_6_CONTAGION PLATFORM_ARCH_FOLDER "sourcemod.2.contagion" PLATFORM_EXT +#define FILENAME_1_6_BMS PLATFORM_ARCH_FOLDER "sourcemod.2.bms" PLATFORM_EXT HINSTANCE g_hCore = NULL; bool load_attempted = false; diff --git a/public/CDetour/detourhelpers.h b/public/CDetour/detourhelpers.h index 491a827fca..3231ed0b0a 100644 --- a/public/CDetour/detourhelpers.h +++ b/public/CDetour/detourhelpers.h @@ -41,6 +41,8 @@ #define PAGE_EXECUTE_READWRITE PROT_READ|PROT_WRITE|PROT_EXEC #endif +#include + struct patch_t { patch_t() @@ -68,13 +70,50 @@ inline void SetMemPatchable(void *address, size_t size) ProtectMemory(address, (int)size, PAGE_EXECUTE_READWRITE); } -inline void DoGatePatch(unsigned char *target, void *callback) +inline void PatchRelJump32(unsigned char *target, void *callback) +{ + SetMemPatchable(target, 5); + + // jmp <32-bit displacement> + target[0] = IA32_JMP_IMM32; + *(int32_t *)(&target[1]) = int32_t((unsigned char *)callback - (target + 5)); +} + +inline void PatchAbsJump64(unsigned char *target, void *callback) { - SetMemPatchable(target, 20); + int i = 0; + SetMemPatchable(target, 14); + + // push ; allocates 64-bit stack space on x64 + // mov [rsp+4], ; unnecessary if upper bits are 0 + // ret ; jump to address on stack + target[i++] = IA32_PUSH_IMM32; + *(int32_t *)(&target[i]) = int32_t(int64_t(callback)); + i += 4; + if ((int64_t(callback) >> 32) != 0) + { + target[i++] = IA32_MOV_RM_IMM32; + target[i++] = ia32_modrm(MOD_DISP8, 0, kREG_SIB); + target[i++] = ia32_sib(NOSCALE, kREG_NOIDX, kREG_ESP); + target[i++] = 0x04; + *(int32_t *)(&target[i]) = (int64_t(callback) >> 32); + i += 4; + } + target[i] = IA32_RET; +} - target[0] = 0xFF; /* JMP */ - target[1] = 0x25; /* MEM32 */ - *(void **)(&target[2]) = callback; +inline void DoGatePatch(unsigned char *target, void *callback) +{ +#if defined(_WIN64) || defined(__x86_64__) + int64_t diff = int64_t(callback) - (int64_t(target) + 5); + int32_t upperBits = (diff >> 32); + if (upperBits == 0 || upperBits == -1) + PatchRelJump32(target, callback); + else + PatchAbsJump64(target, callback); +#else + PatchRelJump32(target, callback); +#endif } inline void ApplyPatch(void *address, int offset, const patch_t *patch, patch_t *restore) diff --git a/public/CDetour/detours.cpp b/public/CDetour/detours.cpp index a82777c204..99f2ad5702 100644 --- a/public/CDetour/detours.cpp +++ b/public/CDetour/detours.cpp @@ -35,6 +35,58 @@ ISourcePawnEngine *CDetourManager::spengine = NULL; IGameConfig *CDetourManager::gameconf = NULL; +// Push 64-bit value onto the stack using two instructions. +// +// Pushing 0xF00DF00DF00DF00D: +// push 0xF00DF00D +// mov [rsp+4], 0xF00DF00D +static inline void X64_Push_Imm64(JitWriter *jit, jit_int64_t val) +{ + jit->write_ubyte(IA32_PUSH_IMM32); + jit->write_int32(jit_int32_t(val)); + if ((val >> 32) != 0) + IA32_Mov_ESP_Disp8_Imm32(jit, 4, (val >> 32)); +} + +// Jump to absolute 64-bit address using multiple instructions. +// +// Jumping to address 0xF00DF00DF00DF00D: +// push 0xF00DF00D +// mov [rsp+4], 0xF00DF00D +// ret +static inline void X64_Jump_Abs(JitWriter *jit, void *dest) +{ + X64_Push_Imm64(jit, jit_int64_t(dest)); + IA32_Return(jit); +} + +static inline void RelativeJump32(JitWriter *jit, void *target) +{ + jitoffs_t call = IA32_Jump_Imm32(jit, 0); + IA32_Write_Jump32_Abs(jit, call, target); +} + +#if defined(_WIN64) || defined(__x86_64__) +static inline bool IsShortJump(JitWriter *jit, void *target) +{ + int64_t diff = int64_t(target) - (int64_t(jit->outbase) + jit->get_outputpos() + OP_JMP_SIZE); + int32_t upperBits = (diff >> 32); + return upperBits == 0 || upperBits == -1; +} +#endif + +static inline void AbsJump(JitWriter *jit, void *target) +{ +#if defined(_WIN64) || defined(__x86_64__) + if (IsShortJump(jit, target)) + RelativeJump32(jit, target); + else + X64_Jump_Abs(jit, target); +#else + RelativeJump32(jit, target); +#endif +} + void CDetourManager::Init(ISourcePawnEngine *spengine, IGameConfig *gameconf) { CDetourManager::spengine = spengine; @@ -147,13 +199,12 @@ bool CDetour::CreateDetour() return false; } - detour_restore.bytes = copy_bytes((unsigned char *)detour_address, NULL, OP_JMP_SIZE+1); - - /* First, save restore bits */ - for (size_t i=0; i #define SMINTERFACE_SOURCEMOD_NAME "ISourceMod" -#define SMINTERFACE_SOURCEMOD_VERSION 13 +#define SMINTERFACE_SOURCEMOD_VERSION 14 /** * @brief Forward declaration of the KeyValues class. @@ -318,6 +318,20 @@ namespace SourceMod * @return True if a map is currently running, otherwise false. */ virtual bool IsMapRunning() = 0; + + /** + * @brief Converts 32-bit pseudo address to memory address on 64-bit platforms. + * + * @return Memory address, or nullptr if pseudo address could not be converted. + */ + virtual void *FromPseudoAddress(uint32_t pseudoAddr) = 0; + + /** + * @brief Converts memory address to 32-bit pseudo address on 64-bit platforms. + * + * @return Pseudo address, or 0 if memory address could not be converted. + */ + virtual uint32_t ToPseudoAddress(void *addr) = 0; }; } diff --git a/public/asm/asm.c b/public/asm/asm.c index da4474799f..d40b6b7f8f 100644 --- a/public/asm/asm.c +++ b/public/asm/asm.c @@ -1,11 +1,13 @@ #include "asm.h" +#include "libudis86/udis86.h" #ifndef WIN32 #define _GNU_SOURCE #include #include #include -#include + +#include "libudis86/udis86.h" #define REG_EAX 0 #define REG_ECX 1 @@ -25,7 +27,9 @@ */ void check_thunks(unsigned char *dest, unsigned char *pc) { -#ifndef WIN32 +#if defined(_WIN32) || defined(__x86_64__) + return; +#else /* Step write address back 4 to the start of the function address */ unsigned char *writeaddr = dest - 4; unsigned char *calloffset = *(unsigned char **)writeaddr; @@ -85,6 +89,59 @@ void check_thunks(unsigned char *dest, unsigned char *pc) #endif } +int copy_bytes(unsigned char *func, unsigned char *dest, int required_len) +{ + ud_t ud_obj; + ud_init(&ud_obj); + +#if defined(_WIN64) || defined(__x86_64__) + ud_set_mode(&ud_obj, 64); +#else + ud_set_mode(&ud_obj, 32); +#endif + + ud_set_input_buffer(&ud_obj, func, 20); + unsigned int bytecount = 0; + + while (bytecount < required_len && ud_disassemble(&ud_obj)) + { + unsigned int insn_len = ud_insn_len(&ud_obj); + bytecount += insn_len; + + if (dest) + { + const uint8_t *opcode = ud_insn_ptr(&ud_obj); + if ((opcode[0] & 0xFE) == 0xE8) // Fix CALL/JMP offset + { + dest[0] = func[0]; + dest++; func++; + if (ud_insn_opr(&ud_obj, 0)->size == 32) + { + *(int32_t *)dest = func + *(int32_t *)func - dest; + check_thunks(dest+4, func+4); + dest += sizeof(int32_t); + } + else + { + *(int16_t *)dest = func + *(int16_t *)func - dest; + dest += sizeof(int16_t); + } + func--; + } + else + { + memcpy(dest, func, insn_len); + dest += insn_len; + } + } + + func += insn_len; + } + + return bytecount; +} + +#if 0 //if dest is NULL, returns minimum number of bytes needed to be copied //if dest is not NULL, it will copy the bytes to dest as well as fix CALLs and JMPs //http://www.devmaster.net/forums/showthread.php?t=2311 @@ -336,6 +393,7 @@ int copy_bytes(unsigned char *func, unsigned char* dest, int required_len) { return bytecount; } +#endif //insert a specific JMP instruction at the given location void inject_jmp(void* src, void* dest) { diff --git a/public/asm/asm.h b/public/asm/asm.h index 608623230a..5176a7c9cc 100644 --- a/public/asm/asm.h +++ b/public/asm/asm.h @@ -3,6 +3,7 @@ #define OP_JMP 0xE9 #define OP_JMP_SIZE 5 +#define X64_ABS_SIZE 14 #define OP_NOP 0x90 #define OP_NOP_SIZE 1 diff --git a/public/extensions/IBinTools.h b/public/extensions/IBinTools.h index a2a81febc0..ee34aaadf5 100644 --- a/public/extensions/IBinTools.h +++ b/public/extensions/IBinTools.h @@ -36,20 +36,7 @@ #define SMINTERFACE_BINTOOLS_NAME "IBinTools" -#define SMINTERFACE_BINTOOLS_VERSION 3 - -#if defined METAMOD_PLAPI_VERSION -#ifndef HOOKING_ENABLED -#define HOOKING_ENABLED -#endif -#endif - -#if defined HOOKING_ENABLED -#include - -#define SMINTERFACE_BINTOOLS2_NAME "IBinTools2" -#define SMINTERFACE_BINTOOLS2_VERSION 1 -#endif +#define SMINTERFACE_BINTOOLS_VERSION 4 /** * @brief Function calling encoding utilities @@ -82,15 +69,42 @@ namespace SourceMod #define PASSFLAG_ODTOR (1<<2) /**< Object has a destructor */ #define PASSFLAG_OCTOR (1<<3) /**< Object has a constructor */ #define PASSFLAG_OASSIGNOP (1<<4) /**< Object has an assignment operator */ + #define PASSFLAG_OCOPYCTOR (1<<5) /**< Object has non-trivial copy constructor */ + #define PASSFLAG_OUNALIGN (1<<6) /**< Object contains unaligned fields */ + + #define FNFLAG_VARARGS (1<<0) /**< Function has variable arguments */ + + enum class ObjectField + { + Boolean, + Int8, + Int16, + Int32, + Int64, + Pointer, + Float, + Double + }; /** * @brief Parameter passing information */ struct PassInfo { + PassInfo() : fields(nullptr), numFields(0) + { } + + PassInfo(PassType type, unsigned int flags, size_t size, ObjectField *fields, unsigned int numFields) + : type(type), flags(flags), size(size), fields(fields), numFields(numFields) + { } + PassType type; /**< PassType value */ unsigned int flags; /**< Pass/return flags */ size_t size; /**< Size of the data being passed */ + ObjectField *fields; /**< List of fields for PassType_Object. + Can be ignored if size of object is > 16 bytes */ + unsigned int numFields; /**< Number of object fields. + Can be ignored if size of object is > 16 bytes */ }; /** @@ -149,109 +163,13 @@ namespace SourceMod * @brief Destroys all resources used by this object. */ virtual void Destroy() =0; - -#if defined HOOKING_ENABLED - - /** - * @brief Gets the Return type info. - * - * @return A PassInfo pointer. - */ - virtual const SourceHook::PassInfo *GetSHReturnInfo() =0; - - /** - * @brief Returns the calling convention. - * - * @return CallConvention value. - */ - virtual SourceHook::ProtoInfo::CallConvention GetSHCallConvention() =0; - - /** - * @brief Returns parameter info. - * - * @param num Parameter number to get (starting from 0). - * @return A PassInfo pointer. - */ - virtual const SourceHook::PassInfo *GetSHParamInfo(unsigned int num) =0; - - /** - * @brief Returns the offset of a given param. - * - * @param num Parameter number to get (starting from 0). - * @return Parameter offset. - */ - virtual unsigned int GetParamOffset(unsigned int num) =0; - -#endif - }; - -#if defined HOOKING_ENABLED - - /** - * @brief Delegate object that intermediates between SourceHook and the callback function. - */ - class ISMDelegate : public SourceHook::ISHDelegate - { - private: - /** - * @brief Internally used callback function - Do not call! - */ - virtual void Call() =0; /**< Do not call */ - public: - /** - * @brief Retrieves the User data buffer. - * - * @return User data pointer. - */ - virtual void *GetUserData() =0; - }; - - /** - * @brief Wrapper around a virtual hook. - */ - class IHookWrapper - { - public: - /** - * @brief Creates a hook delegate to pass to SourceHook. - * - * @param data User data pointer. - * @return A new ISMDelegate for the hook. - */ - virtual ISMDelegate *CreateDelegate(void *data) =0; - - /** - * @brief Gets the number of params in the hooked function. - * - * @return Number of params. - */ - virtual unsigned int GetParamCount() =0; - - /** - * @brief Returns the offset of a given param. - * - * @param argnum Parameter number from 0 to GetParamCount-1. - * @param size Optional buffer to store the size of the param. - * @return Parameter offset or -1 on error. - */ - virtual unsigned int GetParamOffset(unsigned int argnum, unsigned int *size) =0; - - /** - * @brief Initiates a recall on the function. - * - * @param params Parameter buffer. - * @param retval Buffer to store the return value in. - */ - virtual void PerformRecall(void *params, void *retval) =0; - + /** - * @brief Destroys this HookWrapper. + * @brief Returns the function's flags. */ - virtual void Destroy() =0; + virtual unsigned int GetFunctionFlags() =0; }; -#endif - /** * @brief Binary tools interface. */ @@ -280,13 +198,15 @@ namespace SourceMod * @param retInfo Return type information, or NULL for void. * @param paramInfo Array of parameters. * @param numParams Number of parameters in the array. + * @param fnFlags Function flags. See FNFLAG_* above. * @return A new ICallWrapper function. */ virtual ICallWrapper *CreateCall(void *address, CallConvention cv, const PassInfo *retInfo, const PassInfo paramInfo[], - unsigned int numParams) =0; + unsigned int numParams, + unsigned int fnFlags=0) =0; /** * @brief Creates a vtable call decoder. @@ -302,6 +222,7 @@ namespace SourceMod * @param retInfo Return type information, or NULL for void. * @param paramInfo Array of parameters. * @param numParams Number of parameters in the array. + * @param fnFlags Function flags. See FNFLAG_* above. * @return A new ICallWrapper function. */ virtual ICallWrapper *CreateVCall(unsigned int vtblIdx, @@ -309,84 +230,10 @@ namespace SourceMod unsigned int thisOffs, const PassInfo *retInfo, const PassInfo paramInfo[], - unsigned int numParams) =0; + unsigned int numParams, + unsigned int fnFlags=0) =0; }; -#if defined HOOKING_ENABLED - - /** - * @brief Binary tools interface. - */ - class IBinTools2 : public SMInterface - { - public: - virtual const char *GetInterfaceName() - { - return SMINTERFACE_BINTOOLS2_NAME; - } - virtual unsigned int GetInterfaceVersion() - { - return SMINTERFACE_BINTOOLS2_VERSION; - } - public: - - /** - * @brief Creates a call decoder. - * - * Note: CallConv_ThisCall requires an implicit first parameter - * of PassType_Basic / PASSFLAG_BYVAL / sizeof(void *). However, - * this should only be given to the Execute() function, and never - * listed in the paramInfo array. - * - * @param address Address to use as a call. - * @param protoInfo Parameter type information. - * @return A new ICallWrapper function. - */ - virtual ICallWrapper *CreateCall(void *address, - const SourceHook::ProtoInfo *protoInfo) =0; - - /** - * @brief Creates a vtable call decoder. - * - * Note: CallConv_ThisCall requires an implicit first parameter - * of PassType_Basic / PASSFLAG_BYVAL / sizeof(void *). However, - * this should only be given to the Execute() function, and never - * listed in the paramInfo array. - * - * @param protoInfo Parameter type information. - * @param info Function offset information. - * @return A new ICallWrapper function. - */ - virtual ICallWrapper *CreateVirtualCall(const SourceHook::ProtoInfo *protoInfo, - const SourceHook::MemFuncInfo *info) =0; - - - /** - * @brief Callback function pointer for Virtual Hooks. - * - * @param wrapper Call wrapper for this hook. - * @param deleg Delegate for this call. - * @param params Array of parameters. - * @param ret Storage buffer for the return value. - */ - typedef void (*VIRTUAL_HOOK_PROTO)(IHookWrapper *wrapper, ISMDelegate *deleg, void *params, void *ret); - - /** - * @brief Creates a hook on a virtual function. - * - * @param pSH Global SourceHook pointer. - * @param protoInfo Parameter type information. - * @param info Function offset information. - * @param f Callback function pointer. - */ - virtual IHookWrapper *CreateVirtualHook(SourceHook::ISourceHook *pSH, - const SourceHook::ProtoInfo *protoInfo, - const SourceHook::MemFuncInfo *info, - VIRTUAL_HOOK_PROTO f) =0; - }; - -#endif - } #endif //_INCLUDE_SMEXT_BINTOOLS_H_ diff --git a/public/jit/jit_helpers.h b/public/jit/jit_helpers.h index 406bc872e8..61ee263227 100644 --- a/public/jit/jit_helpers.h +++ b/public/jit/jit_helpers.h @@ -115,6 +115,22 @@ class JitWriter } outptr += sizeof(jit_uint32_t); } + inline void write_int64(jit_int64_t c) + { + if (outbase) + { + *(jit_int64_t *)outptr = c; + } + outptr += sizeof(jit_int64_t); + } + inline void write_uint64(jit_uint64_t c) + { + if (outbase) + { + *(jit_uint64_t *)outptr = c; + } + outptr += sizeof(jit_uint64_t); + } inline jitoffs_t get_outputpos() { return (outptr - outbase); diff --git a/public/jit/x86/x86_macros.h b/public/jit/x86/x86_macros.h index 1e62b761fc..01561d6033 100644 --- a/public/jit/x86/x86_macros.h +++ b/public/jit/x86/x86_macros.h @@ -102,6 +102,7 @@ const jit_uint8_t kREG_EDI = 7; #define IA32_MOV_RM_REG 0x89 // encoding is /r #define IA32_MOV_REG8_RM8 0x8A // encoding is /r #define IA32_MOV_REG_RM 0x8B // encoding is /r +#define IA32_MOV_RM_IMM32 0xC7 // encoding is /0 #define IA32_LEA_REG_MEM 0x8D // encoding is /r #define IA32_MOVSB 0xA4 // no extra encoding #define IA32_MOVSD 0xA5 // no extra encoding @@ -465,5 +466,14 @@ inline jitoffs_t IA32_Jump_Imm32(JitWriter *jit, jit_int32_t disp) return ptr; } +inline void IA32_Mov_ESP_Disp8_Imm32(JitWriter *jit, jit_int8_t disp8, jit_int32_t val) +{ + jit->write_ubyte(IA32_MOV_RM_IMM32); + jit->write_ubyte(ia32_modrm(MOD_DISP8, 0, kREG_SIB)); + jit->write_ubyte(ia32_sib(NOSCALE, kREG_NOIDX, kREG_ESP)); + jit->write_byte(disp8); + jit->write_int32(val); +} + #endif //_INCLUDE_JIT_X86_MACROS_H diff --git a/public/libudis86/decode.c b/public/libudis86/decode.c new file mode 100644 index 0000000000..afe044a694 --- /dev/null +++ b/public/libudis86/decode.c @@ -0,0 +1,1112 @@ +/* udis86 - libudis86/decode.c + * + * Copyright (c) 2002-2009 Vivek Thampi + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "udint.h" +#include "types.h" +#include "decode.h" + +#ifndef __UD_STANDALONE__ +# include +#endif /* __UD_STANDALONE__ */ + +/* The max number of prefixes to an instruction */ +#define MAX_PREFIXES 15 + +/* rex prefix bits */ +#define REX_W(r) ( ( 0xF & ( r ) ) >> 3 ) +#define REX_R(r) ( ( 0x7 & ( r ) ) >> 2 ) +#define REX_X(r) ( ( 0x3 & ( r ) ) >> 1 ) +#define REX_B(r) ( ( 0x1 & ( r ) ) >> 0 ) +#define REX_PFX_MASK(n) ( ( P_REXW(n) << 3 ) | \ + ( P_REXR(n) << 2 ) | \ + ( P_REXX(n) << 1 ) | \ + ( P_REXB(n) << 0 ) ) + +/* scable-index-base bits */ +#define SIB_S(b) ( ( b ) >> 6 ) +#define SIB_I(b) ( ( ( b ) >> 3 ) & 7 ) +#define SIB_B(b) ( ( b ) & 7 ) + +/* modrm bits */ +#define MODRM_REG(b) ( ( ( b ) >> 3 ) & 7 ) +#define MODRM_NNN(b) ( ( ( b ) >> 3 ) & 7 ) +#define MODRM_MOD(b) ( ( ( b ) >> 6 ) & 3 ) +#define MODRM_RM(b) ( ( b ) & 7 ) + +static int decode_ext(struct ud *u, uint16_t ptr); + +enum reg_class { /* register classes */ + REGCLASS_GPR, + REGCLASS_MMX, + REGCLASS_CR, + REGCLASS_DB, + REGCLASS_SEG, + REGCLASS_XMM +}; + + /* + * inp_start + * Should be called before each de-code operation. + */ +static void +inp_start(struct ud *u) +{ + u->inp_ctr = 0; +} + + +static uint8_t +inp_next(struct ud *u) +{ + if (u->inp_end == 0) { + if (u->inp_buf != NULL) { + if (u->inp_buf_index < u->inp_buf_size) { + u->inp_ctr++; + return (u->inp_curr = u->inp_buf[u->inp_buf_index++]); + } + } else { + int c; + if ((c = u->inp_hook(u)) != UD_EOI) { + u->inp_curr = c; + u->inp_sess[u->inp_ctr++] = u->inp_curr; + return u->inp_curr; + } + } + } + u->inp_end = 1; + UDERR(u, "byte expected, eoi received\n"); + return 0; +} + +static uint8_t +inp_curr(struct ud *u) +{ + return u->inp_curr; +} + + +/* + * inp_uint8 + * int_uint16 + * int_uint32 + * int_uint64 + * Load little-endian values from input + */ +static uint8_t +inp_uint8(struct ud* u) +{ + return inp_next(u); +} + +static uint16_t +inp_uint16(struct ud* u) +{ + uint16_t r, ret; + + ret = inp_next(u); + r = inp_next(u); + return ret | (r << 8); +} + +static uint32_t +inp_uint32(struct ud* u) +{ + uint32_t r, ret; + + ret = inp_next(u); + r = inp_next(u); + ret = ret | (r << 8); + r = inp_next(u); + ret = ret | (r << 16); + r = inp_next(u); + return ret | (r << 24); +} + +static uint64_t +inp_uint64(struct ud* u) +{ + uint64_t r, ret; + + ret = inp_next(u); + r = inp_next(u); + ret = ret | (r << 8); + r = inp_next(u); + ret = ret | (r << 16); + r = inp_next(u); + ret = ret | (r << 24); + r = inp_next(u); + ret = ret | (r << 32); + r = inp_next(u); + ret = ret | (r << 40); + r = inp_next(u); + ret = ret | (r << 48); + r = inp_next(u); + return ret | (r << 56); +} + + +static inline int +eff_opr_mode(int dis_mode, int rex_w, int pfx_opr) +{ + if (dis_mode == 64) { + return rex_w ? 64 : (pfx_opr ? 16 : 32); + } else if (dis_mode == 32) { + return pfx_opr ? 16 : 32; + } else { + UD_ASSERT(dis_mode == 16); + return pfx_opr ? 32 : 16; + } +} + + +static inline int +eff_adr_mode(int dis_mode, int pfx_adr) +{ + if (dis_mode == 64) { + return pfx_adr ? 32 : 64; + } else if (dis_mode == 32) { + return pfx_adr ? 16 : 32; + } else { + UD_ASSERT(dis_mode == 16); + return pfx_adr ? 32 : 16; + } +} + + +/* + * decode_prefixes + * + * Extracts instruction prefixes. + */ +static int +decode_prefixes(struct ud *u) +{ + int done = 0; + uint8_t curr = 0, last = 0; + UD_RETURN_ON_ERROR(u); + + do { + last = curr; + curr = inp_next(u); + UD_RETURN_ON_ERROR(u); + if (u->inp_ctr == MAX_INSN_LENGTH) { + UD_RETURN_WITH_ERROR(u, "max instruction length"); + } + + switch (curr) + { + case 0x2E: + u->pfx_seg = UD_R_CS; + break; + case 0x36: + u->pfx_seg = UD_R_SS; + break; + case 0x3E: + u->pfx_seg = UD_R_DS; + break; + case 0x26: + u->pfx_seg = UD_R_ES; + break; + case 0x64: + u->pfx_seg = UD_R_FS; + break; + case 0x65: + u->pfx_seg = UD_R_GS; + break; + case 0x67: /* adress-size override prefix */ + u->pfx_adr = 0x67; + break; + case 0xF0: + u->pfx_lock = 0xF0; + break; + case 0x66: + u->pfx_opr = 0x66; + break; + case 0xF2: + u->pfx_str = 0xf2; + break; + case 0xF3: + u->pfx_str = 0xf3; + break; + default: + /* consume if rex */ + done = (u->dis_mode == 64 && (curr & 0xF0) == 0x40) ? 0 : 1; + break; + } + } while (!done); + /* rex prefixes in 64bit mode, must be the last prefix */ + if (u->dis_mode == 64 && (last & 0xF0) == 0x40) { + u->pfx_rex = last; + } + return 0; +} + + +static inline unsigned int modrm( struct ud * u ) +{ + if ( !u->have_modrm ) { + u->modrm = inp_next( u ); + u->have_modrm = 1; + } + return u->modrm; +} + + +static unsigned int +resolve_operand_size( const struct ud * u, unsigned int s ) +{ + switch ( s ) + { + case SZ_V: + return ( u->opr_mode ); + case SZ_Z: + return ( u->opr_mode == 16 ) ? 16 : 32; + case SZ_Y: + return ( u->opr_mode == 16 ) ? 32 : u->opr_mode; + case SZ_RDQ: + return ( u->dis_mode == 64 ) ? 64 : 32; + default: + return s; + } +} + + +static int resolve_mnemonic( struct ud* u ) +{ + /* resolve 3dnow weirdness. */ + if ( u->mnemonic == UD_I3dnow ) { + u->mnemonic = ud_itab[ u->le->table[ inp_curr( u ) ] ].mnemonic; + } + /* SWAPGS is only valid in 64bits mode */ + if ( u->mnemonic == UD_Iswapgs && u->dis_mode != 64 ) { + UDERR(u, "swapgs invalid in 64bits mode\n"); + return -1; + } + + if (u->mnemonic == UD_Ixchg) { + if ((u->operand[0].type == UD_OP_REG && u->operand[0].base == UD_R_AX && + u->operand[1].type == UD_OP_REG && u->operand[1].base == UD_R_AX) || + (u->operand[0].type == UD_OP_REG && u->operand[0].base == UD_R_EAX && + u->operand[1].type == UD_OP_REG && u->operand[1].base == UD_R_EAX)) { + u->operand[0].type = UD_NONE; + u->operand[1].type = UD_NONE; + u->mnemonic = UD_Inop; + } + } + + if (u->mnemonic == UD_Inop && u->pfx_repe) { + u->pfx_repe = 0; + u->mnemonic = UD_Ipause; + } + return 0; +} + + +/* ----------------------------------------------------------------------------- + * decode_a()- Decodes operands of the type seg:offset + * ----------------------------------------------------------------------------- + */ +static void +decode_a(struct ud* u, struct ud_operand *op) +{ + if (u->opr_mode == 16) { + /* seg16:off16 */ + op->type = UD_OP_PTR; + op->size = 32; + op->lval.ptr.off = inp_uint16(u); + op->lval.ptr.seg = inp_uint16(u); + } else { + /* seg16:off32 */ + op->type = UD_OP_PTR; + op->size = 48; + op->lval.ptr.off = inp_uint32(u); + op->lval.ptr.seg = inp_uint16(u); + } +} + +/* ----------------------------------------------------------------------------- + * decode_gpr() - Returns decoded General Purpose Register + * ----------------------------------------------------------------------------- + */ +static enum ud_type +decode_gpr(register struct ud* u, unsigned int s, unsigned char rm) +{ + switch (s) { + case 64: + return UD_R_RAX + rm; + case 32: + return UD_R_EAX + rm; + case 16: + return UD_R_AX + rm; + case 8: + if (u->dis_mode == 64 && u->pfx_rex) { + if (rm >= 4) + return UD_R_SPL + (rm-4); + return UD_R_AL + rm; + } else return UD_R_AL + rm; + case 0: + /* invalid size in case of a decode error */ + UD_ASSERT(u->error); + return UD_NONE; + default: + UD_ASSERT(!"invalid operand size"); + return UD_NONE; + } +} + +static void +decode_reg(struct ud *u, + struct ud_operand *opr, + int type, + int num, + int size) +{ + int reg; + size = resolve_operand_size(u, size); + switch (type) { + case REGCLASS_GPR : reg = decode_gpr(u, size, num); break; + case REGCLASS_MMX : reg = UD_R_MM0 + (num & 7); break; + case REGCLASS_XMM : reg = UD_R_XMM0 + num; break; + case REGCLASS_CR : reg = UD_R_CR0 + num; break; + case REGCLASS_DB : reg = UD_R_DR0 + num; break; + case REGCLASS_SEG : { + /* + * Only 6 segment registers, anything else is an error. + */ + if ((num & 7) > 5) { + UDERR(u, "invalid segment register value\n"); + return; + } else { + reg = UD_R_ES + (num & 7); + } + break; + } + default: + UD_ASSERT(!"invalid register type"); + return; + } + opr->type = UD_OP_REG; + opr->base = reg; + opr->size = size; +} + + +/* + * decode_imm + * + * Decode Immediate values. + */ +static void +decode_imm(struct ud* u, unsigned int size, struct ud_operand *op) +{ + op->size = resolve_operand_size(u, size); + op->type = UD_OP_IMM; + + switch (op->size) { + case 8: op->lval.sbyte = inp_uint8(u); break; + case 16: op->lval.uword = inp_uint16(u); break; + case 32: op->lval.udword = inp_uint32(u); break; + case 64: op->lval.uqword = inp_uint64(u); break; + default: return; + } +} + + +/* + * decode_mem_disp + * + * Decode mem address displacement. + */ +static void +decode_mem_disp(struct ud* u, unsigned int size, struct ud_operand *op) +{ + switch (size) { + case 8: + op->offset = 8; + op->lval.ubyte = inp_uint8(u); + break; + case 16: + op->offset = 16; + op->lval.uword = inp_uint16(u); + break; + case 32: + op->offset = 32; + op->lval.udword = inp_uint32(u); + break; + case 64: + op->offset = 64; + op->lval.uqword = inp_uint64(u); + break; + default: + return; + } +} + + +/* + * decode_modrm_reg + * + * Decodes reg field of mod/rm byte + * + */ +static inline void +decode_modrm_reg(struct ud *u, + struct ud_operand *operand, + unsigned int type, + unsigned int size) +{ + uint8_t reg = (REX_R(u->pfx_rex) << 3) | MODRM_REG(modrm(u)); + decode_reg(u, operand, type, reg, size); +} + + +/* + * decode_modrm_rm + * + * Decodes rm field of mod/rm byte + * + */ +static void +decode_modrm_rm(struct ud *u, + struct ud_operand *op, + unsigned char type, /* register type */ + unsigned int size) /* operand size */ + +{ + size_t offset = 0; + unsigned char mod, rm; + + /* get mod, r/m and reg fields */ + mod = MODRM_MOD(modrm(u)); + rm = (REX_B(u->pfx_rex) << 3) | MODRM_RM(modrm(u)); + + /* + * If mod is 11b, then the modrm.rm specifies a register. + * + */ + if (mod == 3) { + decode_reg(u, op, type, rm, size); + return; + } + + /* + * !11b => Memory Address + */ + op->type = UD_OP_MEM; + op->size = resolve_operand_size(u, size); + + if (u->adr_mode == 64) { + op->base = UD_R_RAX + rm; + if (mod == 1) { + offset = 8; + } else if (mod == 2) { + offset = 32; + } else if (mod == 0 && (rm & 7) == 5) { + op->base = UD_R_RIP; + offset = 32; + } else { + offset = 0; + } + /* + * Scale-Index-Base (SIB) + */ + if ((rm & 7) == 4) { + inp_next(u); + + op->scale = (1 << SIB_S(inp_curr(u))) & ~1; + op->index = UD_R_RAX + (SIB_I(inp_curr(u)) | (REX_X(u->pfx_rex) << 3)); + op->base = UD_R_RAX + (SIB_B(inp_curr(u)) | (REX_B(u->pfx_rex) << 3)); + + /* special conditions for base reference */ + if (op->index == UD_R_RSP) { + op->index = UD_NONE; + op->scale = UD_NONE; + } + + if (op->base == UD_R_RBP || op->base == UD_R_R13) { + if (mod == 0) { + op->base = UD_NONE; + } + if (mod == 1) { + offset = 8; + } else { + offset = 32; + } + } + } + } else if (u->adr_mode == 32) { + op->base = UD_R_EAX + rm; + if (mod == 1) { + offset = 8; + } else if (mod == 2) { + offset = 32; + } else if (mod == 0 && rm == 5) { + op->base = UD_NONE; + offset = 32; + } else { + offset = 0; + } + + /* Scale-Index-Base (SIB) */ + if ((rm & 7) == 4) { + inp_next(u); + + op->scale = (1 << SIB_S(inp_curr(u))) & ~1; + op->index = UD_R_EAX + (SIB_I(inp_curr(u)) | (REX_X(u->pfx_rex) << 3)); + op->base = UD_R_EAX + (SIB_B(inp_curr(u)) | (REX_B(u->pfx_rex) << 3)); + + if (op->index == UD_R_ESP) { + op->index = UD_NONE; + op->scale = UD_NONE; + } + + /* special condition for base reference */ + if (op->base == UD_R_EBP) { + if (mod == 0) { + op->base = UD_NONE; + } + if (mod == 1) { + offset = 8; + } else { + offset = 32; + } + } + } + } else { + const unsigned int bases[] = { UD_R_BX, UD_R_BX, UD_R_BP, UD_R_BP, + UD_R_SI, UD_R_DI, UD_R_BP, UD_R_BX }; + const unsigned int indices[] = { UD_R_SI, UD_R_DI, UD_R_SI, UD_R_DI, + UD_NONE, UD_NONE, UD_NONE, UD_NONE }; + op->base = bases[rm & 7]; + op->index = indices[rm & 7]; + if (mod == 0 && rm == 6) { + offset = 16; + op->base = UD_NONE; + } else if (mod == 1) { + offset = 8; + } else if (mod == 2) { + offset = 16; + } + } + + if (offset) { + decode_mem_disp(u, offset, op); + } +} + + +/* + * decode_moffset + * Decode offset-only memory operand + */ +static void +decode_moffset(struct ud *u, unsigned int size, struct ud_operand *opr) +{ + opr->type = UD_OP_MEM; + opr->size = resolve_operand_size(u, size); + decode_mem_disp(u, u->adr_mode, opr); +} + + +/* ----------------------------------------------------------------------------- + * decode_operands() - Disassembles Operands. + * ----------------------------------------------------------------------------- + */ +static int +decode_operand(struct ud *u, + struct ud_operand *operand, + enum ud_operand_code type, + unsigned int size) +{ + operand->_oprcode = type; + + switch (type) { + case OP_A : + decode_a(u, operand); + break; + case OP_MR: + decode_modrm_rm(u, operand, REGCLASS_GPR, + MODRM_MOD(modrm(u)) == 3 ? + Mx_reg_size(size) : Mx_mem_size(size)); + break; + case OP_F: + u->br_far = 1; + /* intended fall through */ + case OP_M: + if (MODRM_MOD(modrm(u)) == 3) { + UDERR(u, "expected modrm.mod != 3\n"); + } + /* intended fall through */ + case OP_E: + decode_modrm_rm(u, operand, REGCLASS_GPR, size); + break; + case OP_G: + decode_modrm_reg(u, operand, REGCLASS_GPR, size); + break; + case OP_sI: + case OP_I: + decode_imm(u, size, operand); + break; + case OP_I1: + operand->type = UD_OP_CONST; + operand->lval.udword = 1; + break; + case OP_N: + if (MODRM_MOD(modrm(u)) != 3) { + UDERR(u, "expected modrm.mod == 3\n"); + } + /* intended fall through */ + case OP_Q: + decode_modrm_rm(u, operand, REGCLASS_MMX, size); + break; + case OP_P: + decode_modrm_reg(u, operand, REGCLASS_MMX, size); + break; + case OP_U: + if (MODRM_MOD(modrm(u)) != 3) { + UDERR(u, "expected modrm.mod == 3\n"); + } + /* intended fall through */ + case OP_W: + decode_modrm_rm(u, operand, REGCLASS_XMM, size); + break; + case OP_V: + decode_modrm_reg(u, operand, REGCLASS_XMM, size); + break; + case OP_MU: + decode_modrm_rm(u, operand, REGCLASS_XMM, + MODRM_MOD(modrm(u)) == 3 ? + Mx_reg_size(size) : Mx_mem_size(size)); + break; + case OP_S: + decode_modrm_reg(u, operand, REGCLASS_SEG, size); + break; + case OP_O: + decode_moffset(u, size, operand); + break; + case OP_R0: + case OP_R1: + case OP_R2: + case OP_R3: + case OP_R4: + case OP_R5: + case OP_R6: + case OP_R7: + decode_reg(u, operand, REGCLASS_GPR, + (REX_B(u->pfx_rex) << 3) | (type - OP_R0), size); + break; + case OP_AL: + case OP_AX: + case OP_eAX: + case OP_rAX: + decode_reg(u, operand, REGCLASS_GPR, 0, size); + break; + case OP_CL: + case OP_CX: + case OP_eCX: + decode_reg(u, operand, REGCLASS_GPR, 1, size); + break; + case OP_DL: + case OP_DX: + case OP_eDX: + decode_reg(u, operand, REGCLASS_GPR, 2, size); + break; + case OP_ES: + case OP_CS: + case OP_DS: + case OP_SS: + case OP_FS: + case OP_GS: + /* in 64bits mode, only fs and gs are allowed */ + if (u->dis_mode == 64) { + if (type != OP_FS && type != OP_GS) { + UDERR(u, "invalid segment register in 64bits\n"); + } + } + operand->type = UD_OP_REG; + operand->base = (type - OP_ES) + UD_R_ES; + operand->size = 16; + break; + case OP_J : + decode_imm(u, size, operand); + operand->type = UD_OP_JIMM; + break ; + case OP_R : + if (MODRM_MOD(modrm(u)) != 3) { + UDERR(u, "expected modrm.mod == 3\n"); + } + decode_modrm_rm(u, operand, REGCLASS_GPR, size); + break; + case OP_C: + decode_modrm_reg(u, operand, REGCLASS_CR, size); + break; + case OP_D: + decode_modrm_reg(u, operand, REGCLASS_DB, size); + break; + case OP_I3 : + operand->type = UD_OP_CONST; + operand->lval.sbyte = 3; + break; + case OP_ST0: + case OP_ST1: + case OP_ST2: + case OP_ST3: + case OP_ST4: + case OP_ST5: + case OP_ST6: + case OP_ST7: + operand->type = UD_OP_REG; + operand->base = (type - OP_ST0) + UD_R_ST0; + operand->size = 80; + break; + default : + break; + } + return 0; +} + + +/* + * decode_operands + * + * Disassemble upto 3 operands of the current instruction being + * disassembled. By the end of the function, the operand fields + * of the ud structure will have been filled. + */ +static int +decode_operands(struct ud* u) +{ + decode_operand(u, &u->operand[0], + u->itab_entry->operand1.type, + u->itab_entry->operand1.size); + decode_operand(u, &u->operand[1], + u->itab_entry->operand2.type, + u->itab_entry->operand2.size); + decode_operand(u, &u->operand[2], + u->itab_entry->operand3.type, + u->itab_entry->operand3.size); + return 0; +} + +/* ----------------------------------------------------------------------------- + * clear_insn() - clear instruction structure + * ----------------------------------------------------------------------------- + */ +static void +clear_insn(register struct ud* u) +{ + u->error = 0; + u->pfx_seg = 0; + u->pfx_opr = 0; + u->pfx_adr = 0; + u->pfx_lock = 0; + u->pfx_repne = 0; + u->pfx_rep = 0; + u->pfx_repe = 0; + u->pfx_rex = 0; + u->pfx_str = 0; + u->mnemonic = UD_Inone; + u->itab_entry = NULL; + u->have_modrm = 0; + u->br_far = 0; + + memset( &u->operand[ 0 ], 0, sizeof( struct ud_operand ) ); + memset( &u->operand[ 1 ], 0, sizeof( struct ud_operand ) ); + memset( &u->operand[ 2 ], 0, sizeof( struct ud_operand ) ); +} + + +static inline int +resolve_pfx_str(struct ud* u) +{ + if (u->pfx_str == 0xf3) { + if (P_STR(u->itab_entry->prefix)) { + u->pfx_rep = 0xf3; + } else { + u->pfx_repe = 0xf3; + } + } else if (u->pfx_str == 0xf2) { + u->pfx_repne = 0xf3; + } + return 0; +} + + +static int +resolve_mode( struct ud* u ) +{ + int default64; + /* if in error state, bail out */ + if ( u->error ) return -1; + + /* propagate prefix effects */ + if ( u->dis_mode == 64 ) { /* set 64bit-mode flags */ + + /* Check validity of instruction m64 */ + if ( P_INV64( u->itab_entry->prefix ) ) { + UDERR(u, "instruction invalid in 64bits\n"); + return -1; + } + + /* effective rex prefix is the effective mask for the + * instruction hard-coded in the opcode map. + */ + u->pfx_rex = ( u->pfx_rex & 0x40 ) | + ( u->pfx_rex & REX_PFX_MASK( u->itab_entry->prefix ) ); + + /* whether this instruction has a default operand size of + * 64bit, also hardcoded into the opcode map. + */ + default64 = P_DEF64( u->itab_entry->prefix ); + /* calculate effective operand size */ + if ( REX_W( u->pfx_rex ) ) { + u->opr_mode = 64; + } else if ( u->pfx_opr ) { + u->opr_mode = 16; + } else { + /* unless the default opr size of instruction is 64, + * the effective operand size in the absence of rex.w + * prefix is 32. + */ + u->opr_mode = default64 ? 64 : 32; + } + + /* calculate effective address size */ + u->adr_mode = (u->pfx_adr) ? 32 : 64; + } else if ( u->dis_mode == 32 ) { /* set 32bit-mode flags */ + u->opr_mode = ( u->pfx_opr ) ? 16 : 32; + u->adr_mode = ( u->pfx_adr ) ? 16 : 32; + } else if ( u->dis_mode == 16 ) { /* set 16bit-mode flags */ + u->opr_mode = ( u->pfx_opr ) ? 32 : 16; + u->adr_mode = ( u->pfx_adr ) ? 32 : 16; + } + + return 0; +} + + +static inline int +decode_insn(struct ud *u, uint16_t ptr) +{ + UD_ASSERT((ptr & 0x8000) == 0); + u->itab_entry = &ud_itab[ ptr ]; + u->mnemonic = u->itab_entry->mnemonic; + return (resolve_pfx_str(u) == 0 && + resolve_mode(u) == 0 && + decode_operands(u) == 0 && + resolve_mnemonic(u) == 0) ? 0 : -1; +} + + +/* + * decode_3dnow() + * + * Decoding 3dnow is a little tricky because of its strange opcode + * structure. The final opcode disambiguation depends on the last + * byte that comes after the operands have been decoded. Fortunately, + * all 3dnow instructions have the same set of operand types. So we + * go ahead and decode the instruction by picking an arbitrarily chosen + * valid entry in the table, decode the operands, and read the final + * byte to resolve the menmonic. + */ +static inline int +decode_3dnow(struct ud* u) +{ + uint16_t ptr; + UD_ASSERT(u->le->type == UD_TAB__OPC_3DNOW); + UD_ASSERT(u->le->table[0xc] != 0); + decode_insn(u, u->le->table[0xc]); + inp_next(u); + if (u->error) { + return -1; + } + ptr = u->le->table[inp_curr(u)]; + UD_ASSERT((ptr & 0x8000) == 0); + u->mnemonic = ud_itab[ptr].mnemonic; + return 0; +} + + +static int +decode_ssepfx(struct ud *u) +{ + uint8_t idx; + uint8_t pfx; + + /* + * String prefixes (f2, f3) take precedence over operand + * size prefix (66). + */ + pfx = u->pfx_str; + if (pfx == 0) { + pfx = u->pfx_opr; + } + idx = ((pfx & 0xf) + 1) / 2; + if (u->le->table[idx] == 0) { + idx = 0; + } + if (idx && u->le->table[idx] != 0) { + /* + * "Consume" the prefix as a part of the opcode, so it is no + * longer exported as an instruction prefix. + */ + u->pfx_str = 0; + if (pfx == 0x66) { + /* + * consume "66" only if it was used for decoding, leaving + * it to be used as an operands size override for some + * simd instructions. + */ + u->pfx_opr = 0; + } + } + return decode_ext(u, u->le->table[idx]); +} + + +/* + * decode_ext() + * + * Decode opcode extensions (if any) + */ +static int +decode_ext(struct ud *u, uint16_t ptr) +{ + uint8_t idx = 0; + if ((ptr & 0x8000) == 0) { + return decode_insn(u, ptr); + } + u->le = &ud_lookup_table_list[(~0x8000 & ptr)]; + if (u->le->type == UD_TAB__OPC_3DNOW) { + return decode_3dnow(u); + } + + switch (u->le->type) { + case UD_TAB__OPC_MOD: + /* !11 = 0, 11 = 1 */ + idx = (MODRM_MOD(modrm(u)) + 1) / 4; + break; + /* disassembly mode/operand size/address size based tables. + * 16 = 0,, 32 = 1, 64 = 2 + */ + case UD_TAB__OPC_MODE: + idx = u->dis_mode != 64 ? 0 : 1; + break; + case UD_TAB__OPC_OSIZE: + idx = eff_opr_mode(u->dis_mode, REX_W(u->pfx_rex), u->pfx_opr) / 32; + break; + case UD_TAB__OPC_ASIZE: + idx = eff_adr_mode(u->dis_mode, u->pfx_adr) / 32; + break; + case UD_TAB__OPC_X87: + idx = modrm(u) - 0xC0; + break; + case UD_TAB__OPC_VENDOR: + if (u->vendor == UD_VENDOR_ANY) { + /* choose a valid entry */ + idx = (u->le->table[idx] != 0) ? 0 : 1; + } else if (u->vendor == UD_VENDOR_AMD) { + idx = 0; + } else { + idx = 1; + } + break; + case UD_TAB__OPC_RM: + idx = MODRM_RM(modrm(u)); + break; + case UD_TAB__OPC_REG: + idx = MODRM_REG(modrm(u)); + break; + case UD_TAB__OPC_SSE: + return decode_ssepfx(u); + default: + UD_ASSERT(!"not reached"); + break; + } + + return decode_ext(u, u->le->table[idx]); +} + + +static int +decode_opcode(struct ud *u) +{ + uint16_t ptr; + UD_ASSERT(u->le->type == UD_TAB__OPC_TABLE); + UD_RETURN_ON_ERROR(u); + u->primary_opcode = inp_curr(u); + ptr = u->le->table[inp_curr(u)]; + if (ptr & 0x8000) { + u->le = &ud_lookup_table_list[ptr & ~0x8000]; + if (u->le->type == UD_TAB__OPC_TABLE) { + inp_next(u); + return decode_opcode(u); + } + } + return decode_ext(u, ptr); +} + + +/* ============================================================================= + * ud_decode() - Instruction decoder. Returns the number of bytes decoded. + * ============================================================================= + */ +unsigned int +ud_decode(struct ud *u) +{ + inp_start(u); + clear_insn(u); + u->le = &ud_lookup_table_list[0]; + u->error = decode_prefixes(u) == -1 || + decode_opcode(u) == -1 || + u->error; + /* Handle decode error. */ + if (u->error) { + /* clear out the decode data. */ + clear_insn(u); + /* mark the sequence of bytes as invalid. */ + u->itab_entry = &ud_itab[0]; /* entry 0 is invalid */ + u->mnemonic = u->itab_entry->mnemonic; + } + + /* maybe this stray segment override byte + * should be spewed out? + */ + if ( !P_SEG( u->itab_entry->prefix ) && + u->operand[0].type != UD_OP_MEM && + u->operand[1].type != UD_OP_MEM ) + u->pfx_seg = 0; + + u->insn_offset = u->pc; /* set offset of instruction */ + u->asm_buf_fill = 0; /* set translation buffer index to 0 */ + u->pc += u->inp_ctr; /* move program counter by bytes decoded */ + + /* return number of bytes disassembled. */ + return u->inp_ctr; +} + +/* +vim: set ts=2 sw=2 expandtab +*/ diff --git a/public/libudis86/decode.h b/public/libudis86/decode.h new file mode 100644 index 0000000000..a7362c84a4 --- /dev/null +++ b/public/libudis86/decode.h @@ -0,0 +1,195 @@ +/* udis86 - libudis86/decode.h + * + * Copyright (c) 2002-2009 Vivek Thampi + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef UD_DECODE_H +#define UD_DECODE_H + +#include "types.h" +#include "itab.h" + +#define MAX_INSN_LENGTH 15 + +/* itab prefix bits */ +#define P_none ( 0 ) +#define P_cast ( 1 << 0 ) +#define P_CAST(n) ( ( n >> 0 ) & 1 ) +#define P_rexb ( 1 << 1 ) +#define P_REXB(n) ( ( n >> 1 ) & 1 ) +#define P_inv64 ( 1 << 4 ) +#define P_INV64(n) ( ( n >> 4 ) & 1 ) +#define P_rexw ( 1 << 5 ) +#define P_REXW(n) ( ( n >> 5 ) & 1 ) +#define P_def64 ( 1 << 7 ) +#define P_DEF64(n) ( ( n >> 7 ) & 1 ) +#define P_rexr ( 1 << 8 ) +#define P_REXR(n) ( ( n >> 8 ) & 1 ) +#define P_oso ( 1 << 9 ) +#define P_OSO(n) ( ( n >> 9 ) & 1 ) +#define P_aso ( 1 << 10 ) +#define P_ASO(n) ( ( n >> 10 ) & 1 ) +#define P_rexx ( 1 << 11 ) +#define P_REXX(n) ( ( n >> 11 ) & 1 ) +#define P_ImpAddr ( 1 << 12 ) +#define P_IMPADDR(n) ( ( n >> 12 ) & 1 ) +#define P_seg ( 1 << 13 ) +#define P_SEG(n) ( ( n >> 13 ) & 1 ) +#define P_str ( 1 << 14 ) +#define P_STR(n) ( ( n >> 14 ) & 1 ) +#define P_strz ( 1 << 15 ) +#define P_STR_ZF(n) ( ( n >> 15 ) & 1 ) + +/* operand type constants -- order is important! */ + +enum ud_operand_code { + OP_NONE, + + OP_A, OP_E, OP_M, OP_G, + OP_I, OP_F, + + OP_R0, OP_R1, OP_R2, OP_R3, + OP_R4, OP_R5, OP_R6, OP_R7, + + OP_AL, OP_CL, OP_DL, + OP_AX, OP_CX, OP_DX, + OP_eAX, OP_eCX, OP_eDX, + OP_rAX, OP_rCX, OP_rDX, + + OP_ES, OP_CS, OP_SS, OP_DS, + OP_FS, OP_GS, + + OP_ST0, OP_ST1, OP_ST2, OP_ST3, + OP_ST4, OP_ST5, OP_ST6, OP_ST7, + + OP_J, OP_S, OP_O, + OP_I1, OP_I3, OP_sI, + + OP_V, OP_W, OP_Q, OP_P, + OP_U, OP_N, OP_MU, + + OP_R, OP_C, OP_D, + + OP_MR +} UD_ATTR_PACKED; + + +/* operand size constants */ + +enum ud_operand_size { + SZ_NA = 0, + SZ_Z = 1, + SZ_V = 2, + SZ_RDQ = 7, + + /* the following values are used as is, + * and thus hard-coded. changing them + * will break internals + */ + SZ_B = 8, + SZ_W = 16, + SZ_D = 32, + SZ_Q = 64, + SZ_T = 80, + SZ_O = 128, + + SZ_Y = 17, + + /* + * complex size types, that encode sizes for operands + * of type MR (memory or register), for internal use + * only. Id space 256 and above. + */ + SZ_BD = (SZ_B << 8) | SZ_D, + SZ_BV = (SZ_B << 8) | SZ_V, + SZ_WD = (SZ_W << 8) | SZ_D, + SZ_WV = (SZ_W << 8) | SZ_V, + SZ_WY = (SZ_W << 8) | SZ_Y, + SZ_DY = (SZ_D << 8) | SZ_Y, + SZ_WO = (SZ_W << 8) | SZ_O, + SZ_DO = (SZ_D << 8) | SZ_O, + SZ_QO = (SZ_Q << 8) | SZ_O, + +} UD_ATTR_PACKED; + + +/* resolve complex size type. + */ +static inline enum ud_operand_size +Mx_mem_size(enum ud_operand_size size) +{ + return (size >> 8) & 0xff; +} + +static inline enum ud_operand_size +Mx_reg_size(enum ud_operand_size size) +{ + return size & 0xff; +} + +/* A single operand of an entry in the instruction table. + * (internal use only) + */ +struct ud_itab_entry_operand +{ + enum ud_operand_code type; + enum ud_operand_size size; +}; + + +/* A single entry in an instruction table. + *(internal use only) + */ +struct ud_itab_entry +{ + enum ud_mnemonic_code mnemonic; + struct ud_itab_entry_operand operand1; + struct ud_itab_entry_operand operand2; + struct ud_itab_entry_operand operand3; + uint32_t prefix; +}; + +struct ud_lookup_table_list_entry { + const uint16_t *table; + enum ud_table_type type; + const char *meta; +}; + + + +static inline int +ud_opcode_field_sext(uint8_t primary_opcode) +{ + return (primary_opcode & 0x02) != 0; +} + +extern struct ud_itab_entry ud_itab[]; +extern struct ud_lookup_table_list_entry ud_lookup_table_list[]; + +#endif /* UD_DECODE_H */ + +/* vim:cindent + * vim:expandtab + * vim:ts=4 + * vim:sw=4 + */ diff --git a/public/libudis86/extern.h b/public/libudis86/extern.h new file mode 100644 index 0000000000..ae9f82f225 --- /dev/null +++ b/public/libudis86/extern.h @@ -0,0 +1,105 @@ +/* udis86 - libudis86/extern.h + * + * Copyright (c) 2002-2009, 2013 Vivek Thampi + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef UD_EXTERN_H +#define UD_EXTERN_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "types.h" + +/* ============================= PUBLIC API ================================= */ + +extern void ud_init(struct ud*); + +extern void ud_set_mode(struct ud*, uint8_t); + +extern void ud_set_pc(struct ud*, uint64_t); + +extern void ud_set_input_hook(struct ud*, int (*)(struct ud*)); + +extern void ud_set_input_buffer(struct ud*, const uint8_t*, size_t); + +#ifndef __UD_STANDALONE__ +extern void ud_set_input_file(struct ud*, FILE*); +#endif /* __UD_STANDALONE__ */ + +extern void ud_set_vendor(struct ud*, unsigned); + +extern void ud_set_syntax(struct ud*, void (*)(struct ud*)); + +extern void ud_input_skip(struct ud*, size_t); + +extern int ud_input_end(const struct ud*); + +extern unsigned int ud_decode(struct ud*); + +extern unsigned int ud_disassemble(struct ud*); + +extern void ud_translate_intel(struct ud*); + +extern void ud_translate_att(struct ud*); + +extern const char* ud_insn_asm(const struct ud* u); + +extern const uint8_t* ud_insn_ptr(const struct ud* u); + +extern uint64_t ud_insn_off(const struct ud*); + +extern const char* ud_insn_hex(struct ud*); + +extern unsigned int ud_insn_len(const struct ud* u); + +extern const struct ud_operand* ud_insn_opr(const struct ud *u, unsigned int n); + +extern int ud_opr_is_sreg(const struct ud_operand *opr); + +extern int ud_opr_is_gpr(const struct ud_operand *opr); + +extern enum ud_mnemonic_code ud_insn_mnemonic(const struct ud *u); + +extern const char* ud_lookup_mnemonic(enum ud_mnemonic_code c); + +extern void ud_set_user_opaque_data(struct ud*, void*); + +extern void* ud_get_user_opaque_data(const struct ud*); + +extern uint64_t ud_insn_sext_imm(const struct ud*, const struct ud_operand*); + +extern void ud_set_asm_buffer(struct ud *u, char *buf, size_t size); + +extern void ud_set_sym_resolver(struct ud *u, + const char* (*resolver)(struct ud*, + uint64_t addr, + int64_t *offset)); + +/* ========================================================================== */ + +#ifdef __cplusplus +} +#endif +#endif /* UD_EXTERN_H */ diff --git a/public/libudis86/itab.c b/public/libudis86/itab.c new file mode 100644 index 0000000000..a3d0634b86 --- /dev/null +++ b/public/libudis86/itab.c @@ -0,0 +1,8401 @@ +/* itab.c -- generated by udis86:scripts/ud_itab.py, do no edit */ +#include "decode.h" + +#define GROUP(n) (0x8000 | (n)) + + +static const uint16_t ud_itab__1[] = { + /* 0 */ 7, 0, +}; + +static const uint16_t ud_itab__2[] = { + /* 0 */ 8, 0, +}; + +static const uint16_t ud_itab__3[] = { + /* 0 */ 15, 0, +}; + +static const uint16_t ud_itab__6[] = { + /* 0 */ 16, 0, 0, 0, +}; + +static const uint16_t ud_itab__7[] = { + /* 0 */ 17, 0, 0, 0, +}; + +static const uint16_t ud_itab__8[] = { + /* 0 */ 18, 0, 0, 0, +}; + +static const uint16_t ud_itab__9[] = { + /* 0 */ 19, 0, 0, 0, +}; + +static const uint16_t ud_itab__10[] = { + /* 0 */ 20, 0, 0, 0, +}; + +static const uint16_t ud_itab__11[] = { + /* 0 */ 21, 0, 0, 0, +}; + +static const uint16_t ud_itab__5[] = { + /* 0 */ GROUP(6), GROUP(7), GROUP(8), GROUP(9), + /* 4 */ GROUP(10), GROUP(11), 0, 0, +}; + +static const uint16_t ud_itab__15[] = { + /* 0 */ 22, 0, +}; + +static const uint16_t ud_itab__14[] = { + /* 0 */ GROUP(15), 0, 0, 0, +}; + +static const uint16_t ud_itab__17[] = { + /* 0 */ 23, 0, +}; + +static const uint16_t ud_itab__16[] = { + /* 0 */ GROUP(17), 0, 0, 0, +}; + +static const uint16_t ud_itab__19[] = { + /* 0 */ 24, 0, +}; + +static const uint16_t ud_itab__18[] = { + /* 0 */ GROUP(19), 0, 0, 0, +}; + +static const uint16_t ud_itab__21[] = { + /* 0 */ 25, 0, +}; + +static const uint16_t ud_itab__20[] = { + /* 0 */ GROUP(21), 0, 0, 0, +}; + +static const uint16_t ud_itab__23[] = { + /* 0 */ 26, 0, +}; + +static const uint16_t ud_itab__22[] = { + /* 0 */ GROUP(23), 0, 0, 0, +}; + +static const uint16_t ud_itab__25[] = { + /* 0 */ 27, 0, +}; + +static const uint16_t ud_itab__24[] = { + /* 0 */ GROUP(25), 0, 0, 0, +}; + +static const uint16_t ud_itab__27[] = { + /* 0 */ 28, 0, +}; + +static const uint16_t ud_itab__26[] = { + /* 0 */ GROUP(27), 0, 0, 0, +}; + +static const uint16_t ud_itab__13[] = { + /* 0 */ GROUP(14), GROUP(16), GROUP(18), GROUP(20), + /* 4 */ GROUP(22), 0, GROUP(24), GROUP(26), +}; + +static const uint16_t ud_itab__32[] = { + /* 0 */ 0, 29, 0, +}; + +static const uint16_t ud_itab__31[] = { + /* 0 */ 0, GROUP(32), +}; + +static const uint16_t ud_itab__30[] = { + /* 0 */ GROUP(31), 0, 0, 0, +}; + +static const uint16_t ud_itab__35[] = { + /* 0 */ 0, 30, 0, +}; + +static const uint16_t ud_itab__34[] = { + /* 0 */ 0, GROUP(35), +}; + +static const uint16_t ud_itab__33[] = { + /* 0 */ GROUP(34), 0, 0, 0, +}; + +static const uint16_t ud_itab__38[] = { + /* 0 */ 0, 31, 0, +}; + +static const uint16_t ud_itab__37[] = { + /* 0 */ 0, GROUP(38), +}; + +static const uint16_t ud_itab__36[] = { + /* 0 */ GROUP(37), 0, 0, 0, +}; + +static const uint16_t ud_itab__41[] = { + /* 0 */ 0, 32, 0, +}; + +static const uint16_t ud_itab__40[] = { + /* 0 */ 0, GROUP(41), +}; + +static const uint16_t ud_itab__39[] = { + /* 0 */ GROUP(40), 0, 0, 0, +}; + +static const uint16_t ud_itab__29[] = { + /* 0 */ 0, GROUP(30), GROUP(33), GROUP(36), + /* 4 */ GROUP(39), 0, 0, 0, +}; + +static const uint16_t ud_itab__44[] = { + /* 0 */ 0, 33, +}; + +static const uint16_t ud_itab__43[] = { + /* 0 */ GROUP(44), 0, 0, 0, +}; + +static const uint16_t ud_itab__46[] = { + /* 0 */ 0, 34, +}; + +static const uint16_t ud_itab__45[] = { + /* 0 */ GROUP(46), 0, 0, 0, +}; + +static const uint16_t ud_itab__42[] = { + /* 0 */ GROUP(43), GROUP(45), 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__49[] = { + /* 0 */ 0, 35, +}; + +static const uint16_t ud_itab__48[] = { + /* 0 */ GROUP(49), 0, 0, 0, +}; + +static const uint16_t ud_itab__51[] = { + /* 0 */ 0, 36, +}; + +static const uint16_t ud_itab__50[] = { + /* 0 */ GROUP(51), 0, 0, 0, +}; + +static const uint16_t ud_itab__47[] = { + /* 0 */ GROUP(48), GROUP(50), 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__55[] = { + /* 0 */ 37, 0, 0, +}; + +static const uint16_t ud_itab__54[] = { + /* 0 */ 0, GROUP(55), +}; + +static const uint16_t ud_itab__53[] = { + /* 0 */ GROUP(54), 0, 0, 0, +}; + +static const uint16_t ud_itab__58[] = { + /* 0 */ 38, 0, 0, +}; + +static const uint16_t ud_itab__57[] = { + /* 0 */ 0, GROUP(58), +}; + +static const uint16_t ud_itab__56[] = { + /* 0 */ GROUP(57), 0, 0, 0, +}; + +static const uint16_t ud_itab__61[] = { + /* 0 */ 39, 0, 0, +}; + +static const uint16_t ud_itab__60[] = { + /* 0 */ 0, GROUP(61), +}; + +static const uint16_t ud_itab__59[] = { + /* 0 */ GROUP(60), 0, 0, 0, +}; + +static const uint16_t ud_itab__64[] = { + /* 0 */ 40, 0, 0, +}; + +static const uint16_t ud_itab__63[] = { + /* 0 */ 0, GROUP(64), +}; + +static const uint16_t ud_itab__62[] = { + /* 0 */ GROUP(63), 0, 0, 0, +}; + +static const uint16_t ud_itab__67[] = { + /* 0 */ 41, 0, 0, +}; + +static const uint16_t ud_itab__66[] = { + /* 0 */ 0, GROUP(67), +}; + +static const uint16_t ud_itab__65[] = { + /* 0 */ GROUP(66), 0, 0, 0, +}; + +static const uint16_t ud_itab__70[] = { + /* 0 */ 42, 0, 0, +}; + +static const uint16_t ud_itab__69[] = { + /* 0 */ 0, GROUP(70), +}; + +static const uint16_t ud_itab__68[] = { + /* 0 */ GROUP(69), 0, 0, 0, +}; + +static const uint16_t ud_itab__73[] = { + /* 0 */ 43, 0, 0, +}; + +static const uint16_t ud_itab__72[] = { + /* 0 */ 0, GROUP(73), +}; + +static const uint16_t ud_itab__71[] = { + /* 0 */ GROUP(72), 0, 0, 0, +}; + +static const uint16_t ud_itab__76[] = { + /* 0 */ 44, 0, 0, +}; + +static const uint16_t ud_itab__75[] = { + /* 0 */ 0, GROUP(76), +}; + +static const uint16_t ud_itab__74[] = { + /* 0 */ GROUP(75), 0, 0, 0, +}; + +static const uint16_t ud_itab__52[] = { + /* 0 */ GROUP(53), GROUP(56), GROUP(59), GROUP(62), + /* 4 */ GROUP(65), GROUP(68), GROUP(71), GROUP(74), +}; + +static const uint16_t ud_itab__78[] = { + /* 0 */ 0, 45, +}; + +static const uint16_t ud_itab__77[] = { + /* 0 */ GROUP(78), 0, 0, 0, +}; + +static const uint16_t ud_itab__80[] = { + /* 0 */ 0, 46, +}; + +static const uint16_t ud_itab__79[] = { + /* 0 */ GROUP(80), 0, 0, 0, +}; + +static const uint16_t ud_itab__83[] = { + /* 0 */ 0, 47, +}; + +static const uint16_t ud_itab__82[] = { + /* 0 */ GROUP(83), 0, 0, 0, +}; + +static const uint16_t ud_itab__86[] = { + /* 0 */ 48, 0, 0, +}; + +static const uint16_t ud_itab__85[] = { + /* 0 */ 0, GROUP(86), +}; + +static const uint16_t ud_itab__84[] = { + /* 0 */ GROUP(85), 0, 0, 0, +}; + +static const uint16_t ud_itab__81[] = { + /* 0 */ GROUP(82), GROUP(84), 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__28[] = { + /* 0 */ GROUP(29), GROUP(42), GROUP(47), GROUP(52), + /* 4 */ GROUP(77), 0, GROUP(79), GROUP(81), +}; + +static const uint16_t ud_itab__12[] = { + /* 0 */ GROUP(13), GROUP(28), +}; + +static const uint16_t ud_itab__87[] = { + /* 0 */ 49, 0, 0, 0, +}; + +static const uint16_t ud_itab__88[] = { + /* 0 */ 50, 0, 0, 0, +}; + +static const uint16_t ud_itab__89[] = { + /* 0 */ 51, 0, 0, 0, +}; + +static const uint16_t ud_itab__90[] = { + /* 0 */ 52, 0, 0, 0, +}; + +static const uint16_t ud_itab__91[] = { + /* 0 */ 53, 0, 0, 0, +}; + +static const uint16_t ud_itab__92[] = { + /* 0 */ 54, 0, 0, 0, +}; + +static const uint16_t ud_itab__93[] = { + /* 0 */ 55, 0, 0, 0, +}; + +static const uint16_t ud_itab__94[] = { + /* 0 */ 56, 0, 0, 0, +}; + +static const uint16_t ud_itab__96[] = { + /* 0 */ 57, 0, 0, 0, +}; + +static const uint16_t ud_itab__97[] = { + /* 0 */ 58, 0, 0, 0, +}; + +static const uint16_t ud_itab__98[] = { + /* 0 */ 59, 0, 0, 0, +}; + +static const uint16_t ud_itab__99[] = { + /* 0 */ 60, 0, 0, 0, +}; + +static const uint16_t ud_itab__100[] = { + /* 0 */ 61, 0, 0, 0, +}; + +static const uint16_t ud_itab__101[] = { + /* 0 */ 62, 0, 0, 0, +}; + +static const uint16_t ud_itab__102[] = { + /* 0 */ 63, 0, 0, 0, +}; + +static const uint16_t ud_itab__103[] = { + /* 0 */ 64, 0, 0, 0, +}; + +static const uint16_t ud_itab__95[] = { + /* 0 */ GROUP(96), GROUP(97), GROUP(98), GROUP(99), + /* 4 */ GROUP(100), GROUP(101), GROUP(102), GROUP(103), +}; + +static const uint16_t ud_itab__104[] = { + /* 0 */ 65, 0, 0, 0, +}; + +static const uint16_t ud_itab__105[] = { + /* 0 */ 0, 0, 0, 0, + /* 4 */ 0, 0, 0, 0, + /* 8 */ 0, 0, 0, 0, + /* c */ 66, 67, 0, 0, + /* 10 */ 0, 0, 0, 0, + /* 14 */ 0, 0, 0, 0, + /* 18 */ 0, 0, 0, 0, + /* 1c */ 68, 69, 0, 0, + /* 20 */ 0, 0, 0, 0, + /* 24 */ 0, 0, 0, 0, + /* 28 */ 0, 0, 0, 0, + /* 2c */ 0, 0, 0, 0, + /* 30 */ 0, 0, 0, 0, + /* 34 */ 0, 0, 0, 0, + /* 38 */ 0, 0, 0, 0, + /* 3c */ 0, 0, 0, 0, + /* 40 */ 0, 0, 0, 0, + /* 44 */ 0, 0, 0, 0, + /* 48 */ 0, 0, 0, 0, + /* 4c */ 0, 0, 0, 0, + /* 50 */ 0, 0, 0, 0, + /* 54 */ 0, 0, 0, 0, + /* 58 */ 0, 0, 0, 0, + /* 5c */ 0, 0, 0, 0, + /* 60 */ 0, 0, 0, 0, + /* 64 */ 0, 0, 0, 0, + /* 68 */ 0, 0, 0, 0, + /* 6c */ 0, 0, 0, 0, + /* 70 */ 0, 0, 0, 0, + /* 74 */ 0, 0, 0, 0, + /* 78 */ 0, 0, 0, 0, + /* 7c */ 0, 0, 0, 0, + /* 80 */ 0, 0, 0, 0, + /* 84 */ 0, 0, 0, 0, + /* 88 */ 0, 0, 70, 0, + /* 8c */ 0, 0, 71, 0, + /* 90 */ 72, 0, 0, 0, + /* 94 */ 73, 0, 74, 75, + /* 98 */ 0, 0, 76, 0, + /* 9c */ 0, 0, 77, 0, + /* a0 */ 78, 0, 0, 0, + /* a4 */ 79, 0, 80, 81, + /* a8 */ 0, 0, 82, 0, + /* ac */ 0, 0, 83, 0, + /* b0 */ 84, 0, 0, 0, + /* b4 */ 85, 0, 86, 87, + /* b8 */ 0, 0, 0, 88, + /* bc */ 0, 0, 0, 89, + /* c0 */ 0, 0, 0, 0, + /* c4 */ 0, 0, 0, 0, + /* c8 */ 0, 0, 0, 0, + /* cc */ 0, 0, 0, 0, + /* d0 */ 0, 0, 0, 0, + /* d4 */ 0, 0, 0, 0, + /* d8 */ 0, 0, 0, 0, + /* dc */ 0, 0, 0, 0, + /* e0 */ 0, 0, 0, 0, + /* e4 */ 0, 0, 0, 0, + /* e8 */ 0, 0, 0, 0, + /* ec */ 0, 0, 0, 0, + /* f0 */ 0, 0, 0, 0, + /* f4 */ 0, 0, 0, 0, + /* f8 */ 0, 0, 0, 0, + /* fc */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__106[] = { + /* 0 */ 90, 91, 92, 93, +}; + +static const uint16_t ud_itab__107[] = { + /* 0 */ 94, 95, 96, 97, +}; + +static const uint16_t ud_itab__110[] = { + /* 0 */ 98, 0, +}; + +static const uint16_t ud_itab__111[] = { + /* 0 */ 99, 0, +}; + +static const uint16_t ud_itab__112[] = { + /* 0 */ 100, 0, +}; + +static const uint16_t ud_itab__113[] = { + /* 0 */ 101, 0, +}; + +static const uint16_t ud_itab__109[] = { + /* 0 */ GROUP(110), GROUP(111), GROUP(112), GROUP(113), +}; + +static const uint16_t ud_itab__115[] = { + /* 0 */ 0, 102, +}; + +static const uint16_t ud_itab__116[] = { + /* 0 */ 0, 103, +}; + +static const uint16_t ud_itab__117[] = { + /* 0 */ 0, 104, +}; + +static const uint16_t ud_itab__114[] = { + /* 0 */ GROUP(115), GROUP(116), GROUP(117), 0, +}; + +static const uint16_t ud_itab__108[] = { + /* 0 */ GROUP(109), GROUP(114), +}; + +static const uint16_t ud_itab__118[] = { + /* 0 */ 105, 0, 0, 106, +}; + +static const uint16_t ud_itab__119[] = { + /* 0 */ 107, 0, 0, 108, +}; + +static const uint16_t ud_itab__120[] = { + /* 0 */ 109, 0, 0, 110, +}; + +static const uint16_t ud_itab__123[] = { + /* 0 */ 111, 0, +}; + +static const uint16_t ud_itab__124[] = { + /* 0 */ 112, 0, +}; + +static const uint16_t ud_itab__125[] = { + /* 0 */ 113, 0, +}; + +static const uint16_t ud_itab__122[] = { + /* 0 */ GROUP(123), 0, GROUP(124), GROUP(125), +}; + +static const uint16_t ud_itab__127[] = { + /* 0 */ 0, 114, +}; + +static const uint16_t ud_itab__128[] = { + /* 0 */ 0, 115, +}; + +static const uint16_t ud_itab__126[] = { + /* 0 */ GROUP(127), 0, GROUP(128), 0, +}; + +static const uint16_t ud_itab__121[] = { + /* 0 */ GROUP(122), GROUP(126), +}; + +static const uint16_t ud_itab__129[] = { + /* 0 */ 116, 0, 0, 117, +}; + +static const uint16_t ud_itab__131[] = { + /* 0 */ 118, 0, 0, 0, +}; + +static const uint16_t ud_itab__132[] = { + /* 0 */ 119, 0, 0, 0, +}; + +static const uint16_t ud_itab__133[] = { + /* 0 */ 120, 0, 0, 0, +}; + +static const uint16_t ud_itab__134[] = { + /* 0 */ 121, 0, 0, 0, +}; + +static const uint16_t ud_itab__130[] = { + /* 0 */ GROUP(131), GROUP(132), GROUP(133), GROUP(134), + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__135[] = { + /* 0 */ 122, 0, 0, 0, +}; + +static const uint16_t ud_itab__136[] = { + /* 0 */ 123, 0, 0, 0, +}; + +static const uint16_t ud_itab__137[] = { + /* 0 */ 124, 0, 0, 0, +}; + +static const uint16_t ud_itab__138[] = { + /* 0 */ 125, 0, 0, 0, +}; + +static const uint16_t ud_itab__139[] = { + /* 0 */ 126, 0, 0, 0, +}; + +static const uint16_t ud_itab__140[] = { + /* 0 */ 127, 0, 0, 0, +}; + +static const uint16_t ud_itab__141[] = { + /* 0 */ 128, 0, 0, 0, +}; + +static const uint16_t ud_itab__142[] = { + /* 0 */ 129, 0, 0, 0, +}; + +static const uint16_t ud_itab__143[] = { + /* 0 */ 130, 0, 0, 0, +}; + +static const uint16_t ud_itab__144[] = { + /* 0 */ 131, 0, 0, 0, +}; + +static const uint16_t ud_itab__145[] = { + /* 0 */ 132, 0, 0, 0, +}; + +static const uint16_t ud_itab__146[] = { + /* 0 */ 133, 0, 0, 134, +}; + +static const uint16_t ud_itab__147[] = { + /* 0 */ 135, 0, 0, 136, +}; + +static const uint16_t ud_itab__148[] = { + /* 0 */ 137, 138, 139, 140, +}; + +static const uint16_t ud_itab__149[] = { + /* 0 */ 141, 0, 0, 142, +}; + +static const uint16_t ud_itab__150[] = { + /* 0 */ 143, 144, 145, 146, +}; + +static const uint16_t ud_itab__151[] = { + /* 0 */ 147, 148, 149, 150, +}; + +static const uint16_t ud_itab__152[] = { + /* 0 */ 151, 0, 0, 152, +}; + +static const uint16_t ud_itab__153[] = { + /* 0 */ 153, 0, 0, 154, +}; + +static const uint16_t ud_itab__154[] = { + /* 0 */ 155, 0, 0, 0, +}; + +static const uint16_t ud_itab__155[] = { + /* 0 */ 156, 0, 0, 0, +}; + +static const uint16_t ud_itab__156[] = { + /* 0 */ 157, 0, 0, 0, +}; + +static const uint16_t ud_itab__157[] = { + /* 0 */ 158, 0, 0, 0, +}; + +static const uint16_t ud_itab__160[] = { + /* 0 */ 0, 160, 0, +}; + +static const uint16_t ud_itab__159[] = { + /* 0 */ 159, GROUP(160), +}; + +static const uint16_t ud_itab__158[] = { + /* 0 */ GROUP(159), 0, 0, 0, +}; + +static const uint16_t ud_itab__163[] = { + /* 0 */ 0, 162, 0, +}; + +static const uint16_t ud_itab__162[] = { + /* 0 */ 161, GROUP(163), +}; + +static const uint16_t ud_itab__161[] = { + /* 0 */ GROUP(162), 0, 0, 0, +}; + +static const uint16_t ud_itab__164[] = { + /* 0 */ 163, 0, 0, 0, +}; + +static const uint16_t ud_itab__166[] = { + /* 0 */ 164, 0, 0, 165, +}; + +static const uint16_t ud_itab__167[] = { + /* 0 */ 166, 0, 0, 167, +}; + +static const uint16_t ud_itab__168[] = { + /* 0 */ 168, 0, 0, 169, +}; + +static const uint16_t ud_itab__169[] = { + /* 0 */ 170, 0, 0, 171, +}; + +static const uint16_t ud_itab__170[] = { + /* 0 */ 172, 0, 0, 173, +}; + +static const uint16_t ud_itab__171[] = { + /* 0 */ 174, 0, 0, 175, +}; + +static const uint16_t ud_itab__172[] = { + /* 0 */ 176, 0, 0, 177, +}; + +static const uint16_t ud_itab__173[] = { + /* 0 */ 178, 0, 0, 179, +}; + +static const uint16_t ud_itab__174[] = { + /* 0 */ 180, 0, 0, 181, +}; + +static const uint16_t ud_itab__175[] = { + /* 0 */ 182, 0, 0, 183, +}; + +static const uint16_t ud_itab__176[] = { + /* 0 */ 184, 0, 0, 185, +}; + +static const uint16_t ud_itab__177[] = { + /* 0 */ 186, 0, 0, 187, +}; + +static const uint16_t ud_itab__178[] = { + /* 0 */ 0, 0, 0, 188, +}; + +static const uint16_t ud_itab__179[] = { + /* 0 */ 0, 0, 0, 189, +}; + +static const uint16_t ud_itab__180[] = { + /* 0 */ 0, 0, 0, 190, +}; + +static const uint16_t ud_itab__181[] = { + /* 0 */ 0, 0, 0, 191, +}; + +static const uint16_t ud_itab__182[] = { + /* 0 */ 192, 0, 0, 193, +}; + +static const uint16_t ud_itab__183[] = { + /* 0 */ 194, 0, 0, 195, +}; + +static const uint16_t ud_itab__184[] = { + /* 0 */ 196, 0, 0, 197, +}; + +static const uint16_t ud_itab__185[] = { + /* 0 */ 0, 0, 0, 198, +}; + +static const uint16_t ud_itab__186[] = { + /* 0 */ 0, 0, 0, 199, +}; + +static const uint16_t ud_itab__187[] = { + /* 0 */ 0, 0, 0, 200, +}; + +static const uint16_t ud_itab__188[] = { + /* 0 */ 0, 0, 0, 201, +}; + +static const uint16_t ud_itab__189[] = { + /* 0 */ 0, 0, 0, 202, +}; + +static const uint16_t ud_itab__190[] = { + /* 0 */ 0, 0, 0, 203, +}; + +static const uint16_t ud_itab__191[] = { + /* 0 */ 0, 0, 0, 204, +}; + +static const uint16_t ud_itab__192[] = { + /* 0 */ 0, 0, 0, 205, +}; + +static const uint16_t ud_itab__193[] = { + /* 0 */ 0, 0, 0, 206, +}; + +static const uint16_t ud_itab__194[] = { + /* 0 */ 0, 0, 0, 207, +}; + +static const uint16_t ud_itab__195[] = { + /* 0 */ 0, 0, 0, 208, +}; + +static const uint16_t ud_itab__196[] = { + /* 0 */ 0, 0, 0, 209, +}; + +static const uint16_t ud_itab__197[] = { + /* 0 */ 0, 0, 0, 210, +}; + +static const uint16_t ud_itab__198[] = { + /* 0 */ 0, 0, 0, 211, +}; + +static const uint16_t ud_itab__199[] = { + /* 0 */ 0, 0, 0, 212, +}; + +static const uint16_t ud_itab__200[] = { + /* 0 */ 0, 0, 0, 213, +}; + +static const uint16_t ud_itab__201[] = { + /* 0 */ 0, 0, 0, 214, +}; + +static const uint16_t ud_itab__202[] = { + /* 0 */ 0, 0, 0, 215, +}; + +static const uint16_t ud_itab__203[] = { + /* 0 */ 0, 0, 0, 216, +}; + +static const uint16_t ud_itab__204[] = { + /* 0 */ 0, 0, 0, 217, +}; + +static const uint16_t ud_itab__205[] = { + /* 0 */ 0, 0, 0, 218, +}; + +static const uint16_t ud_itab__206[] = { + /* 0 */ 0, 0, 0, 219, +}; + +static const uint16_t ud_itab__207[] = { + /* 0 */ 0, 0, 0, 220, +}; + +static const uint16_t ud_itab__208[] = { + /* 0 */ 0, 0, 0, 221, +}; + +static const uint16_t ud_itab__209[] = { + /* 0 */ 0, 0, 0, 222, +}; + +static const uint16_t ud_itab__210[] = { + /* 0 */ 0, 0, 0, 223, +}; + +static const uint16_t ud_itab__211[] = { + /* 0 */ 0, 0, 0, 224, +}; + +static const uint16_t ud_itab__214[] = { + /* 0 */ 0, 225, 0, +}; + +static const uint16_t ud_itab__213[] = { + /* 0 */ 0, GROUP(214), +}; + +static const uint16_t ud_itab__212[] = { + /* 0 */ 0, 0, 0, GROUP(213), +}; + +static const uint16_t ud_itab__217[] = { + /* 0 */ 0, 226, 0, +}; + +static const uint16_t ud_itab__216[] = { + /* 0 */ 0, GROUP(217), +}; + +static const uint16_t ud_itab__215[] = { + /* 0 */ 0, 0, 0, GROUP(216), +}; + +static const uint16_t ud_itab__218[] = { + /* 0 */ 0, 0, 0, 227, +}; + +static const uint16_t ud_itab__219[] = { + /* 0 */ 0, 0, 0, 228, +}; + +static const uint16_t ud_itab__220[] = { + /* 0 */ 0, 0, 0, 229, +}; + +static const uint16_t ud_itab__221[] = { + /* 0 */ 0, 0, 0, 230, +}; + +static const uint16_t ud_itab__222[] = { + /* 0 */ 0, 0, 0, 231, +}; + +static const uint16_t ud_itab__223[] = { + /* 0 */ 232, 233, 0, 0, +}; + +static const uint16_t ud_itab__224[] = { + /* 0 */ 234, 235, 0, 0, +}; + +static const uint16_t ud_itab__165[] = { + /* 0 */ GROUP(166), GROUP(167), GROUP(168), GROUP(169), + /* 4 */ GROUP(170), GROUP(171), GROUP(172), GROUP(173), + /* 8 */ GROUP(174), GROUP(175), GROUP(176), GROUP(177), + /* c */ 0, 0, 0, 0, + /* 10 */ GROUP(178), 0, 0, 0, + /* 14 */ GROUP(179), GROUP(180), 0, GROUP(181), + /* 18 */ 0, 0, 0, 0, + /* 1c */ GROUP(182), GROUP(183), GROUP(184), 0, + /* 20 */ GROUP(185), GROUP(186), GROUP(187), GROUP(188), + /* 24 */ GROUP(189), GROUP(190), 0, 0, + /* 28 */ GROUP(191), GROUP(192), GROUP(193), GROUP(194), + /* 2c */ 0, 0, 0, 0, + /* 30 */ GROUP(195), GROUP(196), GROUP(197), GROUP(198), + /* 34 */ GROUP(199), GROUP(200), 0, GROUP(201), + /* 38 */ GROUP(202), GROUP(203), GROUP(204), GROUP(205), + /* 3c */ GROUP(206), GROUP(207), GROUP(208), GROUP(209), + /* 40 */ GROUP(210), GROUP(211), 0, 0, + /* 44 */ 0, 0, 0, 0, + /* 48 */ 0, 0, 0, 0, + /* 4c */ 0, 0, 0, 0, + /* 50 */ 0, 0, 0, 0, + /* 54 */ 0, 0, 0, 0, + /* 58 */ 0, 0, 0, 0, + /* 5c */ 0, 0, 0, 0, + /* 60 */ 0, 0, 0, 0, + /* 64 */ 0, 0, 0, 0, + /* 68 */ 0, 0, 0, 0, + /* 6c */ 0, 0, 0, 0, + /* 70 */ 0, 0, 0, 0, + /* 74 */ 0, 0, 0, 0, + /* 78 */ 0, 0, 0, 0, + /* 7c */ 0, 0, 0, 0, + /* 80 */ GROUP(212), GROUP(215), 0, 0, + /* 84 */ 0, 0, 0, 0, + /* 88 */ 0, 0, 0, 0, + /* 8c */ 0, 0, 0, 0, + /* 90 */ 0, 0, 0, 0, + /* 94 */ 0, 0, 0, 0, + /* 98 */ 0, 0, 0, 0, + /* 9c */ 0, 0, 0, 0, + /* a0 */ 0, 0, 0, 0, + /* a4 */ 0, 0, 0, 0, + /* a8 */ 0, 0, 0, 0, + /* ac */ 0, 0, 0, 0, + /* b0 */ 0, 0, 0, 0, + /* b4 */ 0, 0, 0, 0, + /* b8 */ 0, 0, 0, 0, + /* bc */ 0, 0, 0, 0, + /* c0 */ 0, 0, 0, 0, + /* c4 */ 0, 0, 0, 0, + /* c8 */ 0, 0, 0, 0, + /* cc */ 0, 0, 0, 0, + /* d0 */ 0, 0, 0, 0, + /* d4 */ 0, 0, 0, 0, + /* d8 */ 0, 0, 0, GROUP(218), + /* dc */ GROUP(219), GROUP(220), GROUP(221), GROUP(222), + /* e0 */ 0, 0, 0, 0, + /* e4 */ 0, 0, 0, 0, + /* e8 */ 0, 0, 0, 0, + /* ec */ 0, 0, 0, 0, + /* f0 */ GROUP(223), GROUP(224), 0, 0, + /* f4 */ 0, 0, 0, 0, + /* f8 */ 0, 0, 0, 0, + /* fc */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__226[] = { + /* 0 */ 0, 0, 0, 236, +}; + +static const uint16_t ud_itab__227[] = { + /* 0 */ 0, 0, 0, 237, +}; + +static const uint16_t ud_itab__228[] = { + /* 0 */ 0, 0, 0, 238, +}; + +static const uint16_t ud_itab__229[] = { + /* 0 */ 0, 0, 0, 239, +}; + +static const uint16_t ud_itab__230[] = { + /* 0 */ 0, 0, 0, 240, +}; + +static const uint16_t ud_itab__231[] = { + /* 0 */ 0, 0, 0, 241, +}; + +static const uint16_t ud_itab__232[] = { + /* 0 */ 0, 0, 0, 242, +}; + +static const uint16_t ud_itab__233[] = { + /* 0 */ 243, 0, 0, 244, +}; + +static const uint16_t ud_itab__234[] = { + /* 0 */ 0, 0, 0, 245, +}; + +static const uint16_t ud_itab__235[] = { + /* 0 */ 0, 0, 0, 246, +}; + +static const uint16_t ud_itab__237[] = { + /* 0 */ 247, 248, 249, +}; + +static const uint16_t ud_itab__236[] = { + /* 0 */ 0, 0, 0, GROUP(237), +}; + +static const uint16_t ud_itab__238[] = { + /* 0 */ 0, 0, 0, 250, +}; + +static const uint16_t ud_itab__239[] = { + /* 0 */ 0, 0, 0, 251, +}; + +static const uint16_t ud_itab__240[] = { + /* 0 */ 0, 0, 0, 252, +}; + +static const uint16_t ud_itab__242[] = { + /* 0 */ 253, 254, 255, +}; + +static const uint16_t ud_itab__241[] = { + /* 0 */ 0, 0, 0, GROUP(242), +}; + +static const uint16_t ud_itab__243[] = { + /* 0 */ 0, 0, 0, 256, +}; + +static const uint16_t ud_itab__244[] = { + /* 0 */ 0, 0, 0, 257, +}; + +static const uint16_t ud_itab__245[] = { + /* 0 */ 0, 0, 0, 258, +}; + +static const uint16_t ud_itab__246[] = { + /* 0 */ 0, 0, 0, 259, +}; + +static const uint16_t ud_itab__247[] = { + /* 0 */ 0, 0, 0, 260, +}; + +static const uint16_t ud_itab__248[] = { + /* 0 */ 0, 0, 0, 261, +}; + +static const uint16_t ud_itab__249[] = { + /* 0 */ 0, 0, 0, 262, +}; + +static const uint16_t ud_itab__250[] = { + /* 0 */ 0, 0, 0, 263, +}; + +static const uint16_t ud_itab__251[] = { + /* 0 */ 0, 0, 0, 264, +}; + +static const uint16_t ud_itab__225[] = { + /* 0 */ 0, 0, 0, 0, + /* 4 */ 0, 0, 0, 0, + /* 8 */ GROUP(226), GROUP(227), GROUP(228), GROUP(229), + /* c */ GROUP(230), GROUP(231), GROUP(232), GROUP(233), + /* 10 */ 0, 0, 0, 0, + /* 14 */ GROUP(234), GROUP(235), GROUP(236), GROUP(238), + /* 18 */ 0, 0, 0, 0, + /* 1c */ 0, 0, 0, 0, + /* 20 */ GROUP(239), GROUP(240), GROUP(241), 0, + /* 24 */ 0, 0, 0, 0, + /* 28 */ 0, 0, 0, 0, + /* 2c */ 0, 0, 0, 0, + /* 30 */ 0, 0, 0, 0, + /* 34 */ 0, 0, 0, 0, + /* 38 */ 0, 0, 0, 0, + /* 3c */ 0, 0, 0, 0, + /* 40 */ GROUP(243), GROUP(244), GROUP(245), 0, + /* 44 */ GROUP(246), 0, 0, 0, + /* 48 */ 0, 0, 0, 0, + /* 4c */ 0, 0, 0, 0, + /* 50 */ 0, 0, 0, 0, + /* 54 */ 0, 0, 0, 0, + /* 58 */ 0, 0, 0, 0, + /* 5c */ 0, 0, 0, 0, + /* 60 */ GROUP(247), GROUP(248), GROUP(249), GROUP(250), + /* 64 */ 0, 0, 0, 0, + /* 68 */ 0, 0, 0, 0, + /* 6c */ 0, 0, 0, 0, + /* 70 */ 0, 0, 0, 0, + /* 74 */ 0, 0, 0, 0, + /* 78 */ 0, 0, 0, 0, + /* 7c */ 0, 0, 0, 0, + /* 80 */ 0, 0, 0, 0, + /* 84 */ 0, 0, 0, 0, + /* 88 */ 0, 0, 0, 0, + /* 8c */ 0, 0, 0, 0, + /* 90 */ 0, 0, 0, 0, + /* 94 */ 0, 0, 0, 0, + /* 98 */ 0, 0, 0, 0, + /* 9c */ 0, 0, 0, 0, + /* a0 */ 0, 0, 0, 0, + /* a4 */ 0, 0, 0, 0, + /* a8 */ 0, 0, 0, 0, + /* ac */ 0, 0, 0, 0, + /* b0 */ 0, 0, 0, 0, + /* b4 */ 0, 0, 0, 0, + /* b8 */ 0, 0, 0, 0, + /* bc */ 0, 0, 0, 0, + /* c0 */ 0, 0, 0, 0, + /* c4 */ 0, 0, 0, 0, + /* c8 */ 0, 0, 0, 0, + /* cc */ 0, 0, 0, 0, + /* d0 */ 0, 0, 0, 0, + /* d4 */ 0, 0, 0, 0, + /* d8 */ 0, 0, 0, 0, + /* dc */ 0, 0, 0, GROUP(251), + /* e0 */ 0, 0, 0, 0, + /* e4 */ 0, 0, 0, 0, + /* e8 */ 0, 0, 0, 0, + /* ec */ 0, 0, 0, 0, + /* f0 */ 0, 0, 0, 0, + /* f4 */ 0, 0, 0, 0, + /* f8 */ 0, 0, 0, 0, + /* fc */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__252[] = { + /* 0 */ 265, 0, 0, 0, +}; + +static const uint16_t ud_itab__253[] = { + /* 0 */ 266, 0, 0, 0, +}; + +static const uint16_t ud_itab__254[] = { + /* 0 */ 267, 0, 0, 0, +}; + +static const uint16_t ud_itab__255[] = { + /* 0 */ 268, 0, 0, 0, +}; + +static const uint16_t ud_itab__256[] = { + /* 0 */ 269, 0, 0, 0, +}; + +static const uint16_t ud_itab__257[] = { + /* 0 */ 270, 0, 0, 0, +}; + +static const uint16_t ud_itab__258[] = { + /* 0 */ 271, 0, 0, 0, +}; + +static const uint16_t ud_itab__259[] = { + /* 0 */ 272, 0, 0, 0, +}; + +static const uint16_t ud_itab__260[] = { + /* 0 */ 273, 0, 0, 0, +}; + +static const uint16_t ud_itab__261[] = { + /* 0 */ 274, 0, 0, 0, +}; + +static const uint16_t ud_itab__262[] = { + /* 0 */ 275, 0, 0, 0, +}; + +static const uint16_t ud_itab__263[] = { + /* 0 */ 276, 0, 0, 0, +}; + +static const uint16_t ud_itab__264[] = { + /* 0 */ 277, 0, 0, 0, +}; + +static const uint16_t ud_itab__265[] = { + /* 0 */ 278, 0, 0, 0, +}; + +static const uint16_t ud_itab__266[] = { + /* 0 */ 279, 0, 0, 0, +}; + +static const uint16_t ud_itab__267[] = { + /* 0 */ 280, 0, 0, 0, +}; + +static const uint16_t ud_itab__268[] = { + /* 0 */ 281, 0, 0, 282, +}; + +static const uint16_t ud_itab__269[] = { + /* 0 */ 283, 284, 285, 286, +}; + +static const uint16_t ud_itab__270[] = { + /* 0 */ 287, 0, 288, 0, +}; + +static const uint16_t ud_itab__271[] = { + /* 0 */ 289, 0, 290, 0, +}; + +static const uint16_t ud_itab__272[] = { + /* 0 */ 291, 0, 0, 292, +}; + +static const uint16_t ud_itab__273[] = { + /* 0 */ 293, 0, 0, 294, +}; + +static const uint16_t ud_itab__274[] = { + /* 0 */ 295, 0, 0, 296, +}; + +static const uint16_t ud_itab__275[] = { + /* 0 */ 297, 0, 0, 298, +}; + +static const uint16_t ud_itab__276[] = { + /* 0 */ 299, 300, 301, 302, +}; + +static const uint16_t ud_itab__277[] = { + /* 0 */ 303, 304, 305, 306, +}; + +static const uint16_t ud_itab__278[] = { + /* 0 */ 307, 308, 309, 310, +}; + +static const uint16_t ud_itab__279[] = { + /* 0 */ 311, 0, 312, 313, +}; + +static const uint16_t ud_itab__280[] = { + /* 0 */ 314, 315, 316, 317, +}; + +static const uint16_t ud_itab__281[] = { + /* 0 */ 318, 319, 320, 321, +}; + +static const uint16_t ud_itab__282[] = { + /* 0 */ 322, 323, 324, 325, +}; + +static const uint16_t ud_itab__283[] = { + /* 0 */ 326, 327, 328, 329, +}; + +static const uint16_t ud_itab__284[] = { + /* 0 */ 330, 0, 0, 331, +}; + +static const uint16_t ud_itab__285[] = { + /* 0 */ 332, 0, 0, 333, +}; + +static const uint16_t ud_itab__286[] = { + /* 0 */ 334, 0, 0, 335, +}; + +static const uint16_t ud_itab__287[] = { + /* 0 */ 336, 0, 0, 337, +}; + +static const uint16_t ud_itab__288[] = { + /* 0 */ 338, 0, 0, 339, +}; + +static const uint16_t ud_itab__289[] = { + /* 0 */ 340, 0, 0, 341, +}; + +static const uint16_t ud_itab__290[] = { + /* 0 */ 342, 0, 0, 343, +}; + +static const uint16_t ud_itab__291[] = { + /* 0 */ 344, 0, 0, 345, +}; + +static const uint16_t ud_itab__292[] = { + /* 0 */ 346, 0, 0, 347, +}; + +static const uint16_t ud_itab__293[] = { + /* 0 */ 348, 0, 0, 349, +}; + +static const uint16_t ud_itab__294[] = { + /* 0 */ 350, 0, 0, 351, +}; + +static const uint16_t ud_itab__295[] = { + /* 0 */ 352, 0, 0, 353, +}; + +static const uint16_t ud_itab__296[] = { + /* 0 */ 0, 0, 0, 354, +}; + +static const uint16_t ud_itab__297[] = { + /* 0 */ 0, 0, 0, 355, +}; + +static const uint16_t ud_itab__298[] = { + /* 0 */ 356, 0, 0, 357, +}; + +static const uint16_t ud_itab__299[] = { + /* 0 */ 358, 0, 359, 360, +}; + +static const uint16_t ud_itab__300[] = { + /* 0 */ 361, 362, 363, 364, +}; + +static const uint16_t ud_itab__302[] = { + /* 0 */ 365, 0, 0, 366, +}; + +static const uint16_t ud_itab__303[] = { + /* 0 */ 367, 0, 0, 368, +}; + +static const uint16_t ud_itab__304[] = { + /* 0 */ 369, 0, 0, 370, +}; + +static const uint16_t ud_itab__301[] = { + /* 0 */ 0, 0, GROUP(302), 0, + /* 4 */ GROUP(303), 0, GROUP(304), 0, +}; + +static const uint16_t ud_itab__306[] = { + /* 0 */ 371, 0, 0, 372, +}; + +static const uint16_t ud_itab__307[] = { + /* 0 */ 373, 0, 0, 374, +}; + +static const uint16_t ud_itab__308[] = { + /* 0 */ 375, 0, 0, 376, +}; + +static const uint16_t ud_itab__305[] = { + /* 0 */ 0, 0, GROUP(306), 0, + /* 4 */ GROUP(307), 0, GROUP(308), 0, +}; + +static const uint16_t ud_itab__310[] = { + /* 0 */ 377, 0, 0, 378, +}; + +static const uint16_t ud_itab__311[] = { + /* 0 */ 0, 0, 0, 379, +}; + +static const uint16_t ud_itab__312[] = { + /* 0 */ 380, 0, 0, 381, +}; + +static const uint16_t ud_itab__313[] = { + /* 0 */ 0, 0, 0, 382, +}; + +static const uint16_t ud_itab__309[] = { + /* 0 */ 0, 0, GROUP(310), GROUP(311), + /* 4 */ 0, 0, GROUP(312), GROUP(313), +}; + +static const uint16_t ud_itab__314[] = { + /* 0 */ 383, 0, 0, 384, +}; + +static const uint16_t ud_itab__315[] = { + /* 0 */ 385, 0, 0, 386, +}; + +static const uint16_t ud_itab__316[] = { + /* 0 */ 387, 0, 0, 388, +}; + +static const uint16_t ud_itab__317[] = { + /* 0 */ 389, 0, 0, 0, +}; + +static const uint16_t ud_itab__319[] = { + /* 0 */ 0, 390, 0, +}; + +static const uint16_t ud_itab__318[] = { + /* 0 */ GROUP(319), 0, 0, 0, +}; + +static const uint16_t ud_itab__321[] = { + /* 0 */ 0, 391, 0, +}; + +static const uint16_t ud_itab__320[] = { + /* 0 */ GROUP(321), 0, 0, 0, +}; + +static const uint16_t ud_itab__322[] = { + /* 0 */ 0, 392, 0, 393, +}; + +static const uint16_t ud_itab__323[] = { + /* 0 */ 0, 394, 0, 395, +}; + +static const uint16_t ud_itab__324[] = { + /* 0 */ 396, 0, 397, 398, +}; + +static const uint16_t ud_itab__325[] = { + /* 0 */ 399, 0, 400, 401, +}; + +static const uint16_t ud_itab__326[] = { + /* 0 */ 402, 0, 0, 0, +}; + +static const uint16_t ud_itab__327[] = { + /* 0 */ 403, 0, 0, 0, +}; + +static const uint16_t ud_itab__328[] = { + /* 0 */ 404, 0, 0, 0, +}; + +static const uint16_t ud_itab__329[] = { + /* 0 */ 405, 0, 0, 0, +}; + +static const uint16_t ud_itab__330[] = { + /* 0 */ 406, 0, 0, 0, +}; + +static const uint16_t ud_itab__331[] = { + /* 0 */ 407, 0, 0, 0, +}; + +static const uint16_t ud_itab__332[] = { + /* 0 */ 408, 0, 0, 0, +}; + +static const uint16_t ud_itab__333[] = { + /* 0 */ 409, 0, 0, 0, +}; + +static const uint16_t ud_itab__334[] = { + /* 0 */ 410, 0, 0, 0, +}; + +static const uint16_t ud_itab__335[] = { + /* 0 */ 411, 0, 0, 0, +}; + +static const uint16_t ud_itab__336[] = { + /* 0 */ 412, 0, 0, 0, +}; + +static const uint16_t ud_itab__337[] = { + /* 0 */ 413, 0, 0, 0, +}; + +static const uint16_t ud_itab__338[] = { + /* 0 */ 414, 0, 0, 0, +}; + +static const uint16_t ud_itab__339[] = { + /* 0 */ 415, 0, 0, 0, +}; + +static const uint16_t ud_itab__340[] = { + /* 0 */ 416, 0, 0, 0, +}; + +static const uint16_t ud_itab__341[] = { + /* 0 */ 417, 0, 0, 0, +}; + +static const uint16_t ud_itab__342[] = { + /* 0 */ 418, 0, 0, 0, +}; + +static const uint16_t ud_itab__343[] = { + /* 0 */ 419, 0, 0, 0, +}; + +static const uint16_t ud_itab__344[] = { + /* 0 */ 420, 0, 0, 0, +}; + +static const uint16_t ud_itab__345[] = { + /* 0 */ 421, 0, 0, 0, +}; + +static const uint16_t ud_itab__346[] = { + /* 0 */ 422, 0, 0, 0, +}; + +static const uint16_t ud_itab__347[] = { + /* 0 */ 423, 0, 0, 0, +}; + +static const uint16_t ud_itab__348[] = { + /* 0 */ 424, 0, 0, 0, +}; + +static const uint16_t ud_itab__349[] = { + /* 0 */ 425, 0, 0, 0, +}; + +static const uint16_t ud_itab__350[] = { + /* 0 */ 426, 0, 0, 0, +}; + +static const uint16_t ud_itab__351[] = { + /* 0 */ 427, 0, 0, 0, +}; + +static const uint16_t ud_itab__352[] = { + /* 0 */ 428, 0, 0, 0, +}; + +static const uint16_t ud_itab__353[] = { + /* 0 */ 429, 0, 0, 0, +}; + +static const uint16_t ud_itab__354[] = { + /* 0 */ 430, 0, 0, 0, +}; + +static const uint16_t ud_itab__355[] = { + /* 0 */ 431, 0, 0, 0, +}; + +static const uint16_t ud_itab__356[] = { + /* 0 */ 432, 0, 0, 0, +}; + +static const uint16_t ud_itab__357[] = { + /* 0 */ 433, 0, 0, 0, +}; + +static const uint16_t ud_itab__358[] = { + /* 0 */ 434, 0, 0, 0, +}; + +static const uint16_t ud_itab__359[] = { + /* 0 */ 435, 0, 0, 0, +}; + +static const uint16_t ud_itab__360[] = { + /* 0 */ 436, 0, 0, 0, +}; + +static const uint16_t ud_itab__361[] = { + /* 0 */ 437, 0, 0, 0, +}; + +static const uint16_t ud_itab__362[] = { + /* 0 */ 438, 0, 0, 0, +}; + +static const uint16_t ud_itab__363[] = { + /* 0 */ 439, 0, 0, 0, +}; + +static const uint16_t ud_itab__368[] = { + /* 0 */ 0, 440, +}; + +static const uint16_t ud_itab__367[] = { + /* 0 */ GROUP(368), 0, 0, 0, +}; + +static const uint16_t ud_itab__366[] = { + /* 0 */ GROUP(367), 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__371[] = { + /* 0 */ 0, 441, +}; + +static const uint16_t ud_itab__370[] = { + /* 0 */ GROUP(371), 0, 0, 0, +}; + +static const uint16_t ud_itab__369[] = { + /* 0 */ GROUP(370), 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__374[] = { + /* 0 */ 0, 442, +}; + +static const uint16_t ud_itab__373[] = { + /* 0 */ GROUP(374), 0, 0, 0, +}; + +static const uint16_t ud_itab__372[] = { + /* 0 */ GROUP(373), 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__365[] = { + /* 0 */ GROUP(366), GROUP(369), GROUP(372), 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__364[] = { + /* 0 */ 0, GROUP(365), +}; + +static const uint16_t ud_itab__379[] = { + /* 0 */ 0, 443, +}; + +static const uint16_t ud_itab__378[] = { + /* 0 */ GROUP(379), 0, 0, 0, +}; + +static const uint16_t ud_itab__377[] = { + /* 0 */ GROUP(378), 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__382[] = { + /* 0 */ 0, 444, +}; + +static const uint16_t ud_itab__381[] = { + /* 0 */ GROUP(382), 0, 0, 0, +}; + +static const uint16_t ud_itab__380[] = { + /* 0 */ GROUP(381), 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__385[] = { + /* 0 */ 0, 445, +}; + +static const uint16_t ud_itab__384[] = { + /* 0 */ GROUP(385), 0, 0, 0, +}; + +static const uint16_t ud_itab__383[] = { + /* 0 */ GROUP(384), 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__388[] = { + /* 0 */ 0, 446, +}; + +static const uint16_t ud_itab__387[] = { + /* 0 */ GROUP(388), 0, 0, 0, +}; + +static const uint16_t ud_itab__386[] = { + /* 0 */ GROUP(387), 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__391[] = { + /* 0 */ 0, 447, +}; + +static const uint16_t ud_itab__390[] = { + /* 0 */ GROUP(391), 0, 0, 0, +}; + +static const uint16_t ud_itab__389[] = { + /* 0 */ GROUP(390), 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__394[] = { + /* 0 */ 0, 448, +}; + +static const uint16_t ud_itab__393[] = { + /* 0 */ GROUP(394), 0, 0, 0, +}; + +static const uint16_t ud_itab__392[] = { + /* 0 */ GROUP(393), 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__376[] = { + /* 0 */ GROUP(377), GROUP(380), GROUP(383), GROUP(386), + /* 4 */ GROUP(389), GROUP(392), 0, 0, +}; + +static const uint16_t ud_itab__375[] = { + /* 0 */ 0, GROUP(376), +}; + +static const uint16_t ud_itab__395[] = { + /* 0 */ 449, 0, 0, 0, +}; + +static const uint16_t ud_itab__396[] = { + /* 0 */ 450, 0, 0, 0, +}; + +static const uint16_t ud_itab__397[] = { + /* 0 */ 451, 0, 0, 0, +}; + +static const uint16_t ud_itab__398[] = { + /* 0 */ 452, 0, 0, 0, +}; + +static const uint16_t ud_itab__399[] = { + /* 0 */ 453, 0, 0, 0, +}; + +static const uint16_t ud_itab__400[] = { + /* 0 */ 454, 0, 0, 0, +}; + +static const uint16_t ud_itab__404[] = { + /* 0 */ 455, 0, +}; + +static const uint16_t ud_itab__403[] = { + /* 0 */ GROUP(404), 0, 0, 0, +}; + +static const uint16_t ud_itab__406[] = { + /* 0 */ 456, 0, +}; + +static const uint16_t ud_itab__405[] = { + /* 0 */ GROUP(406), 0, 0, 0, +}; + +static const uint16_t ud_itab__408[] = { + /* 0 */ 457, 0, +}; + +static const uint16_t ud_itab__407[] = { + /* 0 */ GROUP(408), 0, 0, 0, +}; + +static const uint16_t ud_itab__410[] = { + /* 0 */ 458, 0, +}; + +static const uint16_t ud_itab__409[] = { + /* 0 */ GROUP(410), 0, 0, 0, +}; + +static const uint16_t ud_itab__412[] = { + /* 0 */ 459, 0, +}; + +static const uint16_t ud_itab__411[] = { + /* 0 */ GROUP(412), 0, 0, 0, +}; + +static const uint16_t ud_itab__414[] = { + /* 0 */ 460, 0, +}; + +static const uint16_t ud_itab__413[] = { + /* 0 */ GROUP(414), 0, 0, 0, +}; + +static const uint16_t ud_itab__416[] = { + /* 0 */ 461, 0, +}; + +static const uint16_t ud_itab__415[] = { + /* 0 */ GROUP(416), 0, 0, 0, +}; + +static const uint16_t ud_itab__402[] = { + /* 0 */ GROUP(403), GROUP(405), GROUP(407), GROUP(409), + /* 4 */ GROUP(411), GROUP(413), 0, GROUP(415), +}; + +static const uint16_t ud_itab__420[] = { + /* 0 */ 0, 462, +}; + +static const uint16_t ud_itab__419[] = { + /* 0 */ GROUP(420), 0, 0, 0, +}; + +static const uint16_t ud_itab__422[] = { + /* 0 */ 0, 463, +}; + +static const uint16_t ud_itab__421[] = { + /* 0 */ GROUP(422), 0, 0, 0, +}; + +static const uint16_t ud_itab__424[] = { + /* 0 */ 0, 464, +}; + +static const uint16_t ud_itab__423[] = { + /* 0 */ GROUP(424), 0, 0, 0, +}; + +static const uint16_t ud_itab__426[] = { + /* 0 */ 0, 465, +}; + +static const uint16_t ud_itab__425[] = { + /* 0 */ GROUP(426), 0, 0, 0, +}; + +static const uint16_t ud_itab__428[] = { + /* 0 */ 0, 466, +}; + +static const uint16_t ud_itab__427[] = { + /* 0 */ GROUP(428), 0, 0, 0, +}; + +static const uint16_t ud_itab__430[] = { + /* 0 */ 0, 467, +}; + +static const uint16_t ud_itab__429[] = { + /* 0 */ GROUP(430), 0, 0, 0, +}; + +static const uint16_t ud_itab__432[] = { + /* 0 */ 0, 468, +}; + +static const uint16_t ud_itab__431[] = { + /* 0 */ GROUP(432), 0, 0, 0, +}; + +static const uint16_t ud_itab__434[] = { + /* 0 */ 0, 469, +}; + +static const uint16_t ud_itab__433[] = { + /* 0 */ GROUP(434), 0, 0, 0, +}; + +static const uint16_t ud_itab__418[] = { + /* 0 */ GROUP(419), GROUP(421), GROUP(423), GROUP(425), + /* 4 */ GROUP(427), GROUP(429), GROUP(431), GROUP(433), +}; + +static const uint16_t ud_itab__437[] = { + /* 0 */ 0, 470, +}; + +static const uint16_t ud_itab__436[] = { + /* 0 */ GROUP(437), 0, 0, 0, +}; + +static const uint16_t ud_itab__439[] = { + /* 0 */ 0, 471, +}; + +static const uint16_t ud_itab__438[] = { + /* 0 */ GROUP(439), 0, 0, 0, +}; + +static const uint16_t ud_itab__441[] = { + /* 0 */ 0, 472, +}; + +static const uint16_t ud_itab__440[] = { + /* 0 */ GROUP(441), 0, 0, 0, +}; + +static const uint16_t ud_itab__443[] = { + /* 0 */ 0, 473, +}; + +static const uint16_t ud_itab__442[] = { + /* 0 */ GROUP(443), 0, 0, 0, +}; + +static const uint16_t ud_itab__445[] = { + /* 0 */ 0, 474, +}; + +static const uint16_t ud_itab__444[] = { + /* 0 */ GROUP(445), 0, 0, 0, +}; + +static const uint16_t ud_itab__447[] = { + /* 0 */ 0, 475, +}; + +static const uint16_t ud_itab__446[] = { + /* 0 */ GROUP(447), 0, 0, 0, +}; + +static const uint16_t ud_itab__449[] = { + /* 0 */ 0, 476, +}; + +static const uint16_t ud_itab__448[] = { + /* 0 */ GROUP(449), 0, 0, 0, +}; + +static const uint16_t ud_itab__451[] = { + /* 0 */ 0, 477, +}; + +static const uint16_t ud_itab__450[] = { + /* 0 */ GROUP(451), 0, 0, 0, +}; + +static const uint16_t ud_itab__435[] = { + /* 0 */ GROUP(436), GROUP(438), GROUP(440), GROUP(442), + /* 4 */ GROUP(444), GROUP(446), GROUP(448), GROUP(450), +}; + +static const uint16_t ud_itab__454[] = { + /* 0 */ 0, 478, +}; + +static const uint16_t ud_itab__453[] = { + /* 0 */ GROUP(454), 0, 0, 0, +}; + +static const uint16_t ud_itab__456[] = { + /* 0 */ 0, 479, +}; + +static const uint16_t ud_itab__455[] = { + /* 0 */ GROUP(456), 0, 0, 0, +}; + +static const uint16_t ud_itab__458[] = { + /* 0 */ 0, 480, +}; + +static const uint16_t ud_itab__457[] = { + /* 0 */ GROUP(458), 0, 0, 0, +}; + +static const uint16_t ud_itab__460[] = { + /* 0 */ 0, 481, +}; + +static const uint16_t ud_itab__459[] = { + /* 0 */ GROUP(460), 0, 0, 0, +}; + +static const uint16_t ud_itab__462[] = { + /* 0 */ 0, 482, +}; + +static const uint16_t ud_itab__461[] = { + /* 0 */ GROUP(462), 0, 0, 0, +}; + +static const uint16_t ud_itab__464[] = { + /* 0 */ 0, 483, +}; + +static const uint16_t ud_itab__463[] = { + /* 0 */ GROUP(464), 0, 0, 0, +}; + +static const uint16_t ud_itab__466[] = { + /* 0 */ 0, 484, +}; + +static const uint16_t ud_itab__465[] = { + /* 0 */ GROUP(466), 0, 0, 0, +}; + +static const uint16_t ud_itab__468[] = { + /* 0 */ 0, 485, +}; + +static const uint16_t ud_itab__467[] = { + /* 0 */ GROUP(468), 0, 0, 0, +}; + +static const uint16_t ud_itab__452[] = { + /* 0 */ GROUP(453), GROUP(455), GROUP(457), GROUP(459), + /* 4 */ GROUP(461), GROUP(463), GROUP(465), GROUP(467), +}; + +static const uint16_t ud_itab__417[] = { + /* 0 */ 0, 0, 0, 0, + /* 4 */ 0, GROUP(418), GROUP(435), GROUP(452), +}; + +static const uint16_t ud_itab__401[] = { + /* 0 */ GROUP(402), GROUP(417), +}; + +static const uint16_t ud_itab__469[] = { + /* 0 */ 486, 0, 0, 0, +}; + +static const uint16_t ud_itab__470[] = { + /* 0 */ 487, 0, 0, 0, +}; + +static const uint16_t ud_itab__471[] = { + /* 0 */ 488, 0, 0, 0, +}; + +static const uint16_t ud_itab__472[] = { + /* 0 */ 489, 0, 0, 0, +}; + +static const uint16_t ud_itab__473[] = { + /* 0 */ 490, 0, 0, 0, +}; + +static const uint16_t ud_itab__474[] = { + /* 0 */ 491, 0, 0, 0, +}; + +static const uint16_t ud_itab__475[] = { + /* 0 */ 492, 0, 0, 0, +}; + +static const uint16_t ud_itab__476[] = { + /* 0 */ 493, 0, 0, 0, +}; + +static const uint16_t ud_itab__477[] = { + /* 0 */ 494, 0, 0, 0, +}; + +static const uint16_t ud_itab__478[] = { + /* 0 */ 0, 0, 495, 0, +}; + +static const uint16_t ud_itab__480[] = { + /* 0 */ 496, 0, 0, 0, +}; + +static const uint16_t ud_itab__481[] = { + /* 0 */ 497, 0, 0, 0, +}; + +static const uint16_t ud_itab__482[] = { + /* 0 */ 498, 0, 0, 0, +}; + +static const uint16_t ud_itab__483[] = { + /* 0 */ 499, 0, 0, 0, +}; + +static const uint16_t ud_itab__479[] = { + /* 0 */ 0, 0, 0, 0, + /* 4 */ GROUP(480), GROUP(481), GROUP(482), GROUP(483), +}; + +static const uint16_t ud_itab__484[] = { + /* 0 */ 500, 0, 0, 0, +}; + +static const uint16_t ud_itab__485[] = { + /* 0 */ 501, 0, 0, 0, +}; + +static const uint16_t ud_itab__486[] = { + /* 0 */ 502, 0, 0, 0, +}; + +static const uint16_t ud_itab__487[] = { + /* 0 */ 503, 0, 0, 0, +}; + +static const uint16_t ud_itab__488[] = { + /* 0 */ 504, 0, 0, 0, +}; + +static const uint16_t ud_itab__489[] = { + /* 0 */ 505, 0, 0, 0, +}; + +static const uint16_t ud_itab__490[] = { + /* 0 */ 506, 0, 0, 0, +}; + +static const uint16_t ud_itab__491[] = { + /* 0 */ 507, 508, 509, 510, +}; + +static const uint16_t ud_itab__492[] = { + /* 0 */ 511, 0, 0, 0, +}; + +static const uint16_t ud_itab__493[] = { + /* 0 */ 512, 0, 0, 513, +}; + +static const uint16_t ud_itab__494[] = { + /* 0 */ 514, 0, 0, 515, +}; + +static const uint16_t ud_itab__495[] = { + /* 0 */ 516, 0, 0, 517, +}; + +static const uint16_t ud_itab__498[] = { + /* 0 */ 518, 519, 520, +}; + +static const uint16_t ud_itab__497[] = { + /* 0 */ GROUP(498), 0, 0, 0, +}; + +static const uint16_t ud_itab__500[] = { + /* 0 */ 0, 521, 0, +}; + +static const uint16_t ud_itab__501[] = { + /* 0 */ 0, 522, 0, +}; + +static const uint16_t ud_itab__502[] = { + /* 0 */ 0, 523, 0, +}; + +static const uint16_t ud_itab__499[] = { + /* 0 */ GROUP(500), 0, GROUP(501), GROUP(502), +}; + +static const uint16_t ud_itab__504[] = { + /* 0 */ 0, 524, 0, +}; + +static const uint16_t ud_itab__503[] = { + /* 0 */ GROUP(504), 0, 0, 0, +}; + +static const uint16_t ud_itab__496[] = { + /* 0 */ 0, GROUP(497), 0, 0, + /* 4 */ 0, 0, GROUP(499), GROUP(503), +}; + +static const uint16_t ud_itab__505[] = { + /* 0 */ 525, 0, 0, 0, +}; + +static const uint16_t ud_itab__506[] = { + /* 0 */ 526, 0, 0, 0, +}; + +static const uint16_t ud_itab__507[] = { + /* 0 */ 527, 0, 0, 0, +}; + +static const uint16_t ud_itab__508[] = { + /* 0 */ 528, 0, 0, 0, +}; + +static const uint16_t ud_itab__509[] = { + /* 0 */ 529, 0, 0, 0, +}; + +static const uint16_t ud_itab__510[] = { + /* 0 */ 530, 0, 0, 0, +}; + +static const uint16_t ud_itab__511[] = { + /* 0 */ 531, 0, 0, 0, +}; + +static const uint16_t ud_itab__512[] = { + /* 0 */ 532, 0, 0, 0, +}; + +static const uint16_t ud_itab__513[] = { + /* 0 */ 0, 533, 0, 534, +}; + +static const uint16_t ud_itab__514[] = { + /* 0 */ 535, 0, 0, 536, +}; + +static const uint16_t ud_itab__515[] = { + /* 0 */ 537, 0, 0, 538, +}; + +static const uint16_t ud_itab__516[] = { + /* 0 */ 539, 0, 0, 540, +}; + +static const uint16_t ud_itab__517[] = { + /* 0 */ 541, 0, 0, 542, +}; + +static const uint16_t ud_itab__518[] = { + /* 0 */ 543, 0, 0, 544, +}; + +static const uint16_t ud_itab__519[] = { + /* 0 */ 0, 545, 546, 547, +}; + +static const uint16_t ud_itab__520[] = { + /* 0 */ 548, 0, 0, 549, +}; + +static const uint16_t ud_itab__521[] = { + /* 0 */ 550, 0, 0, 551, +}; + +static const uint16_t ud_itab__522[] = { + /* 0 */ 552, 0, 0, 553, +}; + +static const uint16_t ud_itab__523[] = { + /* 0 */ 554, 0, 0, 555, +}; + +static const uint16_t ud_itab__524[] = { + /* 0 */ 556, 0, 0, 557, +}; + +static const uint16_t ud_itab__525[] = { + /* 0 */ 558, 0, 0, 559, +}; + +static const uint16_t ud_itab__526[] = { + /* 0 */ 560, 0, 0, 561, +}; + +static const uint16_t ud_itab__527[] = { + /* 0 */ 562, 0, 0, 563, +}; + +static const uint16_t ud_itab__528[] = { + /* 0 */ 564, 0, 0, 565, +}; + +static const uint16_t ud_itab__529[] = { + /* 0 */ 566, 0, 0, 567, +}; + +static const uint16_t ud_itab__530[] = { + /* 0 */ 568, 0, 0, 569, +}; + +static const uint16_t ud_itab__531[] = { + /* 0 */ 570, 0, 0, 571, +}; + +static const uint16_t ud_itab__532[] = { + /* 0 */ 572, 0, 0, 573, +}; + +static const uint16_t ud_itab__533[] = { + /* 0 */ 574, 0, 0, 575, +}; + +static const uint16_t ud_itab__534[] = { + /* 0 */ 576, 0, 0, 577, +}; + +static const uint16_t ud_itab__535[] = { + /* 0 */ 0, 578, 579, 580, +}; + +static const uint16_t ud_itab__536[] = { + /* 0 */ 581, 0, 0, 582, +}; + +static const uint16_t ud_itab__537[] = { + /* 0 */ 583, 0, 0, 584, +}; + +static const uint16_t ud_itab__538[] = { + /* 0 */ 585, 0, 0, 586, +}; + +static const uint16_t ud_itab__539[] = { + /* 0 */ 587, 0, 0, 588, +}; + +static const uint16_t ud_itab__540[] = { + /* 0 */ 589, 0, 0, 590, +}; + +static const uint16_t ud_itab__541[] = { + /* 0 */ 591, 0, 0, 592, +}; + +static const uint16_t ud_itab__542[] = { + /* 0 */ 593, 0, 0, 594, +}; + +static const uint16_t ud_itab__543[] = { + /* 0 */ 595, 0, 0, 596, +}; + +static const uint16_t ud_itab__544[] = { + /* 0 */ 597, 0, 0, 598, +}; + +static const uint16_t ud_itab__545[] = { + /* 0 */ 0, 599, 0, 0, +}; + +static const uint16_t ud_itab__546[] = { + /* 0 */ 600, 0, 0, 601, +}; + +static const uint16_t ud_itab__547[] = { + /* 0 */ 602, 0, 0, 603, +}; + +static const uint16_t ud_itab__548[] = { + /* 0 */ 604, 0, 0, 605, +}; + +static const uint16_t ud_itab__549[] = { + /* 0 */ 606, 0, 0, 607, +}; + +static const uint16_t ud_itab__550[] = { + /* 0 */ 608, 0, 0, 609, +}; + +static const uint16_t ud_itab__551[] = { + /* 0 */ 610, 0, 0, 611, +}; + +static const uint16_t ud_itab__554[] = { + /* 0 */ 0, 612, +}; + +static const uint16_t ud_itab__555[] = { + /* 0 */ 0, 613, +}; + +static const uint16_t ud_itab__553[] = { + /* 0 */ GROUP(554), 0, 0, GROUP(555), +}; + +static const uint16_t ud_itab__552[] = { + /* 0 */ 0, GROUP(553), +}; + +static const uint16_t ud_itab__556[] = { + /* 0 */ 614, 0, 0, 615, +}; + +static const uint16_t ud_itab__557[] = { + /* 0 */ 616, 0, 0, 617, +}; + +static const uint16_t ud_itab__558[] = { + /* 0 */ 618, 0, 0, 619, +}; + +static const uint16_t ud_itab__559[] = { + /* 0 */ 620, 0, 0, 621, +}; + +static const uint16_t ud_itab__560[] = { + /* 0 */ 622, 0, 0, 623, +}; + +static const uint16_t ud_itab__561[] = { + /* 0 */ 624, 0, 0, 625, +}; + +static const uint16_t ud_itab__562[] = { + /* 0 */ 626, 0, 0, 627, +}; + +static const uint16_t ud_itab__4[] = { + /* 0 */ GROUP(5), GROUP(12), GROUP(87), GROUP(88), + /* 4 */ 0, GROUP(89), GROUP(90), GROUP(91), + /* 8 */ GROUP(92), GROUP(93), 0, GROUP(94), + /* c */ 0, GROUP(95), GROUP(104), GROUP(105), + /* 10 */ GROUP(106), GROUP(107), GROUP(108), GROUP(118), + /* 14 */ GROUP(119), GROUP(120), GROUP(121), GROUP(129), + /* 18 */ GROUP(130), GROUP(135), GROUP(136), GROUP(137), + /* 1c */ GROUP(138), GROUP(139), GROUP(140), GROUP(141), + /* 20 */ GROUP(142), GROUP(143), GROUP(144), GROUP(145), + /* 24 */ 0, 0, 0, 0, + /* 28 */ GROUP(146), GROUP(147), GROUP(148), GROUP(149), + /* 2c */ GROUP(150), GROUP(151), GROUP(152), GROUP(153), + /* 30 */ GROUP(154), GROUP(155), GROUP(156), GROUP(157), + /* 34 */ GROUP(158), GROUP(161), 0, GROUP(164), + /* 38 */ GROUP(165), 0, GROUP(225), 0, + /* 3c */ 0, 0, 0, 0, + /* 40 */ GROUP(252), GROUP(253), GROUP(254), GROUP(255), + /* 44 */ GROUP(256), GROUP(257), GROUP(258), GROUP(259), + /* 48 */ GROUP(260), GROUP(261), GROUP(262), GROUP(263), + /* 4c */ GROUP(264), GROUP(265), GROUP(266), GROUP(267), + /* 50 */ GROUP(268), GROUP(269), GROUP(270), GROUP(271), + /* 54 */ GROUP(272), GROUP(273), GROUP(274), GROUP(275), + /* 58 */ GROUP(276), GROUP(277), GROUP(278), GROUP(279), + /* 5c */ GROUP(280), GROUP(281), GROUP(282), GROUP(283), + /* 60 */ GROUP(284), GROUP(285), GROUP(286), GROUP(287), + /* 64 */ GROUP(288), GROUP(289), GROUP(290), GROUP(291), + /* 68 */ GROUP(292), GROUP(293), GROUP(294), GROUP(295), + /* 6c */ GROUP(296), GROUP(297), GROUP(298), GROUP(299), + /* 70 */ GROUP(300), GROUP(301), GROUP(305), GROUP(309), + /* 74 */ GROUP(314), GROUP(315), GROUP(316), GROUP(317), + /* 78 */ GROUP(318), GROUP(320), 0, 0, + /* 7c */ GROUP(322), GROUP(323), GROUP(324), GROUP(325), + /* 80 */ GROUP(326), GROUP(327), GROUP(328), GROUP(329), + /* 84 */ GROUP(330), GROUP(331), GROUP(332), GROUP(333), + /* 88 */ GROUP(334), GROUP(335), GROUP(336), GROUP(337), + /* 8c */ GROUP(338), GROUP(339), GROUP(340), GROUP(341), + /* 90 */ GROUP(342), GROUP(343), GROUP(344), GROUP(345), + /* 94 */ GROUP(346), GROUP(347), GROUP(348), GROUP(349), + /* 98 */ GROUP(350), GROUP(351), GROUP(352), GROUP(353), + /* 9c */ GROUP(354), GROUP(355), GROUP(356), GROUP(357), + /* a0 */ GROUP(358), GROUP(359), GROUP(360), GROUP(361), + /* a4 */ GROUP(362), GROUP(363), GROUP(364), GROUP(375), + /* a8 */ GROUP(395), GROUP(396), GROUP(397), GROUP(398), + /* ac */ GROUP(399), GROUP(400), GROUP(401), GROUP(469), + /* b0 */ GROUP(470), GROUP(471), GROUP(472), GROUP(473), + /* b4 */ GROUP(474), GROUP(475), GROUP(476), GROUP(477), + /* b8 */ GROUP(478), 0, GROUP(479), GROUP(484), + /* bc */ GROUP(485), GROUP(486), GROUP(487), GROUP(488), + /* c0 */ GROUP(489), GROUP(490), GROUP(491), GROUP(492), + /* c4 */ GROUP(493), GROUP(494), GROUP(495), GROUP(496), + /* c8 */ GROUP(505), GROUP(506), GROUP(507), GROUP(508), + /* cc */ GROUP(509), GROUP(510), GROUP(511), GROUP(512), + /* d0 */ GROUP(513), GROUP(514), GROUP(515), GROUP(516), + /* d4 */ GROUP(517), GROUP(518), GROUP(519), GROUP(520), + /* d8 */ GROUP(521), GROUP(522), GROUP(523), GROUP(524), + /* dc */ GROUP(525), GROUP(526), GROUP(527), GROUP(528), + /* e0 */ GROUP(529), GROUP(530), GROUP(531), GROUP(532), + /* e4 */ GROUP(533), GROUP(534), GROUP(535), GROUP(536), + /* e8 */ GROUP(537), GROUP(538), GROUP(539), GROUP(540), + /* ec */ GROUP(541), GROUP(542), GROUP(543), GROUP(544), + /* f0 */ GROUP(545), GROUP(546), GROUP(547), GROUP(548), + /* f4 */ GROUP(549), GROUP(550), GROUP(551), GROUP(552), + /* f8 */ GROUP(556), GROUP(557), GROUP(558), GROUP(559), + /* fc */ GROUP(560), GROUP(561), GROUP(562), 0, +}; + +static const uint16_t ud_itab__563[] = { + /* 0 */ 634, 0, +}; + +static const uint16_t ud_itab__564[] = { + /* 0 */ 635, 0, +}; + +static const uint16_t ud_itab__565[] = { + /* 0 */ 642, 0, +}; + +static const uint16_t ud_itab__566[] = { + /* 0 */ 643, 0, +}; + +static const uint16_t ud_itab__567[] = { + /* 0 */ 650, 0, +}; + +static const uint16_t ud_itab__568[] = { + /* 0 */ 657, 0, +}; + +static const uint16_t ud_itab__569[] = { + /* 0 */ 664, 0, +}; + +static const uint16_t ud_itab__570[] = { + /* 0 */ 671, 0, +}; + +static const uint16_t ud_itab__572[] = { + /* 0 */ 704, 0, +}; + +static const uint16_t ud_itab__573[] = { + /* 0 */ 705, 0, +}; + +static const uint16_t ud_itab__571[] = { + /* 0 */ GROUP(572), GROUP(573), 0, +}; + +static const uint16_t ud_itab__575[] = { + /* 0 */ 706, 0, +}; + +static const uint16_t ud_itab__576[] = { + /* 0 */ 707, 0, +}; + +static const uint16_t ud_itab__574[] = { + /* 0 */ GROUP(575), GROUP(576), 0, +}; + +static const uint16_t ud_itab__577[] = { + /* 0 */ 708, 0, +}; + +static const uint16_t ud_itab__578[] = { + /* 0 */ 709, 710, +}; + +static const uint16_t ud_itab__579[] = { + /* 0 */ 716, 717, 0, +}; + +static const uint16_t ud_itab__580[] = { + /* 0 */ 719, 720, 0, +}; + +static const uint16_t ud_itab__581[] = { + /* 0 */ 737, 738, 739, 740, + /* 4 */ 741, 742, 743, 744, +}; + +static const uint16_t ud_itab__582[] = { + /* 0 */ 745, 746, 747, 748, + /* 4 */ 749, 750, 751, 752, +}; + +static const uint16_t ud_itab__584[] = { + /* 0 */ 753, 0, +}; + +static const uint16_t ud_itab__585[] = { + /* 0 */ 754, 0, +}; + +static const uint16_t ud_itab__586[] = { + /* 0 */ 755, 0, +}; + +static const uint16_t ud_itab__587[] = { + /* 0 */ 756, 0, +}; + +static const uint16_t ud_itab__588[] = { + /* 0 */ 757, 0, +}; + +static const uint16_t ud_itab__589[] = { + /* 0 */ 758, 0, +}; + +static const uint16_t ud_itab__590[] = { + /* 0 */ 759, 0, +}; + +static const uint16_t ud_itab__591[] = { + /* 0 */ 760, 0, +}; + +static const uint16_t ud_itab__583[] = { + /* 0 */ GROUP(584), GROUP(585), GROUP(586), GROUP(587), + /* 4 */ GROUP(588), GROUP(589), GROUP(590), GROUP(591), +}; + +static const uint16_t ud_itab__592[] = { + /* 0 */ 761, 762, 763, 764, + /* 4 */ 765, 766, 767, 768, +}; + +static const uint16_t ud_itab__593[] = { + /* 0 */ 780, 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__594[] = { + /* 0 */ 789, 790, 791, +}; + +static const uint16_t ud_itab__595[] = { + /* 0 */ 792, 793, 794, +}; + +static const uint16_t ud_itab__596[] = { + /* 0 */ 795, 0, +}; + +static const uint16_t ud_itab__598[] = { + /* 0 */ 797, 798, +}; + +static const uint16_t ud_itab__599[] = { + /* 0 */ 799, 800, +}; + +static const uint16_t ud_itab__600[] = { + /* 0 */ 0, 801, +}; + +static const uint16_t ud_itab__597[] = { + /* 0 */ GROUP(598), GROUP(599), GROUP(600), +}; + +static const uint16_t ud_itab__602[] = { + /* 0 */ 802, 0, +}; + +static const uint16_t ud_itab__603[] = { + /* 0 */ 803, 804, +}; + +static const uint16_t ud_itab__604[] = { + /* 0 */ 0, 805, +}; + +static const uint16_t ud_itab__601[] = { + /* 0 */ GROUP(602), GROUP(603), GROUP(604), +}; + +static const uint16_t ud_itab__605[] = { + /* 0 */ 813, 814, 815, +}; + +static const uint16_t ud_itab__606[] = { + /* 0 */ 817, 818, 819, +}; + +static const uint16_t ud_itab__607[] = { + /* 0 */ 823, 824, 825, +}; + +static const uint16_t ud_itab__608[] = { + /* 0 */ 827, 828, 829, +}; + +static const uint16_t ud_itab__609[] = { + /* 0 */ 831, 832, 833, +}; + +static const uint16_t ud_itab__610[] = { + /* 0 */ 850, 851, 852, 853, + /* 4 */ 854, 855, 856, 857, +}; + +static const uint16_t ud_itab__611[] = { + /* 0 */ 858, 859, 860, 861, + /* 4 */ 862, 863, 864, 865, +}; + +static const uint16_t ud_itab__612[] = { + /* 0 */ 868, 0, +}; + +static const uint16_t ud_itab__613[] = { + /* 0 */ 869, 0, +}; + +static const uint16_t ud_itab__614[] = { + /* 0 */ 870, 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__615[] = { + /* 0 */ 871, 0, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__616[] = { + /* 0 */ 878, 0, +}; + +static const uint16_t ud_itab__617[] = { + /* 0 */ 879, 880, 881, +}; + +static const uint16_t ud_itab__618[] = { + /* 0 */ 882, 883, 884, 885, + /* 4 */ 886, 887, 888, 889, +}; + +static const uint16_t ud_itab__619[] = { + /* 0 */ 890, 891, 892, 893, + /* 4 */ 894, 895, 896, 897, +}; + +static const uint16_t ud_itab__620[] = { + /* 0 */ 898, 899, 900, 901, + /* 4 */ 902, 903, 904, 905, +}; + +static const uint16_t ud_itab__621[] = { + /* 0 */ 906, 907, 908, 909, + /* 4 */ 910, 911, 912, 913, +}; + +static const uint16_t ud_itab__622[] = { + /* 0 */ 914, 0, +}; + +static const uint16_t ud_itab__623[] = { + /* 0 */ 915, 0, +}; + +static const uint16_t ud_itab__624[] = { + /* 0 */ 916, 0, +}; + +static const uint16_t ud_itab__627[] = { + /* 0 */ 918, 0, +}; + +static const uint16_t ud_itab__628[] = { + /* 0 */ 919, 0, +}; + +static const uint16_t ud_itab__629[] = { + /* 0 */ 920, 0, +}; + +static const uint16_t ud_itab__630[] = { + /* 0 */ 921, 0, +}; + +static const uint16_t ud_itab__631[] = { + /* 0 */ 922, 0, +}; + +static const uint16_t ud_itab__632[] = { + /* 0 */ 923, 0, +}; + +static const uint16_t ud_itab__633[] = { + /* 0 */ 924, 0, +}; + +static const uint16_t ud_itab__634[] = { + /* 0 */ 925, 0, +}; + +static const uint16_t ud_itab__626[] = { + /* 0 */ GROUP(627), GROUP(628), GROUP(629), GROUP(630), + /* 4 */ GROUP(631), GROUP(632), GROUP(633), GROUP(634), +}; + +static const uint16_t ud_itab__636[] = { + /* 0 */ 0, 926, +}; + +static const uint16_t ud_itab__637[] = { + /* 0 */ 0, 927, +}; + +static const uint16_t ud_itab__638[] = { + /* 0 */ 0, 928, +}; + +static const uint16_t ud_itab__639[] = { + /* 0 */ 0, 929, +}; + +static const uint16_t ud_itab__640[] = { + /* 0 */ 0, 930, +}; + +static const uint16_t ud_itab__641[] = { + /* 0 */ 0, 931, +}; + +static const uint16_t ud_itab__642[] = { + /* 0 */ 0, 932, +}; + +static const uint16_t ud_itab__643[] = { + /* 0 */ 0, 933, +}; + +static const uint16_t ud_itab__644[] = { + /* 0 */ 0, 934, +}; + +static const uint16_t ud_itab__645[] = { + /* 0 */ 0, 935, +}; + +static const uint16_t ud_itab__646[] = { + /* 0 */ 0, 936, +}; + +static const uint16_t ud_itab__647[] = { + /* 0 */ 0, 937, +}; + +static const uint16_t ud_itab__648[] = { + /* 0 */ 0, 938, +}; + +static const uint16_t ud_itab__649[] = { + /* 0 */ 0, 939, +}; + +static const uint16_t ud_itab__650[] = { + /* 0 */ 0, 940, +}; + +static const uint16_t ud_itab__651[] = { + /* 0 */ 0, 941, +}; + +static const uint16_t ud_itab__652[] = { + /* 0 */ 0, 942, +}; + +static const uint16_t ud_itab__653[] = { + /* 0 */ 0, 943, +}; + +static const uint16_t ud_itab__654[] = { + /* 0 */ 0, 944, +}; + +static const uint16_t ud_itab__655[] = { + /* 0 */ 0, 945, +}; + +static const uint16_t ud_itab__656[] = { + /* 0 */ 0, 946, +}; + +static const uint16_t ud_itab__657[] = { + /* 0 */ 0, 947, +}; + +static const uint16_t ud_itab__658[] = { + /* 0 */ 0, 948, +}; + +static const uint16_t ud_itab__659[] = { + /* 0 */ 0, 949, +}; + +static const uint16_t ud_itab__660[] = { + /* 0 */ 0, 950, +}; + +static const uint16_t ud_itab__661[] = { + /* 0 */ 0, 951, +}; + +static const uint16_t ud_itab__662[] = { + /* 0 */ 0, 952, +}; + +static const uint16_t ud_itab__663[] = { + /* 0 */ 0, 953, +}; + +static const uint16_t ud_itab__664[] = { + /* 0 */ 0, 954, +}; + +static const uint16_t ud_itab__665[] = { + /* 0 */ 0, 955, +}; + +static const uint16_t ud_itab__666[] = { + /* 0 */ 0, 956, +}; + +static const uint16_t ud_itab__667[] = { + /* 0 */ 0, 957, +}; + +static const uint16_t ud_itab__668[] = { + /* 0 */ 0, 958, +}; + +static const uint16_t ud_itab__669[] = { + /* 0 */ 0, 959, +}; + +static const uint16_t ud_itab__670[] = { + /* 0 */ 0, 960, +}; + +static const uint16_t ud_itab__671[] = { + /* 0 */ 0, 961, +}; + +static const uint16_t ud_itab__672[] = { + /* 0 */ 0, 962, +}; + +static const uint16_t ud_itab__673[] = { + /* 0 */ 0, 963, +}; + +static const uint16_t ud_itab__674[] = { + /* 0 */ 0, 964, +}; + +static const uint16_t ud_itab__675[] = { + /* 0 */ 0, 965, +}; + +static const uint16_t ud_itab__676[] = { + /* 0 */ 0, 966, +}; + +static const uint16_t ud_itab__677[] = { + /* 0 */ 0, 967, +}; + +static const uint16_t ud_itab__678[] = { + /* 0 */ 0, 968, +}; + +static const uint16_t ud_itab__679[] = { + /* 0 */ 0, 969, +}; + +static const uint16_t ud_itab__680[] = { + /* 0 */ 0, 970, +}; + +static const uint16_t ud_itab__681[] = { + /* 0 */ 0, 971, +}; + +static const uint16_t ud_itab__682[] = { + /* 0 */ 0, 972, +}; + +static const uint16_t ud_itab__683[] = { + /* 0 */ 0, 973, +}; + +static const uint16_t ud_itab__684[] = { + /* 0 */ 0, 974, +}; + +static const uint16_t ud_itab__685[] = { + /* 0 */ 0, 975, +}; + +static const uint16_t ud_itab__686[] = { + /* 0 */ 0, 976, +}; + +static const uint16_t ud_itab__687[] = { + /* 0 */ 0, 977, +}; + +static const uint16_t ud_itab__688[] = { + /* 0 */ 0, 978, +}; + +static const uint16_t ud_itab__689[] = { + /* 0 */ 0, 979, +}; + +static const uint16_t ud_itab__690[] = { + /* 0 */ 0, 980, +}; + +static const uint16_t ud_itab__691[] = { + /* 0 */ 0, 981, +}; + +static const uint16_t ud_itab__692[] = { + /* 0 */ 0, 982, +}; + +static const uint16_t ud_itab__693[] = { + /* 0 */ 0, 983, +}; + +static const uint16_t ud_itab__694[] = { + /* 0 */ 0, 984, +}; + +static const uint16_t ud_itab__695[] = { + /* 0 */ 0, 985, +}; + +static const uint16_t ud_itab__696[] = { + /* 0 */ 0, 986, +}; + +static const uint16_t ud_itab__697[] = { + /* 0 */ 0, 987, +}; + +static const uint16_t ud_itab__698[] = { + /* 0 */ 0, 988, +}; + +static const uint16_t ud_itab__699[] = { + /* 0 */ 0, 989, +}; + +static const uint16_t ud_itab__635[] = { + /* 0 */ GROUP(636), GROUP(637), GROUP(638), GROUP(639), + /* 4 */ GROUP(640), GROUP(641), GROUP(642), GROUP(643), + /* 8 */ GROUP(644), GROUP(645), GROUP(646), GROUP(647), + /* c */ GROUP(648), GROUP(649), GROUP(650), GROUP(651), + /* 10 */ GROUP(652), GROUP(653), GROUP(654), GROUP(655), + /* 14 */ GROUP(656), GROUP(657), GROUP(658), GROUP(659), + /* 18 */ GROUP(660), GROUP(661), GROUP(662), GROUP(663), + /* 1c */ GROUP(664), GROUP(665), GROUP(666), GROUP(667), + /* 20 */ GROUP(668), GROUP(669), GROUP(670), GROUP(671), + /* 24 */ GROUP(672), GROUP(673), GROUP(674), GROUP(675), + /* 28 */ GROUP(676), GROUP(677), GROUP(678), GROUP(679), + /* 2c */ GROUP(680), GROUP(681), GROUP(682), GROUP(683), + /* 30 */ GROUP(684), GROUP(685), GROUP(686), GROUP(687), + /* 34 */ GROUP(688), GROUP(689), GROUP(690), GROUP(691), + /* 38 */ GROUP(692), GROUP(693), GROUP(694), GROUP(695), + /* 3c */ GROUP(696), GROUP(697), GROUP(698), GROUP(699), +}; + +static const uint16_t ud_itab__625[] = { + /* 0 */ GROUP(626), GROUP(635), +}; + +static const uint16_t ud_itab__702[] = { + /* 0 */ 990, 0, +}; + +static const uint16_t ud_itab__703[] = { + /* 0 */ 991, 0, +}; + +static const uint16_t ud_itab__704[] = { + /* 0 */ 992, 0, +}; + +static const uint16_t ud_itab__705[] = { + /* 0 */ 993, 0, +}; + +static const uint16_t ud_itab__706[] = { + /* 0 */ 994, 0, +}; + +static const uint16_t ud_itab__707[] = { + /* 0 */ 995, 0, +}; + +static const uint16_t ud_itab__708[] = { + /* 0 */ 996, 0, +}; + +static const uint16_t ud_itab__701[] = { + /* 0 */ GROUP(702), 0, GROUP(703), GROUP(704), + /* 4 */ GROUP(705), GROUP(706), GROUP(707), GROUP(708), +}; + +static const uint16_t ud_itab__710[] = { + /* 0 */ 0, 997, +}; + +static const uint16_t ud_itab__711[] = { + /* 0 */ 0, 998, +}; + +static const uint16_t ud_itab__712[] = { + /* 0 */ 0, 999, +}; + +static const uint16_t ud_itab__713[] = { + /* 0 */ 0, 1000, +}; + +static const uint16_t ud_itab__714[] = { + /* 0 */ 0, 1001, +}; + +static const uint16_t ud_itab__715[] = { + /* 0 */ 0, 1002, +}; + +static const uint16_t ud_itab__716[] = { + /* 0 */ 0, 1003, +}; + +static const uint16_t ud_itab__717[] = { + /* 0 */ 0, 1004, +}; + +static const uint16_t ud_itab__718[] = { + /* 0 */ 0, 1005, +}; + +static const uint16_t ud_itab__719[] = { + /* 0 */ 0, 1006, +}; + +static const uint16_t ud_itab__720[] = { + /* 0 */ 0, 1007, +}; + +static const uint16_t ud_itab__721[] = { + /* 0 */ 0, 1008, +}; + +static const uint16_t ud_itab__722[] = { + /* 0 */ 0, 1009, +}; + +static const uint16_t ud_itab__723[] = { + /* 0 */ 0, 1010, +}; + +static const uint16_t ud_itab__724[] = { + /* 0 */ 0, 1011, +}; + +static const uint16_t ud_itab__725[] = { + /* 0 */ 0, 1012, +}; + +static const uint16_t ud_itab__726[] = { + /* 0 */ 0, 1013, +}; + +static const uint16_t ud_itab__727[] = { + /* 0 */ 0, 1014, +}; + +static const uint16_t ud_itab__728[] = { + /* 0 */ 0, 1015, +}; + +static const uint16_t ud_itab__729[] = { + /* 0 */ 0, 1016, +}; + +static const uint16_t ud_itab__730[] = { + /* 0 */ 0, 1017, +}; + +static const uint16_t ud_itab__731[] = { + /* 0 */ 0, 1018, +}; + +static const uint16_t ud_itab__732[] = { + /* 0 */ 0, 1019, +}; + +static const uint16_t ud_itab__733[] = { + /* 0 */ 0, 1020, +}; + +static const uint16_t ud_itab__734[] = { + /* 0 */ 0, 1021, +}; + +static const uint16_t ud_itab__735[] = { + /* 0 */ 0, 1022, +}; + +static const uint16_t ud_itab__736[] = { + /* 0 */ 0, 1023, +}; + +static const uint16_t ud_itab__737[] = { + /* 0 */ 0, 1024, +}; + +static const uint16_t ud_itab__738[] = { + /* 0 */ 0, 1025, +}; + +static const uint16_t ud_itab__739[] = { + /* 0 */ 0, 1026, +}; + +static const uint16_t ud_itab__740[] = { + /* 0 */ 0, 1027, +}; + +static const uint16_t ud_itab__741[] = { + /* 0 */ 0, 1028, +}; + +static const uint16_t ud_itab__742[] = { + /* 0 */ 0, 1029, +}; + +static const uint16_t ud_itab__743[] = { + /* 0 */ 0, 1030, +}; + +static const uint16_t ud_itab__744[] = { + /* 0 */ 0, 1031, +}; + +static const uint16_t ud_itab__745[] = { + /* 0 */ 0, 1032, +}; + +static const uint16_t ud_itab__746[] = { + /* 0 */ 0, 1033, +}; + +static const uint16_t ud_itab__747[] = { + /* 0 */ 0, 1034, +}; + +static const uint16_t ud_itab__748[] = { + /* 0 */ 0, 1035, +}; + +static const uint16_t ud_itab__749[] = { + /* 0 */ 0, 1036, +}; + +static const uint16_t ud_itab__750[] = { + /* 0 */ 0, 1037, +}; + +static const uint16_t ud_itab__751[] = { + /* 0 */ 0, 1038, +}; + +static const uint16_t ud_itab__752[] = { + /* 0 */ 0, 1039, +}; + +static const uint16_t ud_itab__753[] = { + /* 0 */ 0, 1040, +}; + +static const uint16_t ud_itab__754[] = { + /* 0 */ 0, 1041, +}; + +static const uint16_t ud_itab__755[] = { + /* 0 */ 0, 1042, +}; + +static const uint16_t ud_itab__756[] = { + /* 0 */ 0, 1043, +}; + +static const uint16_t ud_itab__757[] = { + /* 0 */ 0, 1044, +}; + +static const uint16_t ud_itab__758[] = { + /* 0 */ 0, 1045, +}; + +static const uint16_t ud_itab__759[] = { + /* 0 */ 0, 1046, +}; + +static const uint16_t ud_itab__760[] = { + /* 0 */ 0, 1047, +}; + +static const uint16_t ud_itab__761[] = { + /* 0 */ 0, 1048, +}; + +static const uint16_t ud_itab__709[] = { + /* 0 */ GROUP(710), GROUP(711), GROUP(712), GROUP(713), + /* 4 */ GROUP(714), GROUP(715), GROUP(716), GROUP(717), + /* 8 */ GROUP(718), GROUP(719), GROUP(720), GROUP(721), + /* c */ GROUP(722), GROUP(723), GROUP(724), GROUP(725), + /* 10 */ GROUP(726), 0, 0, 0, + /* 14 */ 0, 0, 0, 0, + /* 18 */ GROUP(727), GROUP(728), GROUP(729), GROUP(730), + /* 1c */ GROUP(731), GROUP(732), GROUP(733), GROUP(734), + /* 20 */ GROUP(735), GROUP(736), 0, 0, + /* 24 */ GROUP(737), GROUP(738), 0, 0, + /* 28 */ GROUP(739), GROUP(740), GROUP(741), GROUP(742), + /* 2c */ GROUP(743), GROUP(744), GROUP(745), 0, + /* 30 */ GROUP(746), GROUP(747), GROUP(748), GROUP(749), + /* 34 */ GROUP(750), GROUP(751), GROUP(752), GROUP(753), + /* 38 */ GROUP(754), GROUP(755), GROUP(756), GROUP(757), + /* 3c */ GROUP(758), GROUP(759), GROUP(760), GROUP(761), +}; + +static const uint16_t ud_itab__700[] = { + /* 0 */ GROUP(701), GROUP(709), +}; + +static const uint16_t ud_itab__764[] = { + /* 0 */ 1049, 0, +}; + +static const uint16_t ud_itab__765[] = { + /* 0 */ 1050, 0, +}; + +static const uint16_t ud_itab__766[] = { + /* 0 */ 1051, 0, +}; + +static const uint16_t ud_itab__767[] = { + /* 0 */ 1052, 0, +}; + +static const uint16_t ud_itab__768[] = { + /* 0 */ 1053, 0, +}; + +static const uint16_t ud_itab__769[] = { + /* 0 */ 1054, 0, +}; + +static const uint16_t ud_itab__770[] = { + /* 0 */ 1055, 0, +}; + +static const uint16_t ud_itab__771[] = { + /* 0 */ 1056, 0, +}; + +static const uint16_t ud_itab__763[] = { + /* 0 */ GROUP(764), GROUP(765), GROUP(766), GROUP(767), + /* 4 */ GROUP(768), GROUP(769), GROUP(770), GROUP(771), +}; + +static const uint16_t ud_itab__773[] = { + /* 0 */ 0, 1057, +}; + +static const uint16_t ud_itab__774[] = { + /* 0 */ 0, 1058, +}; + +static const uint16_t ud_itab__775[] = { + /* 0 */ 0, 1059, +}; + +static const uint16_t ud_itab__776[] = { + /* 0 */ 0, 1060, +}; + +static const uint16_t ud_itab__777[] = { + /* 0 */ 0, 1061, +}; + +static const uint16_t ud_itab__778[] = { + /* 0 */ 0, 1062, +}; + +static const uint16_t ud_itab__779[] = { + /* 0 */ 0, 1063, +}; + +static const uint16_t ud_itab__780[] = { + /* 0 */ 0, 1064, +}; + +static const uint16_t ud_itab__781[] = { + /* 0 */ 0, 1065, +}; + +static const uint16_t ud_itab__782[] = { + /* 0 */ 0, 1066, +}; + +static const uint16_t ud_itab__783[] = { + /* 0 */ 0, 1067, +}; + +static const uint16_t ud_itab__784[] = { + /* 0 */ 0, 1068, +}; + +static const uint16_t ud_itab__785[] = { + /* 0 */ 0, 1069, +}; + +static const uint16_t ud_itab__786[] = { + /* 0 */ 0, 1070, +}; + +static const uint16_t ud_itab__787[] = { + /* 0 */ 0, 1071, +}; + +static const uint16_t ud_itab__788[] = { + /* 0 */ 0, 1072, +}; + +static const uint16_t ud_itab__789[] = { + /* 0 */ 0, 1073, +}; + +static const uint16_t ud_itab__790[] = { + /* 0 */ 0, 1074, +}; + +static const uint16_t ud_itab__791[] = { + /* 0 */ 0, 1075, +}; + +static const uint16_t ud_itab__792[] = { + /* 0 */ 0, 1076, +}; + +static const uint16_t ud_itab__793[] = { + /* 0 */ 0, 1077, +}; + +static const uint16_t ud_itab__794[] = { + /* 0 */ 0, 1078, +}; + +static const uint16_t ud_itab__795[] = { + /* 0 */ 0, 1079, +}; + +static const uint16_t ud_itab__796[] = { + /* 0 */ 0, 1080, +}; + +static const uint16_t ud_itab__797[] = { + /* 0 */ 0, 1081, +}; + +static const uint16_t ud_itab__798[] = { + /* 0 */ 0, 1082, +}; + +static const uint16_t ud_itab__799[] = { + /* 0 */ 0, 1083, +}; + +static const uint16_t ud_itab__800[] = { + /* 0 */ 0, 1084, +}; + +static const uint16_t ud_itab__801[] = { + /* 0 */ 0, 1085, +}; + +static const uint16_t ud_itab__802[] = { + /* 0 */ 0, 1086, +}; + +static const uint16_t ud_itab__803[] = { + /* 0 */ 0, 1087, +}; + +static const uint16_t ud_itab__804[] = { + /* 0 */ 0, 1088, +}; + +static const uint16_t ud_itab__805[] = { + /* 0 */ 0, 1089, +}; + +static const uint16_t ud_itab__772[] = { + /* 0 */ GROUP(773), GROUP(774), GROUP(775), GROUP(776), + /* 4 */ GROUP(777), GROUP(778), GROUP(779), GROUP(780), + /* 8 */ GROUP(781), GROUP(782), GROUP(783), GROUP(784), + /* c */ GROUP(785), GROUP(786), GROUP(787), GROUP(788), + /* 10 */ GROUP(789), GROUP(790), GROUP(791), GROUP(792), + /* 14 */ GROUP(793), GROUP(794), GROUP(795), GROUP(796), + /* 18 */ GROUP(797), GROUP(798), GROUP(799), GROUP(800), + /* 1c */ GROUP(801), GROUP(802), GROUP(803), GROUP(804), + /* 20 */ 0, 0, 0, 0, + /* 24 */ 0, 0, 0, 0, + /* 28 */ 0, GROUP(805), 0, 0, + /* 2c */ 0, 0, 0, 0, + /* 30 */ 0, 0, 0, 0, + /* 34 */ 0, 0, 0, 0, + /* 38 */ 0, 0, 0, 0, + /* 3c */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__762[] = { + /* 0 */ GROUP(763), GROUP(772), +}; + +static const uint16_t ud_itab__808[] = { + /* 0 */ 1090, 0, +}; + +static const uint16_t ud_itab__809[] = { + /* 0 */ 1091, 0, +}; + +static const uint16_t ud_itab__810[] = { + /* 0 */ 1092, 0, +}; + +static const uint16_t ud_itab__811[] = { + /* 0 */ 1093, 0, +}; + +static const uint16_t ud_itab__812[] = { + /* 0 */ 1094, 0, +}; + +static const uint16_t ud_itab__813[] = { + /* 0 */ 1095, 0, +}; + +static const uint16_t ud_itab__807[] = { + /* 0 */ GROUP(808), GROUP(809), GROUP(810), GROUP(811), + /* 4 */ 0, GROUP(812), 0, GROUP(813), +}; + +static const uint16_t ud_itab__815[] = { + /* 0 */ 0, 1096, +}; + +static const uint16_t ud_itab__816[] = { + /* 0 */ 0, 1097, +}; + +static const uint16_t ud_itab__817[] = { + /* 0 */ 0, 1098, +}; + +static const uint16_t ud_itab__818[] = { + /* 0 */ 0, 1099, +}; + +static const uint16_t ud_itab__819[] = { + /* 0 */ 0, 1100, +}; + +static const uint16_t ud_itab__820[] = { + /* 0 */ 0, 1101, +}; + +static const uint16_t ud_itab__821[] = { + /* 0 */ 0, 1102, +}; + +static const uint16_t ud_itab__822[] = { + /* 0 */ 0, 1103, +}; + +static const uint16_t ud_itab__823[] = { + /* 0 */ 0, 1104, +}; + +static const uint16_t ud_itab__824[] = { + /* 0 */ 0, 1105, +}; + +static const uint16_t ud_itab__825[] = { + /* 0 */ 0, 1106, +}; + +static const uint16_t ud_itab__826[] = { + /* 0 */ 0, 1107, +}; + +static const uint16_t ud_itab__827[] = { + /* 0 */ 0, 1108, +}; + +static const uint16_t ud_itab__828[] = { + /* 0 */ 0, 1109, +}; + +static const uint16_t ud_itab__829[] = { + /* 0 */ 0, 1110, +}; + +static const uint16_t ud_itab__830[] = { + /* 0 */ 0, 1111, +}; + +static const uint16_t ud_itab__831[] = { + /* 0 */ 0, 1112, +}; + +static const uint16_t ud_itab__832[] = { + /* 0 */ 0, 1113, +}; + +static const uint16_t ud_itab__833[] = { + /* 0 */ 0, 1114, +}; + +static const uint16_t ud_itab__834[] = { + /* 0 */ 0, 1115, +}; + +static const uint16_t ud_itab__835[] = { + /* 0 */ 0, 1116, +}; + +static const uint16_t ud_itab__836[] = { + /* 0 */ 0, 1117, +}; + +static const uint16_t ud_itab__837[] = { + /* 0 */ 0, 1118, +}; + +static const uint16_t ud_itab__838[] = { + /* 0 */ 0, 1119, +}; + +static const uint16_t ud_itab__839[] = { + /* 0 */ 0, 1120, +}; + +static const uint16_t ud_itab__840[] = { + /* 0 */ 0, 1121, +}; + +static const uint16_t ud_itab__841[] = { + /* 0 */ 0, 1122, +}; + +static const uint16_t ud_itab__842[] = { + /* 0 */ 0, 1123, +}; + +static const uint16_t ud_itab__843[] = { + /* 0 */ 0, 1124, +}; + +static const uint16_t ud_itab__844[] = { + /* 0 */ 0, 1125, +}; + +static const uint16_t ud_itab__845[] = { + /* 0 */ 0, 1126, +}; + +static const uint16_t ud_itab__846[] = { + /* 0 */ 0, 1127, +}; + +static const uint16_t ud_itab__847[] = { + /* 0 */ 0, 1128, +}; + +static const uint16_t ud_itab__848[] = { + /* 0 */ 0, 1129, +}; + +static const uint16_t ud_itab__849[] = { + /* 0 */ 0, 1130, +}; + +static const uint16_t ud_itab__850[] = { + /* 0 */ 0, 1131, +}; + +static const uint16_t ud_itab__851[] = { + /* 0 */ 0, 1132, +}; + +static const uint16_t ud_itab__852[] = { + /* 0 */ 0, 1133, +}; + +static const uint16_t ud_itab__853[] = { + /* 0 */ 0, 1134, +}; + +static const uint16_t ud_itab__854[] = { + /* 0 */ 0, 1135, +}; + +static const uint16_t ud_itab__855[] = { + /* 0 */ 0, 1136, +}; + +static const uint16_t ud_itab__856[] = { + /* 0 */ 0, 1137, +}; + +static const uint16_t ud_itab__857[] = { + /* 0 */ 0, 1138, +}; + +static const uint16_t ud_itab__858[] = { + /* 0 */ 0, 1139, +}; + +static const uint16_t ud_itab__859[] = { + /* 0 */ 0, 1140, +}; + +static const uint16_t ud_itab__860[] = { + /* 0 */ 0, 1141, +}; + +static const uint16_t ud_itab__861[] = { + /* 0 */ 0, 1142, +}; + +static const uint16_t ud_itab__862[] = { + /* 0 */ 0, 1143, +}; + +static const uint16_t ud_itab__863[] = { + /* 0 */ 0, 1144, +}; + +static const uint16_t ud_itab__864[] = { + /* 0 */ 0, 1145, +}; + +static const uint16_t ud_itab__814[] = { + /* 0 */ GROUP(815), GROUP(816), GROUP(817), GROUP(818), + /* 4 */ GROUP(819), GROUP(820), GROUP(821), GROUP(822), + /* 8 */ GROUP(823), GROUP(824), GROUP(825), GROUP(826), + /* c */ GROUP(827), GROUP(828), GROUP(829), GROUP(830), + /* 10 */ GROUP(831), GROUP(832), GROUP(833), GROUP(834), + /* 14 */ GROUP(835), GROUP(836), GROUP(837), GROUP(838), + /* 18 */ GROUP(839), GROUP(840), GROUP(841), GROUP(842), + /* 1c */ GROUP(843), GROUP(844), GROUP(845), GROUP(846), + /* 20 */ 0, 0, GROUP(847), GROUP(848), + /* 24 */ 0, 0, 0, 0, + /* 28 */ GROUP(849), GROUP(850), GROUP(851), GROUP(852), + /* 2c */ GROUP(853), GROUP(854), GROUP(855), GROUP(856), + /* 30 */ GROUP(857), GROUP(858), GROUP(859), GROUP(860), + /* 34 */ GROUP(861), GROUP(862), GROUP(863), GROUP(864), + /* 38 */ 0, 0, 0, 0, + /* 3c */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__806[] = { + /* 0 */ GROUP(807), GROUP(814), +}; + +static const uint16_t ud_itab__867[] = { + /* 0 */ 1146, 0, +}; + +static const uint16_t ud_itab__868[] = { + /* 0 */ 1147, 0, +}; + +static const uint16_t ud_itab__869[] = { + /* 0 */ 1148, 0, +}; + +static const uint16_t ud_itab__870[] = { + /* 0 */ 1149, 0, +}; + +static const uint16_t ud_itab__871[] = { + /* 0 */ 1150, 0, +}; + +static const uint16_t ud_itab__872[] = { + /* 0 */ 1151, 0, +}; + +static const uint16_t ud_itab__873[] = { + /* 0 */ 1152, 0, +}; + +static const uint16_t ud_itab__874[] = { + /* 0 */ 1153, 0, +}; + +static const uint16_t ud_itab__866[] = { + /* 0 */ GROUP(867), GROUP(868), GROUP(869), GROUP(870), + /* 4 */ GROUP(871), GROUP(872), GROUP(873), GROUP(874), +}; + +static const uint16_t ud_itab__876[] = { + /* 0 */ 0, 1154, +}; + +static const uint16_t ud_itab__877[] = { + /* 0 */ 0, 1155, +}; + +static const uint16_t ud_itab__878[] = { + /* 0 */ 0, 1156, +}; + +static const uint16_t ud_itab__879[] = { + /* 0 */ 0, 1157, +}; + +static const uint16_t ud_itab__880[] = { + /* 0 */ 0, 1158, +}; + +static const uint16_t ud_itab__881[] = { + /* 0 */ 0, 1159, +}; + +static const uint16_t ud_itab__882[] = { + /* 0 */ 0, 1160, +}; + +static const uint16_t ud_itab__883[] = { + /* 0 */ 0, 1161, +}; + +static const uint16_t ud_itab__884[] = { + /* 0 */ 0, 1162, +}; + +static const uint16_t ud_itab__885[] = { + /* 0 */ 0, 1163, +}; + +static const uint16_t ud_itab__886[] = { + /* 0 */ 0, 1164, +}; + +static const uint16_t ud_itab__887[] = { + /* 0 */ 0, 1165, +}; + +static const uint16_t ud_itab__888[] = { + /* 0 */ 0, 1166, +}; + +static const uint16_t ud_itab__889[] = { + /* 0 */ 0, 1167, +}; + +static const uint16_t ud_itab__890[] = { + /* 0 */ 0, 1168, +}; + +static const uint16_t ud_itab__891[] = { + /* 0 */ 0, 1169, +}; + +static const uint16_t ud_itab__892[] = { + /* 0 */ 0, 1170, +}; + +static const uint16_t ud_itab__893[] = { + /* 0 */ 0, 1171, +}; + +static const uint16_t ud_itab__894[] = { + /* 0 */ 0, 1172, +}; + +static const uint16_t ud_itab__895[] = { + /* 0 */ 0, 1173, +}; + +static const uint16_t ud_itab__896[] = { + /* 0 */ 0, 1174, +}; + +static const uint16_t ud_itab__897[] = { + /* 0 */ 0, 1175, +}; + +static const uint16_t ud_itab__898[] = { + /* 0 */ 0, 1176, +}; + +static const uint16_t ud_itab__899[] = { + /* 0 */ 0, 1177, +}; + +static const uint16_t ud_itab__900[] = { + /* 0 */ 0, 1178, +}; + +static const uint16_t ud_itab__901[] = { + /* 0 */ 0, 1179, +}; + +static const uint16_t ud_itab__902[] = { + /* 0 */ 0, 1180, +}; + +static const uint16_t ud_itab__903[] = { + /* 0 */ 0, 1181, +}; + +static const uint16_t ud_itab__904[] = { + /* 0 */ 0, 1182, +}; + +static const uint16_t ud_itab__905[] = { + /* 0 */ 0, 1183, +}; + +static const uint16_t ud_itab__906[] = { + /* 0 */ 0, 1184, +}; + +static const uint16_t ud_itab__907[] = { + /* 0 */ 0, 1185, +}; + +static const uint16_t ud_itab__908[] = { + /* 0 */ 0, 1186, +}; + +static const uint16_t ud_itab__909[] = { + /* 0 */ 0, 1187, +}; + +static const uint16_t ud_itab__910[] = { + /* 0 */ 0, 1188, +}; + +static const uint16_t ud_itab__911[] = { + /* 0 */ 0, 1189, +}; + +static const uint16_t ud_itab__912[] = { + /* 0 */ 0, 1190, +}; + +static const uint16_t ud_itab__913[] = { + /* 0 */ 0, 1191, +}; + +static const uint16_t ud_itab__914[] = { + /* 0 */ 0, 1192, +}; + +static const uint16_t ud_itab__915[] = { + /* 0 */ 0, 1193, +}; + +static const uint16_t ud_itab__916[] = { + /* 0 */ 0, 1194, +}; + +static const uint16_t ud_itab__917[] = { + /* 0 */ 0, 1195, +}; + +static const uint16_t ud_itab__918[] = { + /* 0 */ 0, 1196, +}; + +static const uint16_t ud_itab__919[] = { + /* 0 */ 0, 1197, +}; + +static const uint16_t ud_itab__920[] = { + /* 0 */ 0, 1198, +}; + +static const uint16_t ud_itab__921[] = { + /* 0 */ 0, 1199, +}; + +static const uint16_t ud_itab__922[] = { + /* 0 */ 0, 1200, +}; + +static const uint16_t ud_itab__923[] = { + /* 0 */ 0, 1201, +}; + +static const uint16_t ud_itab__924[] = { + /* 0 */ 0, 1202, +}; + +static const uint16_t ud_itab__925[] = { + /* 0 */ 0, 1203, +}; + +static const uint16_t ud_itab__926[] = { + /* 0 */ 0, 1204, +}; + +static const uint16_t ud_itab__927[] = { + /* 0 */ 0, 1205, +}; + +static const uint16_t ud_itab__928[] = { + /* 0 */ 0, 1206, +}; + +static const uint16_t ud_itab__929[] = { + /* 0 */ 0, 1207, +}; + +static const uint16_t ud_itab__930[] = { + /* 0 */ 0, 1208, +}; + +static const uint16_t ud_itab__931[] = { + /* 0 */ 0, 1209, +}; + +static const uint16_t ud_itab__932[] = { + /* 0 */ 0, 1210, +}; + +static const uint16_t ud_itab__933[] = { + /* 0 */ 0, 1211, +}; + +static const uint16_t ud_itab__934[] = { + /* 0 */ 0, 1212, +}; + +static const uint16_t ud_itab__935[] = { + /* 0 */ 0, 1213, +}; + +static const uint16_t ud_itab__936[] = { + /* 0 */ 0, 1214, +}; + +static const uint16_t ud_itab__937[] = { + /* 0 */ 0, 1215, +}; + +static const uint16_t ud_itab__938[] = { + /* 0 */ 0, 1216, +}; + +static const uint16_t ud_itab__939[] = { + /* 0 */ 0, 1217, +}; + +static const uint16_t ud_itab__875[] = { + /* 0 */ GROUP(876), GROUP(877), GROUP(878), GROUP(879), + /* 4 */ GROUP(880), GROUP(881), GROUP(882), GROUP(883), + /* 8 */ GROUP(884), GROUP(885), GROUP(886), GROUP(887), + /* c */ GROUP(888), GROUP(889), GROUP(890), GROUP(891), + /* 10 */ GROUP(892), GROUP(893), GROUP(894), GROUP(895), + /* 14 */ GROUP(896), GROUP(897), GROUP(898), GROUP(899), + /* 18 */ GROUP(900), GROUP(901), GROUP(902), GROUP(903), + /* 1c */ GROUP(904), GROUP(905), GROUP(906), GROUP(907), + /* 20 */ GROUP(908), GROUP(909), GROUP(910), GROUP(911), + /* 24 */ GROUP(912), GROUP(913), GROUP(914), GROUP(915), + /* 28 */ GROUP(916), GROUP(917), GROUP(918), GROUP(919), + /* 2c */ GROUP(920), GROUP(921), GROUP(922), GROUP(923), + /* 30 */ GROUP(924), GROUP(925), GROUP(926), GROUP(927), + /* 34 */ GROUP(928), GROUP(929), GROUP(930), GROUP(931), + /* 38 */ GROUP(932), GROUP(933), GROUP(934), GROUP(935), + /* 3c */ GROUP(936), GROUP(937), GROUP(938), GROUP(939), +}; + +static const uint16_t ud_itab__865[] = { + /* 0 */ GROUP(866), GROUP(875), +}; + +static const uint16_t ud_itab__942[] = { + /* 0 */ 1218, 0, +}; + +static const uint16_t ud_itab__943[] = { + /* 0 */ 1219, 0, +}; + +static const uint16_t ud_itab__944[] = { + /* 0 */ 1220, 0, +}; + +static const uint16_t ud_itab__945[] = { + /* 0 */ 1221, 0, +}; + +static const uint16_t ud_itab__946[] = { + /* 0 */ 1222, 0, +}; + +static const uint16_t ud_itab__947[] = { + /* 0 */ 1223, 0, +}; + +static const uint16_t ud_itab__948[] = { + /* 0 */ 1224, 0, +}; + +static const uint16_t ud_itab__941[] = { + /* 0 */ GROUP(942), GROUP(943), GROUP(944), GROUP(945), + /* 4 */ GROUP(946), 0, GROUP(947), GROUP(948), +}; + +static const uint16_t ud_itab__950[] = { + /* 0 */ 0, 1225, +}; + +static const uint16_t ud_itab__951[] = { + /* 0 */ 0, 1226, +}; + +static const uint16_t ud_itab__952[] = { + /* 0 */ 0, 1227, +}; + +static const uint16_t ud_itab__953[] = { + /* 0 */ 0, 1228, +}; + +static const uint16_t ud_itab__954[] = { + /* 0 */ 0, 1229, +}; + +static const uint16_t ud_itab__955[] = { + /* 0 */ 0, 1230, +}; + +static const uint16_t ud_itab__956[] = { + /* 0 */ 0, 1231, +}; + +static const uint16_t ud_itab__957[] = { + /* 0 */ 0, 1232, +}; + +static const uint16_t ud_itab__958[] = { + /* 0 */ 0, 1233, +}; + +static const uint16_t ud_itab__959[] = { + /* 0 */ 0, 1234, +}; + +static const uint16_t ud_itab__960[] = { + /* 0 */ 0, 1235, +}; + +static const uint16_t ud_itab__961[] = { + /* 0 */ 0, 1236, +}; + +static const uint16_t ud_itab__962[] = { + /* 0 */ 0, 1237, +}; + +static const uint16_t ud_itab__963[] = { + /* 0 */ 0, 1238, +}; + +static const uint16_t ud_itab__964[] = { + /* 0 */ 0, 1239, +}; + +static const uint16_t ud_itab__965[] = { + /* 0 */ 0, 1240, +}; + +static const uint16_t ud_itab__966[] = { + /* 0 */ 0, 1241, +}; + +static const uint16_t ud_itab__967[] = { + /* 0 */ 0, 1242, +}; + +static const uint16_t ud_itab__968[] = { + /* 0 */ 0, 1243, +}; + +static const uint16_t ud_itab__969[] = { + /* 0 */ 0, 1244, +}; + +static const uint16_t ud_itab__970[] = { + /* 0 */ 0, 1245, +}; + +static const uint16_t ud_itab__971[] = { + /* 0 */ 0, 1246, +}; + +static const uint16_t ud_itab__972[] = { + /* 0 */ 0, 1247, +}; + +static const uint16_t ud_itab__973[] = { + /* 0 */ 0, 1248, +}; + +static const uint16_t ud_itab__974[] = { + /* 0 */ 0, 1249, +}; + +static const uint16_t ud_itab__975[] = { + /* 0 */ 0, 1250, +}; + +static const uint16_t ud_itab__976[] = { + /* 0 */ 0, 1251, +}; + +static const uint16_t ud_itab__977[] = { + /* 0 */ 0, 1252, +}; + +static const uint16_t ud_itab__978[] = { + /* 0 */ 0, 1253, +}; + +static const uint16_t ud_itab__979[] = { + /* 0 */ 0, 1254, +}; + +static const uint16_t ud_itab__980[] = { + /* 0 */ 0, 1255, +}; + +static const uint16_t ud_itab__981[] = { + /* 0 */ 0, 1256, +}; + +static const uint16_t ud_itab__982[] = { + /* 0 */ 0, 1257, +}; + +static const uint16_t ud_itab__983[] = { + /* 0 */ 0, 1258, +}; + +static const uint16_t ud_itab__984[] = { + /* 0 */ 0, 1259, +}; + +static const uint16_t ud_itab__985[] = { + /* 0 */ 0, 1260, +}; + +static const uint16_t ud_itab__986[] = { + /* 0 */ 0, 1261, +}; + +static const uint16_t ud_itab__987[] = { + /* 0 */ 0, 1262, +}; + +static const uint16_t ud_itab__988[] = { + /* 0 */ 0, 1263, +}; + +static const uint16_t ud_itab__989[] = { + /* 0 */ 0, 1264, +}; + +static const uint16_t ud_itab__990[] = { + /* 0 */ 0, 1265, +}; + +static const uint16_t ud_itab__991[] = { + /* 0 */ 0, 1266, +}; + +static const uint16_t ud_itab__992[] = { + /* 0 */ 0, 1267, +}; + +static const uint16_t ud_itab__993[] = { + /* 0 */ 0, 1268, +}; + +static const uint16_t ud_itab__994[] = { + /* 0 */ 0, 1269, +}; + +static const uint16_t ud_itab__995[] = { + /* 0 */ 0, 1270, +}; + +static const uint16_t ud_itab__996[] = { + /* 0 */ 0, 1271, +}; + +static const uint16_t ud_itab__997[] = { + /* 0 */ 0, 1272, +}; + +static const uint16_t ud_itab__949[] = { + /* 0 */ GROUP(950), GROUP(951), GROUP(952), GROUP(953), + /* 4 */ GROUP(954), GROUP(955), GROUP(956), GROUP(957), + /* 8 */ GROUP(958), GROUP(959), GROUP(960), GROUP(961), + /* c */ GROUP(962), GROUP(963), GROUP(964), GROUP(965), + /* 10 */ GROUP(966), GROUP(967), GROUP(968), GROUP(969), + /* 14 */ GROUP(970), GROUP(971), GROUP(972), GROUP(973), + /* 18 */ GROUP(974), GROUP(975), GROUP(976), GROUP(977), + /* 1c */ GROUP(978), GROUP(979), GROUP(980), GROUP(981), + /* 20 */ GROUP(982), GROUP(983), GROUP(984), GROUP(985), + /* 24 */ GROUP(986), GROUP(987), GROUP(988), GROUP(989), + /* 28 */ GROUP(990), GROUP(991), GROUP(992), GROUP(993), + /* 2c */ GROUP(994), GROUP(995), GROUP(996), GROUP(997), + /* 30 */ 0, 0, 0, 0, + /* 34 */ 0, 0, 0, 0, + /* 38 */ 0, 0, 0, 0, + /* 3c */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__940[] = { + /* 0 */ GROUP(941), GROUP(949), +}; + +static const uint16_t ud_itab__1000[] = { + /* 0 */ 1273, 0, +}; + +static const uint16_t ud_itab__1001[] = { + /* 0 */ 1274, 0, +}; + +static const uint16_t ud_itab__1002[] = { + /* 0 */ 1275, 0, +}; + +static const uint16_t ud_itab__1003[] = { + /* 0 */ 1276, 0, +}; + +static const uint16_t ud_itab__1004[] = { + /* 0 */ 1277, 0, +}; + +static const uint16_t ud_itab__1005[] = { + /* 0 */ 1278, 0, +}; + +static const uint16_t ud_itab__1006[] = { + /* 0 */ 1279, 0, +}; + +static const uint16_t ud_itab__1007[] = { + /* 0 */ 1280, 0, +}; + +static const uint16_t ud_itab__999[] = { + /* 0 */ GROUP(1000), GROUP(1001), GROUP(1002), GROUP(1003), + /* 4 */ GROUP(1004), GROUP(1005), GROUP(1006), GROUP(1007), +}; + +static const uint16_t ud_itab__1009[] = { + /* 0 */ 0, 1281, +}; + +static const uint16_t ud_itab__1010[] = { + /* 0 */ 0, 1282, +}; + +static const uint16_t ud_itab__1011[] = { + /* 0 */ 0, 1283, +}; + +static const uint16_t ud_itab__1012[] = { + /* 0 */ 0, 1284, +}; + +static const uint16_t ud_itab__1013[] = { + /* 0 */ 0, 1285, +}; + +static const uint16_t ud_itab__1014[] = { + /* 0 */ 0, 1286, +}; + +static const uint16_t ud_itab__1015[] = { + /* 0 */ 0, 1287, +}; + +static const uint16_t ud_itab__1016[] = { + /* 0 */ 0, 1288, +}; + +static const uint16_t ud_itab__1017[] = { + /* 0 */ 0, 1289, +}; + +static const uint16_t ud_itab__1018[] = { + /* 0 */ 0, 1290, +}; + +static const uint16_t ud_itab__1019[] = { + /* 0 */ 0, 1291, +}; + +static const uint16_t ud_itab__1020[] = { + /* 0 */ 0, 1292, +}; + +static const uint16_t ud_itab__1021[] = { + /* 0 */ 0, 1293, +}; + +static const uint16_t ud_itab__1022[] = { + /* 0 */ 0, 1294, +}; + +static const uint16_t ud_itab__1023[] = { + /* 0 */ 0, 1295, +}; + +static const uint16_t ud_itab__1024[] = { + /* 0 */ 0, 1296, +}; + +static const uint16_t ud_itab__1025[] = { + /* 0 */ 0, 1297, +}; + +static const uint16_t ud_itab__1026[] = { + /* 0 */ 0, 1298, +}; + +static const uint16_t ud_itab__1027[] = { + /* 0 */ 0, 1299, +}; + +static const uint16_t ud_itab__1028[] = { + /* 0 */ 0, 1300, +}; + +static const uint16_t ud_itab__1029[] = { + /* 0 */ 0, 1301, +}; + +static const uint16_t ud_itab__1030[] = { + /* 0 */ 0, 1302, +}; + +static const uint16_t ud_itab__1031[] = { + /* 0 */ 0, 1303, +}; + +static const uint16_t ud_itab__1032[] = { + /* 0 */ 0, 1304, +}; + +static const uint16_t ud_itab__1033[] = { + /* 0 */ 0, 1305, +}; + +static const uint16_t ud_itab__1034[] = { + /* 0 */ 0, 1306, +}; + +static const uint16_t ud_itab__1035[] = { + /* 0 */ 0, 1307, +}; + +static const uint16_t ud_itab__1036[] = { + /* 0 */ 0, 1308, +}; + +static const uint16_t ud_itab__1037[] = { + /* 0 */ 0, 1309, +}; + +static const uint16_t ud_itab__1038[] = { + /* 0 */ 0, 1310, +}; + +static const uint16_t ud_itab__1039[] = { + /* 0 */ 0, 1311, +}; + +static const uint16_t ud_itab__1040[] = { + /* 0 */ 0, 1312, +}; + +static const uint16_t ud_itab__1041[] = { + /* 0 */ 0, 1313, +}; + +static const uint16_t ud_itab__1042[] = { + /* 0 */ 0, 1314, +}; + +static const uint16_t ud_itab__1043[] = { + /* 0 */ 0, 1315, +}; + +static const uint16_t ud_itab__1044[] = { + /* 0 */ 0, 1316, +}; + +static const uint16_t ud_itab__1045[] = { + /* 0 */ 0, 1317, +}; + +static const uint16_t ud_itab__1046[] = { + /* 0 */ 0, 1318, +}; + +static const uint16_t ud_itab__1047[] = { + /* 0 */ 0, 1319, +}; + +static const uint16_t ud_itab__1048[] = { + /* 0 */ 0, 1320, +}; + +static const uint16_t ud_itab__1049[] = { + /* 0 */ 0, 1321, +}; + +static const uint16_t ud_itab__1050[] = { + /* 0 */ 0, 1322, +}; + +static const uint16_t ud_itab__1051[] = { + /* 0 */ 0, 1323, +}; + +static const uint16_t ud_itab__1052[] = { + /* 0 */ 0, 1324, +}; + +static const uint16_t ud_itab__1053[] = { + /* 0 */ 0, 1325, +}; + +static const uint16_t ud_itab__1054[] = { + /* 0 */ 0, 1326, +}; + +static const uint16_t ud_itab__1055[] = { + /* 0 */ 0, 1327, +}; + +static const uint16_t ud_itab__1056[] = { + /* 0 */ 0, 1328, +}; + +static const uint16_t ud_itab__1057[] = { + /* 0 */ 0, 1329, +}; + +static const uint16_t ud_itab__1058[] = { + /* 0 */ 0, 1330, +}; + +static const uint16_t ud_itab__1059[] = { + /* 0 */ 0, 1331, +}; + +static const uint16_t ud_itab__1060[] = { + /* 0 */ 0, 1332, +}; + +static const uint16_t ud_itab__1061[] = { + /* 0 */ 0, 1333, +}; + +static const uint16_t ud_itab__1062[] = { + /* 0 */ 0, 1334, +}; + +static const uint16_t ud_itab__1063[] = { + /* 0 */ 0, 1335, +}; + +static const uint16_t ud_itab__1064[] = { + /* 0 */ 0, 1336, +}; + +static const uint16_t ud_itab__1065[] = { + /* 0 */ 0, 1337, +}; + +static const uint16_t ud_itab__1008[] = { + /* 0 */ GROUP(1009), GROUP(1010), GROUP(1011), GROUP(1012), + /* 4 */ GROUP(1013), GROUP(1014), GROUP(1015), GROUP(1016), + /* 8 */ GROUP(1017), GROUP(1018), GROUP(1019), GROUP(1020), + /* c */ GROUP(1021), GROUP(1022), GROUP(1023), GROUP(1024), + /* 10 */ GROUP(1025), GROUP(1026), GROUP(1027), GROUP(1028), + /* 14 */ GROUP(1029), GROUP(1030), GROUP(1031), GROUP(1032), + /* 18 */ 0, GROUP(1033), 0, 0, + /* 1c */ 0, 0, 0, 0, + /* 20 */ GROUP(1034), GROUP(1035), GROUP(1036), GROUP(1037), + /* 24 */ GROUP(1038), GROUP(1039), GROUP(1040), GROUP(1041), + /* 28 */ GROUP(1042), GROUP(1043), GROUP(1044), GROUP(1045), + /* 2c */ GROUP(1046), GROUP(1047), GROUP(1048), GROUP(1049), + /* 30 */ GROUP(1050), GROUP(1051), GROUP(1052), GROUP(1053), + /* 34 */ GROUP(1054), GROUP(1055), GROUP(1056), GROUP(1057), + /* 38 */ GROUP(1058), GROUP(1059), GROUP(1060), GROUP(1061), + /* 3c */ GROUP(1062), GROUP(1063), GROUP(1064), GROUP(1065), +}; + +static const uint16_t ud_itab__998[] = { + /* 0 */ GROUP(999), GROUP(1008), +}; + +static const uint16_t ud_itab__1068[] = { + /* 0 */ 1338, 0, +}; + +static const uint16_t ud_itab__1069[] = { + /* 0 */ 1339, 0, +}; + +static const uint16_t ud_itab__1070[] = { + /* 0 */ 1340, 0, +}; + +static const uint16_t ud_itab__1071[] = { + /* 0 */ 1341, 0, +}; + +static const uint16_t ud_itab__1072[] = { + /* 0 */ 1342, 0, +}; + +static const uint16_t ud_itab__1073[] = { + /* 0 */ 1343, 0, +}; + +static const uint16_t ud_itab__1074[] = { + /* 0 */ 1344, 0, +}; + +static const uint16_t ud_itab__1075[] = { + /* 0 */ 1345, 0, +}; + +static const uint16_t ud_itab__1067[] = { + /* 0 */ GROUP(1068), GROUP(1069), GROUP(1070), GROUP(1071), + /* 4 */ GROUP(1072), GROUP(1073), GROUP(1074), GROUP(1075), +}; + +static const uint16_t ud_itab__1077[] = { + /* 0 */ 0, 1346, +}; + +static const uint16_t ud_itab__1078[] = { + /* 0 */ 0, 1347, +}; + +static const uint16_t ud_itab__1079[] = { + /* 0 */ 0, 1348, +}; + +static const uint16_t ud_itab__1080[] = { + /* 0 */ 0, 1349, +}; + +static const uint16_t ud_itab__1081[] = { + /* 0 */ 0, 1350, +}; + +static const uint16_t ud_itab__1082[] = { + /* 0 */ 0, 1351, +}; + +static const uint16_t ud_itab__1083[] = { + /* 0 */ 0, 1352, +}; + +static const uint16_t ud_itab__1084[] = { + /* 0 */ 0, 1353, +}; + +static const uint16_t ud_itab__1085[] = { + /* 0 */ 0, 1354, +}; + +static const uint16_t ud_itab__1086[] = { + /* 0 */ 0, 1355, +}; + +static const uint16_t ud_itab__1087[] = { + /* 0 */ 0, 1356, +}; + +static const uint16_t ud_itab__1088[] = { + /* 0 */ 0, 1357, +}; + +static const uint16_t ud_itab__1089[] = { + /* 0 */ 0, 1358, +}; + +static const uint16_t ud_itab__1090[] = { + /* 0 */ 0, 1359, +}; + +static const uint16_t ud_itab__1091[] = { + /* 0 */ 0, 1360, +}; + +static const uint16_t ud_itab__1092[] = { + /* 0 */ 0, 1361, +}; + +static const uint16_t ud_itab__1093[] = { + /* 0 */ 0, 1362, +}; + +static const uint16_t ud_itab__1094[] = { + /* 0 */ 0, 1363, +}; + +static const uint16_t ud_itab__1095[] = { + /* 0 */ 0, 1364, +}; + +static const uint16_t ud_itab__1096[] = { + /* 0 */ 0, 1365, +}; + +static const uint16_t ud_itab__1097[] = { + /* 0 */ 0, 1366, +}; + +static const uint16_t ud_itab__1098[] = { + /* 0 */ 0, 1367, +}; + +static const uint16_t ud_itab__1099[] = { + /* 0 */ 0, 1368, +}; + +static const uint16_t ud_itab__1100[] = { + /* 0 */ 0, 1369, +}; + +static const uint16_t ud_itab__1101[] = { + /* 0 */ 0, 1370, +}; + +static const uint16_t ud_itab__1102[] = { + /* 0 */ 0, 1371, +}; + +static const uint16_t ud_itab__1103[] = { + /* 0 */ 0, 1372, +}; + +static const uint16_t ud_itab__1104[] = { + /* 0 */ 0, 1373, +}; + +static const uint16_t ud_itab__1105[] = { + /* 0 */ 0, 1374, +}; + +static const uint16_t ud_itab__1106[] = { + /* 0 */ 0, 1375, +}; + +static const uint16_t ud_itab__1107[] = { + /* 0 */ 0, 1376, +}; + +static const uint16_t ud_itab__1108[] = { + /* 0 */ 0, 1377, +}; + +static const uint16_t ud_itab__1109[] = { + /* 0 */ 0, 1378, +}; + +static const uint16_t ud_itab__1110[] = { + /* 0 */ 0, 1379, +}; + +static const uint16_t ud_itab__1111[] = { + /* 0 */ 0, 1380, +}; + +static const uint16_t ud_itab__1112[] = { + /* 0 */ 0, 1381, +}; + +static const uint16_t ud_itab__1113[] = { + /* 0 */ 0, 1382, +}; + +static const uint16_t ud_itab__1114[] = { + /* 0 */ 0, 1383, +}; + +static const uint16_t ud_itab__1115[] = { + /* 0 */ 0, 1384, +}; + +static const uint16_t ud_itab__1116[] = { + /* 0 */ 0, 1385, +}; + +static const uint16_t ud_itab__1117[] = { + /* 0 */ 0, 1386, +}; + +static const uint16_t ud_itab__1118[] = { + /* 0 */ 0, 1387, +}; + +static const uint16_t ud_itab__1119[] = { + /* 0 */ 0, 1388, +}; + +static const uint16_t ud_itab__1120[] = { + /* 0 */ 0, 1389, +}; + +static const uint16_t ud_itab__1121[] = { + /* 0 */ 0, 1390, +}; + +static const uint16_t ud_itab__1122[] = { + /* 0 */ 0, 1391, +}; + +static const uint16_t ud_itab__1123[] = { + /* 0 */ 0, 1392, +}; + +static const uint16_t ud_itab__1124[] = { + /* 0 */ 0, 1393, +}; + +static const uint16_t ud_itab__1125[] = { + /* 0 */ 0, 1394, +}; + +static const uint16_t ud_itab__1076[] = { + /* 0 */ GROUP(1077), GROUP(1078), GROUP(1079), GROUP(1080), + /* 4 */ GROUP(1081), GROUP(1082), GROUP(1083), GROUP(1084), + /* 8 */ GROUP(1085), GROUP(1086), GROUP(1087), GROUP(1088), + /* c */ GROUP(1089), GROUP(1090), GROUP(1091), GROUP(1092), + /* 10 */ GROUP(1093), GROUP(1094), GROUP(1095), GROUP(1096), + /* 14 */ GROUP(1097), GROUP(1098), GROUP(1099), GROUP(1100), + /* 18 */ GROUP(1101), GROUP(1102), GROUP(1103), GROUP(1104), + /* 1c */ GROUP(1105), GROUP(1106), GROUP(1107), GROUP(1108), + /* 20 */ GROUP(1109), 0, 0, 0, + /* 24 */ 0, 0, 0, 0, + /* 28 */ GROUP(1110), GROUP(1111), GROUP(1112), GROUP(1113), + /* 2c */ GROUP(1114), GROUP(1115), GROUP(1116), GROUP(1117), + /* 30 */ GROUP(1118), GROUP(1119), GROUP(1120), GROUP(1121), + /* 34 */ GROUP(1122), GROUP(1123), GROUP(1124), GROUP(1125), + /* 38 */ 0, 0, 0, 0, + /* 3c */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__1066[] = { + /* 0 */ GROUP(1067), GROUP(1076), +}; + +static const uint16_t ud_itab__1126[] = { + /* 0 */ 1398, 1399, 1400, +}; + +static const uint16_t ud_itab__1127[] = { + /* 0 */ 1407, 0, +}; + +static const uint16_t ud_itab__1128[] = { + /* 0 */ 1419, 1420, 1421, 1422, + /* 4 */ 1423, 1424, 1425, 1426, +}; + +static const uint16_t ud_itab__1129[] = { + /* 0 */ 1427, 1428, 1429, 1430, + /* 4 */ 1431, 1432, 1433, 1434, +}; + +static const uint16_t ud_itab__1130[] = { + /* 0 */ 1441, 1442, 0, 0, + /* 4 */ 0, 0, 0, 0, +}; + +static const uint16_t ud_itab__1132[] = { + /* 0 */ 1445, 1446, +}; + +static const uint16_t ud_itab__1131[] = { + /* 0 */ 1443, 1444, GROUP(1132), 1447, + /* 4 */ 1448, 1449, 1450, 0, +}; + +const uint16_t ud_itab__0[] = { + /* 0 */ 1, 2, 3, 4, + /* 4 */ 5, 6, GROUP(1), GROUP(2), + /* 8 */ 9, 10, 11, 12, + /* c */ 13, 14, GROUP(3), GROUP(4), + /* 10 */ 628, 629, 630, 631, + /* 14 */ 632, 633, GROUP(563), GROUP(564), + /* 18 */ 636, 637, 638, 639, + /* 1c */ 640, 641, GROUP(565), GROUP(566), + /* 20 */ 644, 645, 646, 647, + /* 24 */ 648, 649, 0, GROUP(567), + /* 28 */ 651, 652, 653, 654, + /* 2c */ 655, 656, 0, GROUP(568), + /* 30 */ 658, 659, 660, 661, + /* 34 */ 662, 663, 0, GROUP(569), + /* 38 */ 665, 666, 667, 668, + /* 3c */ 669, 670, 0, GROUP(570), + /* 40 */ 672, 673, 674, 675, + /* 44 */ 676, 677, 678, 679, + /* 48 */ 680, 681, 682, 683, + /* 4c */ 684, 685, 686, 687, + /* 50 */ 688, 689, 690, 691, + /* 54 */ 692, 693, 694, 695, + /* 58 */ 696, 697, 698, 699, + /* 5c */ 700, 701, 702, 703, + /* 60 */ GROUP(571), GROUP(574), GROUP(577), GROUP(578), + /* 64 */ 0, 0, 0, 0, + /* 68 */ 711, 712, 713, 714, + /* 6c */ 715, GROUP(579), 718, GROUP(580), + /* 70 */ 721, 722, 723, 724, + /* 74 */ 725, 726, 727, 728, + /* 78 */ 729, 730, 731, 732, + /* 7c */ 733, 734, 735, 736, + /* 80 */ GROUP(581), GROUP(582), GROUP(583), GROUP(592), + /* 84 */ 769, 770, 771, 772, + /* 88 */ 773, 774, 775, 776, + /* 8c */ 777, 778, 779, GROUP(593), + /* 90 */ 781, 782, 783, 784, + /* 94 */ 785, 786, 787, 788, + /* 98 */ GROUP(594), GROUP(595), GROUP(596), 796, + /* 9c */ GROUP(597), GROUP(601), 806, 807, + /* a0 */ 808, 809, 810, 811, + /* a4 */ 812, GROUP(605), 816, GROUP(606), + /* a8 */ 820, 821, 822, GROUP(607), + /* ac */ 826, GROUP(608), 830, GROUP(609), + /* b0 */ 834, 835, 836, 837, + /* b4 */ 838, 839, 840, 841, + /* b8 */ 842, 843, 844, 845, + /* bc */ 846, 847, 848, 849, + /* c0 */ GROUP(610), GROUP(611), 866, 867, + /* c4 */ GROUP(612), GROUP(613), GROUP(614), GROUP(615), + /* c8 */ 872, 873, 874, 875, + /* cc */ 876, 877, GROUP(616), GROUP(617), + /* d0 */ GROUP(618), GROUP(619), GROUP(620), GROUP(621), + /* d4 */ GROUP(622), GROUP(623), GROUP(624), 917, + /* d8 */ GROUP(625), GROUP(700), GROUP(762), GROUP(806), + /* dc */ GROUP(865), GROUP(940), GROUP(998), GROUP(1066), + /* e0 */ 1395, 1396, 1397, GROUP(1126), + /* e4 */ 1401, 1402, 1403, 1404, + /* e8 */ 1405, 1406, GROUP(1127), 1408, + /* ec */ 1409, 1410, 1411, 1412, + /* f0 */ 1413, 1414, 1415, 1416, + /* f4 */ 1417, 1418, GROUP(1128), GROUP(1129), + /* f8 */ 1435, 1436, 1437, 1438, + /* fc */ 1439, 1440, GROUP(1130), GROUP(1131), +}; + + +struct ud_lookup_table_list_entry ud_lookup_table_list[] = { + /* 000 */ { ud_itab__0, UD_TAB__OPC_TABLE, "table0" }, + /* 001 */ { ud_itab__1, UD_TAB__OPC_MODE, "/m" }, + /* 002 */ { ud_itab__2, UD_TAB__OPC_MODE, "/m" }, + /* 003 */ { ud_itab__3, UD_TAB__OPC_MODE, "/m" }, + /* 004 */ { ud_itab__4, UD_TAB__OPC_TABLE, "0f" }, + /* 005 */ { ud_itab__5, UD_TAB__OPC_REG, "/reg" }, + /* 006 */ { ud_itab__6, UD_TAB__OPC_SSE, "/sse" }, + /* 007 */ { ud_itab__7, UD_TAB__OPC_SSE, "/sse" }, + /* 008 */ { ud_itab__8, UD_TAB__OPC_SSE, "/sse" }, + /* 009 */ { ud_itab__9, UD_TAB__OPC_SSE, "/sse" }, + /* 010 */ { ud_itab__10, UD_TAB__OPC_SSE, "/sse" }, + /* 011 */ { ud_itab__11, UD_TAB__OPC_SSE, "/sse" }, + /* 012 */ { ud_itab__12, UD_TAB__OPC_MOD, "/mod" }, + /* 013 */ { ud_itab__13, UD_TAB__OPC_REG, "/reg" }, + /* 014 */ { ud_itab__14, UD_TAB__OPC_SSE, "/sse" }, + /* 015 */ { ud_itab__15, UD_TAB__OPC_MOD, "/mod" }, + /* 016 */ { ud_itab__16, UD_TAB__OPC_SSE, "/sse" }, + /* 017 */ { ud_itab__17, UD_TAB__OPC_MOD, "/mod" }, + /* 018 */ { ud_itab__18, UD_TAB__OPC_SSE, "/sse" }, + /* 019 */ { ud_itab__19, UD_TAB__OPC_MOD, "/mod" }, + /* 020 */ { ud_itab__20, UD_TAB__OPC_SSE, "/sse" }, + /* 021 */ { ud_itab__21, UD_TAB__OPC_MOD, "/mod" }, + /* 022 */ { ud_itab__22, UD_TAB__OPC_SSE, "/sse" }, + /* 023 */ { ud_itab__23, UD_TAB__OPC_MOD, "/mod" }, + /* 024 */ { ud_itab__24, UD_TAB__OPC_SSE, "/sse" }, + /* 025 */ { ud_itab__25, UD_TAB__OPC_MOD, "/mod" }, + /* 026 */ { ud_itab__26, UD_TAB__OPC_SSE, "/sse" }, + /* 027 */ { ud_itab__27, UD_TAB__OPC_MOD, "/mod" }, + /* 028 */ { ud_itab__28, UD_TAB__OPC_REG, "/reg" }, + /* 029 */ { ud_itab__29, UD_TAB__OPC_RM, "/rm" }, + /* 030 */ { ud_itab__30, UD_TAB__OPC_SSE, "/sse" }, + /* 031 */ { ud_itab__31, UD_TAB__OPC_MOD, "/mod" }, + /* 032 */ { ud_itab__32, UD_TAB__OPC_VENDOR, "intel" }, + /* 033 */ { ud_itab__33, UD_TAB__OPC_SSE, "/sse" }, + /* 034 */ { ud_itab__34, UD_TAB__OPC_MOD, "/mod" }, + /* 035 */ { ud_itab__35, UD_TAB__OPC_VENDOR, "intel" }, + /* 036 */ { ud_itab__36, UD_TAB__OPC_SSE, "/sse" }, + /* 037 */ { ud_itab__37, UD_TAB__OPC_MOD, "/mod" }, + /* 038 */ { ud_itab__38, UD_TAB__OPC_VENDOR, "intel" }, + /* 039 */ { ud_itab__39, UD_TAB__OPC_SSE, "/sse" }, + /* 040 */ { ud_itab__40, UD_TAB__OPC_MOD, "/mod" }, + /* 041 */ { ud_itab__41, UD_TAB__OPC_VENDOR, "intel" }, + /* 042 */ { ud_itab__42, UD_TAB__OPC_RM, "/rm" }, + /* 043 */ { ud_itab__43, UD_TAB__OPC_SSE, "/sse" }, + /* 044 */ { ud_itab__44, UD_TAB__OPC_MOD, "/mod" }, + /* 045 */ { ud_itab__45, UD_TAB__OPC_SSE, "/sse" }, + /* 046 */ { ud_itab__46, UD_TAB__OPC_MOD, "/mod" }, + /* 047 */ { ud_itab__47, UD_TAB__OPC_RM, "/rm" }, + /* 048 */ { ud_itab__48, UD_TAB__OPC_SSE, "/sse" }, + /* 049 */ { ud_itab__49, UD_TAB__OPC_MOD, "/mod" }, + /* 050 */ { ud_itab__50, UD_TAB__OPC_SSE, "/sse" }, + /* 051 */ { ud_itab__51, UD_TAB__OPC_MOD, "/mod" }, + /* 052 */ { ud_itab__52, UD_TAB__OPC_RM, "/rm" }, + /* 053 */ { ud_itab__53, UD_TAB__OPC_SSE, "/sse" }, + /* 054 */ { ud_itab__54, UD_TAB__OPC_MOD, "/mod" }, + /* 055 */ { ud_itab__55, UD_TAB__OPC_VENDOR, "amd" }, + /* 056 */ { ud_itab__56, UD_TAB__OPC_SSE, "/sse" }, + /* 057 */ { ud_itab__57, UD_TAB__OPC_MOD, "/mod" }, + /* 058 */ { ud_itab__58, UD_TAB__OPC_VENDOR, "amd" }, + /* 059 */ { ud_itab__59, UD_TAB__OPC_SSE, "/sse" }, + /* 060 */ { ud_itab__60, UD_TAB__OPC_MOD, "/mod" }, + /* 061 */ { ud_itab__61, UD_TAB__OPC_VENDOR, "amd" }, + /* 062 */ { ud_itab__62, UD_TAB__OPC_SSE, "/sse" }, + /* 063 */ { ud_itab__63, UD_TAB__OPC_MOD, "/mod" }, + /* 064 */ { ud_itab__64, UD_TAB__OPC_VENDOR, "amd" }, + /* 065 */ { ud_itab__65, UD_TAB__OPC_SSE, "/sse" }, + /* 066 */ { ud_itab__66, UD_TAB__OPC_MOD, "/mod" }, + /* 067 */ { ud_itab__67, UD_TAB__OPC_VENDOR, "amd" }, + /* 068 */ { ud_itab__68, UD_TAB__OPC_SSE, "/sse" }, + /* 069 */ { ud_itab__69, UD_TAB__OPC_MOD, "/mod" }, + /* 070 */ { ud_itab__70, UD_TAB__OPC_VENDOR, "amd" }, + /* 071 */ { ud_itab__71, UD_TAB__OPC_SSE, "/sse" }, + /* 072 */ { ud_itab__72, UD_TAB__OPC_MOD, "/mod" }, + /* 073 */ { ud_itab__73, UD_TAB__OPC_VENDOR, "amd" }, + /* 074 */ { ud_itab__74, UD_TAB__OPC_SSE, "/sse" }, + /* 075 */ { ud_itab__75, UD_TAB__OPC_MOD, "/mod" }, + /* 076 */ { ud_itab__76, UD_TAB__OPC_VENDOR, "amd" }, + /* 077 */ { ud_itab__77, UD_TAB__OPC_SSE, "/sse" }, + /* 078 */ { ud_itab__78, UD_TAB__OPC_MOD, "/mod" }, + /* 079 */ { ud_itab__79, UD_TAB__OPC_SSE, "/sse" }, + /* 080 */ { ud_itab__80, UD_TAB__OPC_MOD, "/mod" }, + /* 081 */ { ud_itab__81, UD_TAB__OPC_RM, "/rm" }, + /* 082 */ { ud_itab__82, UD_TAB__OPC_SSE, "/sse" }, + /* 083 */ { ud_itab__83, UD_TAB__OPC_MOD, "/mod" }, + /* 084 */ { ud_itab__84, UD_TAB__OPC_SSE, "/sse" }, + /* 085 */ { ud_itab__85, UD_TAB__OPC_MOD, "/mod" }, + /* 086 */ { ud_itab__86, UD_TAB__OPC_VENDOR, "amd" }, + /* 087 */ { ud_itab__87, UD_TAB__OPC_SSE, "/sse" }, + /* 088 */ { ud_itab__88, UD_TAB__OPC_SSE, "/sse" }, + /* 089 */ { ud_itab__89, UD_TAB__OPC_SSE, "/sse" }, + /* 090 */ { ud_itab__90, UD_TAB__OPC_SSE, "/sse" }, + /* 091 */ { ud_itab__91, UD_TAB__OPC_SSE, "/sse" }, + /* 092 */ { ud_itab__92, UD_TAB__OPC_SSE, "/sse" }, + /* 093 */ { ud_itab__93, UD_TAB__OPC_SSE, "/sse" }, + /* 094 */ { ud_itab__94, UD_TAB__OPC_SSE, "/sse" }, + /* 095 */ { ud_itab__95, UD_TAB__OPC_REG, "/reg" }, + /* 096 */ { ud_itab__96, UD_TAB__OPC_SSE, "/sse" }, + /* 097 */ { ud_itab__97, UD_TAB__OPC_SSE, "/sse" }, + /* 098 */ { ud_itab__98, UD_TAB__OPC_SSE, "/sse" }, + /* 099 */ { ud_itab__99, UD_TAB__OPC_SSE, "/sse" }, + /* 100 */ { ud_itab__100, UD_TAB__OPC_SSE, "/sse" }, + /* 101 */ { ud_itab__101, UD_TAB__OPC_SSE, "/sse" }, + /* 102 */ { ud_itab__102, UD_TAB__OPC_SSE, "/sse" }, + /* 103 */ { ud_itab__103, UD_TAB__OPC_SSE, "/sse" }, + /* 104 */ { ud_itab__104, UD_TAB__OPC_SSE, "/sse" }, + /* 105 */ { ud_itab__105, UD_TAB__OPC_3DNOW, "/3dnow" }, + /* 106 */ { ud_itab__106, UD_TAB__OPC_SSE, "/sse" }, + /* 107 */ { ud_itab__107, UD_TAB__OPC_SSE, "/sse" }, + /* 108 */ { ud_itab__108, UD_TAB__OPC_MOD, "/mod" }, + /* 109 */ { ud_itab__109, UD_TAB__OPC_SSE, "/sse" }, + /* 110 */ { ud_itab__110, UD_TAB__OPC_MOD, "/mod" }, + /* 111 */ { ud_itab__111, UD_TAB__OPC_MOD, "/mod" }, + /* 112 */ { ud_itab__112, UD_TAB__OPC_MOD, "/mod" }, + /* 113 */ { ud_itab__113, UD_TAB__OPC_MOD, "/mod" }, + /* 114 */ { ud_itab__114, UD_TAB__OPC_SSE, "/sse" }, + /* 115 */ { ud_itab__115, UD_TAB__OPC_MOD, "/mod" }, + /* 116 */ { ud_itab__116, UD_TAB__OPC_MOD, "/mod" }, + /* 117 */ { ud_itab__117, UD_TAB__OPC_MOD, "/mod" }, + /* 118 */ { ud_itab__118, UD_TAB__OPC_SSE, "/sse" }, + /* 119 */ { ud_itab__119, UD_TAB__OPC_SSE, "/sse" }, + /* 120 */ { ud_itab__120, UD_TAB__OPC_SSE, "/sse" }, + /* 121 */ { ud_itab__121, UD_TAB__OPC_MOD, "/mod" }, + /* 122 */ { ud_itab__122, UD_TAB__OPC_SSE, "/sse" }, + /* 123 */ { ud_itab__123, UD_TAB__OPC_MOD, "/mod" }, + /* 124 */ { ud_itab__124, UD_TAB__OPC_MOD, "/mod" }, + /* 125 */ { ud_itab__125, UD_TAB__OPC_MOD, "/mod" }, + /* 126 */ { ud_itab__126, UD_TAB__OPC_SSE, "/sse" }, + /* 127 */ { ud_itab__127, UD_TAB__OPC_MOD, "/mod" }, + /* 128 */ { ud_itab__128, UD_TAB__OPC_MOD, "/mod" }, + /* 129 */ { ud_itab__129, UD_TAB__OPC_SSE, "/sse" }, + /* 130 */ { ud_itab__130, UD_TAB__OPC_REG, "/reg" }, + /* 131 */ { ud_itab__131, UD_TAB__OPC_SSE, "/sse" }, + /* 132 */ { ud_itab__132, UD_TAB__OPC_SSE, "/sse" }, + /* 133 */ { ud_itab__133, UD_TAB__OPC_SSE, "/sse" }, + /* 134 */ { ud_itab__134, UD_TAB__OPC_SSE, "/sse" }, + /* 135 */ { ud_itab__135, UD_TAB__OPC_SSE, "/sse" }, + /* 136 */ { ud_itab__136, UD_TAB__OPC_SSE, "/sse" }, + /* 137 */ { ud_itab__137, UD_TAB__OPC_SSE, "/sse" }, + /* 138 */ { ud_itab__138, UD_TAB__OPC_SSE, "/sse" }, + /* 139 */ { ud_itab__139, UD_TAB__OPC_SSE, "/sse" }, + /* 140 */ { ud_itab__140, UD_TAB__OPC_SSE, "/sse" }, + /* 141 */ { ud_itab__141, UD_TAB__OPC_SSE, "/sse" }, + /* 142 */ { ud_itab__142, UD_TAB__OPC_SSE, "/sse" }, + /* 143 */ { ud_itab__143, UD_TAB__OPC_SSE, "/sse" }, + /* 144 */ { ud_itab__144, UD_TAB__OPC_SSE, "/sse" }, + /* 145 */ { ud_itab__145, UD_TAB__OPC_SSE, "/sse" }, + /* 146 */ { ud_itab__146, UD_TAB__OPC_SSE, "/sse" }, + /* 147 */ { ud_itab__147, UD_TAB__OPC_SSE, "/sse" }, + /* 148 */ { ud_itab__148, UD_TAB__OPC_SSE, "/sse" }, + /* 149 */ { ud_itab__149, UD_TAB__OPC_SSE, "/sse" }, + /* 150 */ { ud_itab__150, UD_TAB__OPC_SSE, "/sse" }, + /* 151 */ { ud_itab__151, UD_TAB__OPC_SSE, "/sse" }, + /* 152 */ { ud_itab__152, UD_TAB__OPC_SSE, "/sse" }, + /* 153 */ { ud_itab__153, UD_TAB__OPC_SSE, "/sse" }, + /* 154 */ { ud_itab__154, UD_TAB__OPC_SSE, "/sse" }, + /* 155 */ { ud_itab__155, UD_TAB__OPC_SSE, "/sse" }, + /* 156 */ { ud_itab__156, UD_TAB__OPC_SSE, "/sse" }, + /* 157 */ { ud_itab__157, UD_TAB__OPC_SSE, "/sse" }, + /* 158 */ { ud_itab__158, UD_TAB__OPC_SSE, "/sse" }, + /* 159 */ { ud_itab__159, UD_TAB__OPC_MODE, "/m" }, + /* 160 */ { ud_itab__160, UD_TAB__OPC_VENDOR, "intel" }, + /* 161 */ { ud_itab__161, UD_TAB__OPC_SSE, "/sse" }, + /* 162 */ { ud_itab__162, UD_TAB__OPC_MODE, "/m" }, + /* 163 */ { ud_itab__163, UD_TAB__OPC_VENDOR, "intel" }, + /* 164 */ { ud_itab__164, UD_TAB__OPC_SSE, "/sse" }, + /* 165 */ { ud_itab__165, UD_TAB__OPC_TABLE, "38" }, + /* 166 */ { ud_itab__166, UD_TAB__OPC_SSE, "/sse" }, + /* 167 */ { ud_itab__167, UD_TAB__OPC_SSE, "/sse" }, + /* 168 */ { ud_itab__168, UD_TAB__OPC_SSE, "/sse" }, + /* 169 */ { ud_itab__169, UD_TAB__OPC_SSE, "/sse" }, + /* 170 */ { ud_itab__170, UD_TAB__OPC_SSE, "/sse" }, + /* 171 */ { ud_itab__171, UD_TAB__OPC_SSE, "/sse" }, + /* 172 */ { ud_itab__172, UD_TAB__OPC_SSE, "/sse" }, + /* 173 */ { ud_itab__173, UD_TAB__OPC_SSE, "/sse" }, + /* 174 */ { ud_itab__174, UD_TAB__OPC_SSE, "/sse" }, + /* 175 */ { ud_itab__175, UD_TAB__OPC_SSE, "/sse" }, + /* 176 */ { ud_itab__176, UD_TAB__OPC_SSE, "/sse" }, + /* 177 */ { ud_itab__177, UD_TAB__OPC_SSE, "/sse" }, + /* 178 */ { ud_itab__178, UD_TAB__OPC_SSE, "/sse" }, + /* 179 */ { ud_itab__179, UD_TAB__OPC_SSE, "/sse" }, + /* 180 */ { ud_itab__180, UD_TAB__OPC_SSE, "/sse" }, + /* 181 */ { ud_itab__181, UD_TAB__OPC_SSE, "/sse" }, + /* 182 */ { ud_itab__182, UD_TAB__OPC_SSE, "/sse" }, + /* 183 */ { ud_itab__183, UD_TAB__OPC_SSE, "/sse" }, + /* 184 */ { ud_itab__184, UD_TAB__OPC_SSE, "/sse" }, + /* 185 */ { ud_itab__185, UD_TAB__OPC_SSE, "/sse" }, + /* 186 */ { ud_itab__186, UD_TAB__OPC_SSE, "/sse" }, + /* 187 */ { ud_itab__187, UD_TAB__OPC_SSE, "/sse" }, + /* 188 */ { ud_itab__188, UD_TAB__OPC_SSE, "/sse" }, + /* 189 */ { ud_itab__189, UD_TAB__OPC_SSE, "/sse" }, + /* 190 */ { ud_itab__190, UD_TAB__OPC_SSE, "/sse" }, + /* 191 */ { ud_itab__191, UD_TAB__OPC_SSE, "/sse" }, + /* 192 */ { ud_itab__192, UD_TAB__OPC_SSE, "/sse" }, + /* 193 */ { ud_itab__193, UD_TAB__OPC_SSE, "/sse" }, + /* 194 */ { ud_itab__194, UD_TAB__OPC_SSE, "/sse" }, + /* 195 */ { ud_itab__195, UD_TAB__OPC_SSE, "/sse" }, + /* 196 */ { ud_itab__196, UD_TAB__OPC_SSE, "/sse" }, + /* 197 */ { ud_itab__197, UD_TAB__OPC_SSE, "/sse" }, + /* 198 */ { ud_itab__198, UD_TAB__OPC_SSE, "/sse" }, + /* 199 */ { ud_itab__199, UD_TAB__OPC_SSE, "/sse" }, + /* 200 */ { ud_itab__200, UD_TAB__OPC_SSE, "/sse" }, + /* 201 */ { ud_itab__201, UD_TAB__OPC_SSE, "/sse" }, + /* 202 */ { ud_itab__202, UD_TAB__OPC_SSE, "/sse" }, + /* 203 */ { ud_itab__203, UD_TAB__OPC_SSE, "/sse" }, + /* 204 */ { ud_itab__204, UD_TAB__OPC_SSE, "/sse" }, + /* 205 */ { ud_itab__205, UD_TAB__OPC_SSE, "/sse" }, + /* 206 */ { ud_itab__206, UD_TAB__OPC_SSE, "/sse" }, + /* 207 */ { ud_itab__207, UD_TAB__OPC_SSE, "/sse" }, + /* 208 */ { ud_itab__208, UD_TAB__OPC_SSE, "/sse" }, + /* 209 */ { ud_itab__209, UD_TAB__OPC_SSE, "/sse" }, + /* 210 */ { ud_itab__210, UD_TAB__OPC_SSE, "/sse" }, + /* 211 */ { ud_itab__211, UD_TAB__OPC_SSE, "/sse" }, + /* 212 */ { ud_itab__212, UD_TAB__OPC_SSE, "/sse" }, + /* 213 */ { ud_itab__213, UD_TAB__OPC_MODE, "/m" }, + /* 214 */ { ud_itab__214, UD_TAB__OPC_VENDOR, "intel" }, + /* 215 */ { ud_itab__215, UD_TAB__OPC_SSE, "/sse" }, + /* 216 */ { ud_itab__216, UD_TAB__OPC_MODE, "/m" }, + /* 217 */ { ud_itab__217, UD_TAB__OPC_VENDOR, "intel" }, + /* 218 */ { ud_itab__218, UD_TAB__OPC_SSE, "/sse" }, + /* 219 */ { ud_itab__219, UD_TAB__OPC_SSE, "/sse" }, + /* 220 */ { ud_itab__220, UD_TAB__OPC_SSE, "/sse" }, + /* 221 */ { ud_itab__221, UD_TAB__OPC_SSE, "/sse" }, + /* 222 */ { ud_itab__222, UD_TAB__OPC_SSE, "/sse" }, + /* 223 */ { ud_itab__223, UD_TAB__OPC_SSE, "/sse" }, + /* 224 */ { ud_itab__224, UD_TAB__OPC_SSE, "/sse" }, + /* 225 */ { ud_itab__225, UD_TAB__OPC_TABLE, "3a" }, + /* 226 */ { ud_itab__226, UD_TAB__OPC_SSE, "/sse" }, + /* 227 */ { ud_itab__227, UD_TAB__OPC_SSE, "/sse" }, + /* 228 */ { ud_itab__228, UD_TAB__OPC_SSE, "/sse" }, + /* 229 */ { ud_itab__229, UD_TAB__OPC_SSE, "/sse" }, + /* 230 */ { ud_itab__230, UD_TAB__OPC_SSE, "/sse" }, + /* 231 */ { ud_itab__231, UD_TAB__OPC_SSE, "/sse" }, + /* 232 */ { ud_itab__232, UD_TAB__OPC_SSE, "/sse" }, + /* 233 */ { ud_itab__233, UD_TAB__OPC_SSE, "/sse" }, + /* 234 */ { ud_itab__234, UD_TAB__OPC_SSE, "/sse" }, + /* 235 */ { ud_itab__235, UD_TAB__OPC_SSE, "/sse" }, + /* 236 */ { ud_itab__236, UD_TAB__OPC_SSE, "/sse" }, + /* 237 */ { ud_itab__237, UD_TAB__OPC_OSIZE, "/o" }, + /* 238 */ { ud_itab__238, UD_TAB__OPC_SSE, "/sse" }, + /* 239 */ { ud_itab__239, UD_TAB__OPC_SSE, "/sse" }, + /* 240 */ { ud_itab__240, UD_TAB__OPC_SSE, "/sse" }, + /* 241 */ { ud_itab__241, UD_TAB__OPC_SSE, "/sse" }, + /* 242 */ { ud_itab__242, UD_TAB__OPC_OSIZE, "/o" }, + /* 243 */ { ud_itab__243, UD_TAB__OPC_SSE, "/sse" }, + /* 244 */ { ud_itab__244, UD_TAB__OPC_SSE, "/sse" }, + /* 245 */ { ud_itab__245, UD_TAB__OPC_SSE, "/sse" }, + /* 246 */ { ud_itab__246, UD_TAB__OPC_SSE, "/sse" }, + /* 247 */ { ud_itab__247, UD_TAB__OPC_SSE, "/sse" }, + /* 248 */ { ud_itab__248, UD_TAB__OPC_SSE, "/sse" }, + /* 249 */ { ud_itab__249, UD_TAB__OPC_SSE, "/sse" }, + /* 250 */ { ud_itab__250, UD_TAB__OPC_SSE, "/sse" }, + /* 251 */ { ud_itab__251, UD_TAB__OPC_SSE, "/sse" }, + /* 252 */ { ud_itab__252, UD_TAB__OPC_SSE, "/sse" }, + /* 253 */ { ud_itab__253, UD_TAB__OPC_SSE, "/sse" }, + /* 254 */ { ud_itab__254, UD_TAB__OPC_SSE, "/sse" }, + /* 255 */ { ud_itab__255, UD_TAB__OPC_SSE, "/sse" }, + /* 256 */ { ud_itab__256, UD_TAB__OPC_SSE, "/sse" }, + /* 257 */ { ud_itab__257, UD_TAB__OPC_SSE, "/sse" }, + /* 258 */ { ud_itab__258, UD_TAB__OPC_SSE, "/sse" }, + /* 259 */ { ud_itab__259, UD_TAB__OPC_SSE, "/sse" }, + /* 260 */ { ud_itab__260, UD_TAB__OPC_SSE, "/sse" }, + /* 261 */ { ud_itab__261, UD_TAB__OPC_SSE, "/sse" }, + /* 262 */ { ud_itab__262, UD_TAB__OPC_SSE, "/sse" }, + /* 263 */ { ud_itab__263, UD_TAB__OPC_SSE, "/sse" }, + /* 264 */ { ud_itab__264, UD_TAB__OPC_SSE, "/sse" }, + /* 265 */ { ud_itab__265, UD_TAB__OPC_SSE, "/sse" }, + /* 266 */ { ud_itab__266, UD_TAB__OPC_SSE, "/sse" }, + /* 267 */ { ud_itab__267, UD_TAB__OPC_SSE, "/sse" }, + /* 268 */ { ud_itab__268, UD_TAB__OPC_SSE, "/sse" }, + /* 269 */ { ud_itab__269, UD_TAB__OPC_SSE, "/sse" }, + /* 270 */ { ud_itab__270, UD_TAB__OPC_SSE, "/sse" }, + /* 271 */ { ud_itab__271, UD_TAB__OPC_SSE, "/sse" }, + /* 272 */ { ud_itab__272, UD_TAB__OPC_SSE, "/sse" }, + /* 273 */ { ud_itab__273, UD_TAB__OPC_SSE, "/sse" }, + /* 274 */ { ud_itab__274, UD_TAB__OPC_SSE, "/sse" }, + /* 275 */ { ud_itab__275, UD_TAB__OPC_SSE, "/sse" }, + /* 276 */ { ud_itab__276, UD_TAB__OPC_SSE, "/sse" }, + /* 277 */ { ud_itab__277, UD_TAB__OPC_SSE, "/sse" }, + /* 278 */ { ud_itab__278, UD_TAB__OPC_SSE, "/sse" }, + /* 279 */ { ud_itab__279, UD_TAB__OPC_SSE, "/sse" }, + /* 280 */ { ud_itab__280, UD_TAB__OPC_SSE, "/sse" }, + /* 281 */ { ud_itab__281, UD_TAB__OPC_SSE, "/sse" }, + /* 282 */ { ud_itab__282, UD_TAB__OPC_SSE, "/sse" }, + /* 283 */ { ud_itab__283, UD_TAB__OPC_SSE, "/sse" }, + /* 284 */ { ud_itab__284, UD_TAB__OPC_SSE, "/sse" }, + /* 285 */ { ud_itab__285, UD_TAB__OPC_SSE, "/sse" }, + /* 286 */ { ud_itab__286, UD_TAB__OPC_SSE, "/sse" }, + /* 287 */ { ud_itab__287, UD_TAB__OPC_SSE, "/sse" }, + /* 288 */ { ud_itab__288, UD_TAB__OPC_SSE, "/sse" }, + /* 289 */ { ud_itab__289, UD_TAB__OPC_SSE, "/sse" }, + /* 290 */ { ud_itab__290, UD_TAB__OPC_SSE, "/sse" }, + /* 291 */ { ud_itab__291, UD_TAB__OPC_SSE, "/sse" }, + /* 292 */ { ud_itab__292, UD_TAB__OPC_SSE, "/sse" }, + /* 293 */ { ud_itab__293, UD_TAB__OPC_SSE, "/sse" }, + /* 294 */ { ud_itab__294, UD_TAB__OPC_SSE, "/sse" }, + /* 295 */ { ud_itab__295, UD_TAB__OPC_SSE, "/sse" }, + /* 296 */ { ud_itab__296, UD_TAB__OPC_SSE, "/sse" }, + /* 297 */ { ud_itab__297, UD_TAB__OPC_SSE, "/sse" }, + /* 298 */ { ud_itab__298, UD_TAB__OPC_SSE, "/sse" }, + /* 299 */ { ud_itab__299, UD_TAB__OPC_SSE, "/sse" }, + /* 300 */ { ud_itab__300, UD_TAB__OPC_SSE, "/sse" }, + /* 301 */ { ud_itab__301, UD_TAB__OPC_REG, "/reg" }, + /* 302 */ { ud_itab__302, UD_TAB__OPC_SSE, "/sse" }, + /* 303 */ { ud_itab__303, UD_TAB__OPC_SSE, "/sse" }, + /* 304 */ { ud_itab__304, UD_TAB__OPC_SSE, "/sse" }, + /* 305 */ { ud_itab__305, UD_TAB__OPC_REG, "/reg" }, + /* 306 */ { ud_itab__306, UD_TAB__OPC_SSE, "/sse" }, + /* 307 */ { ud_itab__307, UD_TAB__OPC_SSE, "/sse" }, + /* 308 */ { ud_itab__308, UD_TAB__OPC_SSE, "/sse" }, + /* 309 */ { ud_itab__309, UD_TAB__OPC_REG, "/reg" }, + /* 310 */ { ud_itab__310, UD_TAB__OPC_SSE, "/sse" }, + /* 311 */ { ud_itab__311, UD_TAB__OPC_SSE, "/sse" }, + /* 312 */ { ud_itab__312, UD_TAB__OPC_SSE, "/sse" }, + /* 313 */ { ud_itab__313, UD_TAB__OPC_SSE, "/sse" }, + /* 314 */ { ud_itab__314, UD_TAB__OPC_SSE, "/sse" }, + /* 315 */ { ud_itab__315, UD_TAB__OPC_SSE, "/sse" }, + /* 316 */ { ud_itab__316, UD_TAB__OPC_SSE, "/sse" }, + /* 317 */ { ud_itab__317, UD_TAB__OPC_SSE, "/sse" }, + /* 318 */ { ud_itab__318, UD_TAB__OPC_SSE, "/sse" }, + /* 319 */ { ud_itab__319, UD_TAB__OPC_VENDOR, "intel" }, + /* 320 */ { ud_itab__320, UD_TAB__OPC_SSE, "/sse" }, + /* 321 */ { ud_itab__321, UD_TAB__OPC_VENDOR, "intel" }, + /* 322 */ { ud_itab__322, UD_TAB__OPC_SSE, "/sse" }, + /* 323 */ { ud_itab__323, UD_TAB__OPC_SSE, "/sse" }, + /* 324 */ { ud_itab__324, UD_TAB__OPC_SSE, "/sse" }, + /* 325 */ { ud_itab__325, UD_TAB__OPC_SSE, "/sse" }, + /* 326 */ { ud_itab__326, UD_TAB__OPC_SSE, "/sse" }, + /* 327 */ { ud_itab__327, UD_TAB__OPC_SSE, "/sse" }, + /* 328 */ { ud_itab__328, UD_TAB__OPC_SSE, "/sse" }, + /* 329 */ { ud_itab__329, UD_TAB__OPC_SSE, "/sse" }, + /* 330 */ { ud_itab__330, UD_TAB__OPC_SSE, "/sse" }, + /* 331 */ { ud_itab__331, UD_TAB__OPC_SSE, "/sse" }, + /* 332 */ { ud_itab__332, UD_TAB__OPC_SSE, "/sse" }, + /* 333 */ { ud_itab__333, UD_TAB__OPC_SSE, "/sse" }, + /* 334 */ { ud_itab__334, UD_TAB__OPC_SSE, "/sse" }, + /* 335 */ { ud_itab__335, UD_TAB__OPC_SSE, "/sse" }, + /* 336 */ { ud_itab__336, UD_TAB__OPC_SSE, "/sse" }, + /* 337 */ { ud_itab__337, UD_TAB__OPC_SSE, "/sse" }, + /* 338 */ { ud_itab__338, UD_TAB__OPC_SSE, "/sse" }, + /* 339 */ { ud_itab__339, UD_TAB__OPC_SSE, "/sse" }, + /* 340 */ { ud_itab__340, UD_TAB__OPC_SSE, "/sse" }, + /* 341 */ { ud_itab__341, UD_TAB__OPC_SSE, "/sse" }, + /* 342 */ { ud_itab__342, UD_TAB__OPC_SSE, "/sse" }, + /* 343 */ { ud_itab__343, UD_TAB__OPC_SSE, "/sse" }, + /* 344 */ { ud_itab__344, UD_TAB__OPC_SSE, "/sse" }, + /* 345 */ { ud_itab__345, UD_TAB__OPC_SSE, "/sse" }, + /* 346 */ { ud_itab__346, UD_TAB__OPC_SSE, "/sse" }, + /* 347 */ { ud_itab__347, UD_TAB__OPC_SSE, "/sse" }, + /* 348 */ { ud_itab__348, UD_TAB__OPC_SSE, "/sse" }, + /* 349 */ { ud_itab__349, UD_TAB__OPC_SSE, "/sse" }, + /* 350 */ { ud_itab__350, UD_TAB__OPC_SSE, "/sse" }, + /* 351 */ { ud_itab__351, UD_TAB__OPC_SSE, "/sse" }, + /* 352 */ { ud_itab__352, UD_TAB__OPC_SSE, "/sse" }, + /* 353 */ { ud_itab__353, UD_TAB__OPC_SSE, "/sse" }, + /* 354 */ { ud_itab__354, UD_TAB__OPC_SSE, "/sse" }, + /* 355 */ { ud_itab__355, UD_TAB__OPC_SSE, "/sse" }, + /* 356 */ { ud_itab__356, UD_TAB__OPC_SSE, "/sse" }, + /* 357 */ { ud_itab__357, UD_TAB__OPC_SSE, "/sse" }, + /* 358 */ { ud_itab__358, UD_TAB__OPC_SSE, "/sse" }, + /* 359 */ { ud_itab__359, UD_TAB__OPC_SSE, "/sse" }, + /* 360 */ { ud_itab__360, UD_TAB__OPC_SSE, "/sse" }, + /* 361 */ { ud_itab__361, UD_TAB__OPC_SSE, "/sse" }, + /* 362 */ { ud_itab__362, UD_TAB__OPC_SSE, "/sse" }, + /* 363 */ { ud_itab__363, UD_TAB__OPC_SSE, "/sse" }, + /* 364 */ { ud_itab__364, UD_TAB__OPC_MOD, "/mod" }, + /* 365 */ { ud_itab__365, UD_TAB__OPC_REG, "/reg" }, + /* 366 */ { ud_itab__366, UD_TAB__OPC_RM, "/rm" }, + /* 367 */ { ud_itab__367, UD_TAB__OPC_SSE, "/sse" }, + /* 368 */ { ud_itab__368, UD_TAB__OPC_MOD, "/mod" }, + /* 369 */ { ud_itab__369, UD_TAB__OPC_RM, "/rm" }, + /* 370 */ { ud_itab__370, UD_TAB__OPC_SSE, "/sse" }, + /* 371 */ { ud_itab__371, UD_TAB__OPC_MOD, "/mod" }, + /* 372 */ { ud_itab__372, UD_TAB__OPC_RM, "/rm" }, + /* 373 */ { ud_itab__373, UD_TAB__OPC_SSE, "/sse" }, + /* 374 */ { ud_itab__374, UD_TAB__OPC_MOD, "/mod" }, + /* 375 */ { ud_itab__375, UD_TAB__OPC_MOD, "/mod" }, + /* 376 */ { ud_itab__376, UD_TAB__OPC_REG, "/reg" }, + /* 377 */ { ud_itab__377, UD_TAB__OPC_RM, "/rm" }, + /* 378 */ { ud_itab__378, UD_TAB__OPC_SSE, "/sse" }, + /* 379 */ { ud_itab__379, UD_TAB__OPC_MOD, "/mod" }, + /* 380 */ { ud_itab__380, UD_TAB__OPC_RM, "/rm" }, + /* 381 */ { ud_itab__381, UD_TAB__OPC_SSE, "/sse" }, + /* 382 */ { ud_itab__382, UD_TAB__OPC_MOD, "/mod" }, + /* 383 */ { ud_itab__383, UD_TAB__OPC_RM, "/rm" }, + /* 384 */ { ud_itab__384, UD_TAB__OPC_SSE, "/sse" }, + /* 385 */ { ud_itab__385, UD_TAB__OPC_MOD, "/mod" }, + /* 386 */ { ud_itab__386, UD_TAB__OPC_RM, "/rm" }, + /* 387 */ { ud_itab__387, UD_TAB__OPC_SSE, "/sse" }, + /* 388 */ { ud_itab__388, UD_TAB__OPC_MOD, "/mod" }, + /* 389 */ { ud_itab__389, UD_TAB__OPC_RM, "/rm" }, + /* 390 */ { ud_itab__390, UD_TAB__OPC_SSE, "/sse" }, + /* 391 */ { ud_itab__391, UD_TAB__OPC_MOD, "/mod" }, + /* 392 */ { ud_itab__392, UD_TAB__OPC_RM, "/rm" }, + /* 393 */ { ud_itab__393, UD_TAB__OPC_SSE, "/sse" }, + /* 394 */ { ud_itab__394, UD_TAB__OPC_MOD, "/mod" }, + /* 395 */ { ud_itab__395, UD_TAB__OPC_SSE, "/sse" }, + /* 396 */ { ud_itab__396, UD_TAB__OPC_SSE, "/sse" }, + /* 397 */ { ud_itab__397, UD_TAB__OPC_SSE, "/sse" }, + /* 398 */ { ud_itab__398, UD_TAB__OPC_SSE, "/sse" }, + /* 399 */ { ud_itab__399, UD_TAB__OPC_SSE, "/sse" }, + /* 400 */ { ud_itab__400, UD_TAB__OPC_SSE, "/sse" }, + /* 401 */ { ud_itab__401, UD_TAB__OPC_MOD, "/mod" }, + /* 402 */ { ud_itab__402, UD_TAB__OPC_REG, "/reg" }, + /* 403 */ { ud_itab__403, UD_TAB__OPC_SSE, "/sse" }, + /* 404 */ { ud_itab__404, UD_TAB__OPC_MOD, "/mod" }, + /* 405 */ { ud_itab__405, UD_TAB__OPC_SSE, "/sse" }, + /* 406 */ { ud_itab__406, UD_TAB__OPC_MOD, "/mod" }, + /* 407 */ { ud_itab__407, UD_TAB__OPC_SSE, "/sse" }, + /* 408 */ { ud_itab__408, UD_TAB__OPC_MOD, "/mod" }, + /* 409 */ { ud_itab__409, UD_TAB__OPC_SSE, "/sse" }, + /* 410 */ { ud_itab__410, UD_TAB__OPC_MOD, "/mod" }, + /* 411 */ { ud_itab__411, UD_TAB__OPC_SSE, "/sse" }, + /* 412 */ { ud_itab__412, UD_TAB__OPC_MOD, "/mod" }, + /* 413 */ { ud_itab__413, UD_TAB__OPC_SSE, "/sse" }, + /* 414 */ { ud_itab__414, UD_TAB__OPC_MOD, "/mod" }, + /* 415 */ { ud_itab__415, UD_TAB__OPC_SSE, "/sse" }, + /* 416 */ { ud_itab__416, UD_TAB__OPC_MOD, "/mod" }, + /* 417 */ { ud_itab__417, UD_TAB__OPC_REG, "/reg" }, + /* 418 */ { ud_itab__418, UD_TAB__OPC_RM, "/rm" }, + /* 419 */ { ud_itab__419, UD_TAB__OPC_SSE, "/sse" }, + /* 420 */ { ud_itab__420, UD_TAB__OPC_MOD, "/mod" }, + /* 421 */ { ud_itab__421, UD_TAB__OPC_SSE, "/sse" }, + /* 422 */ { ud_itab__422, UD_TAB__OPC_MOD, "/mod" }, + /* 423 */ { ud_itab__423, UD_TAB__OPC_SSE, "/sse" }, + /* 424 */ { ud_itab__424, UD_TAB__OPC_MOD, "/mod" }, + /* 425 */ { ud_itab__425, UD_TAB__OPC_SSE, "/sse" }, + /* 426 */ { ud_itab__426, UD_TAB__OPC_MOD, "/mod" }, + /* 427 */ { ud_itab__427, UD_TAB__OPC_SSE, "/sse" }, + /* 428 */ { ud_itab__428, UD_TAB__OPC_MOD, "/mod" }, + /* 429 */ { ud_itab__429, UD_TAB__OPC_SSE, "/sse" }, + /* 430 */ { ud_itab__430, UD_TAB__OPC_MOD, "/mod" }, + /* 431 */ { ud_itab__431, UD_TAB__OPC_SSE, "/sse" }, + /* 432 */ { ud_itab__432, UD_TAB__OPC_MOD, "/mod" }, + /* 433 */ { ud_itab__433, UD_TAB__OPC_SSE, "/sse" }, + /* 434 */ { ud_itab__434, UD_TAB__OPC_MOD, "/mod" }, + /* 435 */ { ud_itab__435, UD_TAB__OPC_RM, "/rm" }, + /* 436 */ { ud_itab__436, UD_TAB__OPC_SSE, "/sse" }, + /* 437 */ { ud_itab__437, UD_TAB__OPC_MOD, "/mod" }, + /* 438 */ { ud_itab__438, UD_TAB__OPC_SSE, "/sse" }, + /* 439 */ { ud_itab__439, UD_TAB__OPC_MOD, "/mod" }, + /* 440 */ { ud_itab__440, UD_TAB__OPC_SSE, "/sse" }, + /* 441 */ { ud_itab__441, UD_TAB__OPC_MOD, "/mod" }, + /* 442 */ { ud_itab__442, UD_TAB__OPC_SSE, "/sse" }, + /* 443 */ { ud_itab__443, UD_TAB__OPC_MOD, "/mod" }, + /* 444 */ { ud_itab__444, UD_TAB__OPC_SSE, "/sse" }, + /* 445 */ { ud_itab__445, UD_TAB__OPC_MOD, "/mod" }, + /* 446 */ { ud_itab__446, UD_TAB__OPC_SSE, "/sse" }, + /* 447 */ { ud_itab__447, UD_TAB__OPC_MOD, "/mod" }, + /* 448 */ { ud_itab__448, UD_TAB__OPC_SSE, "/sse" }, + /* 449 */ { ud_itab__449, UD_TAB__OPC_MOD, "/mod" }, + /* 450 */ { ud_itab__450, UD_TAB__OPC_SSE, "/sse" }, + /* 451 */ { ud_itab__451, UD_TAB__OPC_MOD, "/mod" }, + /* 452 */ { ud_itab__452, UD_TAB__OPC_RM, "/rm" }, + /* 453 */ { ud_itab__453, UD_TAB__OPC_SSE, "/sse" }, + /* 454 */ { ud_itab__454, UD_TAB__OPC_MOD, "/mod" }, + /* 455 */ { ud_itab__455, UD_TAB__OPC_SSE, "/sse" }, + /* 456 */ { ud_itab__456, UD_TAB__OPC_MOD, "/mod" }, + /* 457 */ { ud_itab__457, UD_TAB__OPC_SSE, "/sse" }, + /* 458 */ { ud_itab__458, UD_TAB__OPC_MOD, "/mod" }, + /* 459 */ { ud_itab__459, UD_TAB__OPC_SSE, "/sse" }, + /* 460 */ { ud_itab__460, UD_TAB__OPC_MOD, "/mod" }, + /* 461 */ { ud_itab__461, UD_TAB__OPC_SSE, "/sse" }, + /* 462 */ { ud_itab__462, UD_TAB__OPC_MOD, "/mod" }, + /* 463 */ { ud_itab__463, UD_TAB__OPC_SSE, "/sse" }, + /* 464 */ { ud_itab__464, UD_TAB__OPC_MOD, "/mod" }, + /* 465 */ { ud_itab__465, UD_TAB__OPC_SSE, "/sse" }, + /* 466 */ { ud_itab__466, UD_TAB__OPC_MOD, "/mod" }, + /* 467 */ { ud_itab__467, UD_TAB__OPC_SSE, "/sse" }, + /* 468 */ { ud_itab__468, UD_TAB__OPC_MOD, "/mod" }, + /* 469 */ { ud_itab__469, UD_TAB__OPC_SSE, "/sse" }, + /* 470 */ { ud_itab__470, UD_TAB__OPC_SSE, "/sse" }, + /* 471 */ { ud_itab__471, UD_TAB__OPC_SSE, "/sse" }, + /* 472 */ { ud_itab__472, UD_TAB__OPC_SSE, "/sse" }, + /* 473 */ { ud_itab__473, UD_TAB__OPC_SSE, "/sse" }, + /* 474 */ { ud_itab__474, UD_TAB__OPC_SSE, "/sse" }, + /* 475 */ { ud_itab__475, UD_TAB__OPC_SSE, "/sse" }, + /* 476 */ { ud_itab__476, UD_TAB__OPC_SSE, "/sse" }, + /* 477 */ { ud_itab__477, UD_TAB__OPC_SSE, "/sse" }, + /* 478 */ { ud_itab__478, UD_TAB__OPC_SSE, "/sse" }, + /* 479 */ { ud_itab__479, UD_TAB__OPC_REG, "/reg" }, + /* 480 */ { ud_itab__480, UD_TAB__OPC_SSE, "/sse" }, + /* 481 */ { ud_itab__481, UD_TAB__OPC_SSE, "/sse" }, + /* 482 */ { ud_itab__482, UD_TAB__OPC_SSE, "/sse" }, + /* 483 */ { ud_itab__483, UD_TAB__OPC_SSE, "/sse" }, + /* 484 */ { ud_itab__484, UD_TAB__OPC_SSE, "/sse" }, + /* 485 */ { ud_itab__485, UD_TAB__OPC_SSE, "/sse" }, + /* 486 */ { ud_itab__486, UD_TAB__OPC_SSE, "/sse" }, + /* 487 */ { ud_itab__487, UD_TAB__OPC_SSE, "/sse" }, + /* 488 */ { ud_itab__488, UD_TAB__OPC_SSE, "/sse" }, + /* 489 */ { ud_itab__489, UD_TAB__OPC_SSE, "/sse" }, + /* 490 */ { ud_itab__490, UD_TAB__OPC_SSE, "/sse" }, + /* 491 */ { ud_itab__491, UD_TAB__OPC_SSE, "/sse" }, + /* 492 */ { ud_itab__492, UD_TAB__OPC_SSE, "/sse" }, + /* 493 */ { ud_itab__493, UD_TAB__OPC_SSE, "/sse" }, + /* 494 */ { ud_itab__494, UD_TAB__OPC_SSE, "/sse" }, + /* 495 */ { ud_itab__495, UD_TAB__OPC_SSE, "/sse" }, + /* 496 */ { ud_itab__496, UD_TAB__OPC_REG, "/reg" }, + /* 497 */ { ud_itab__497, UD_TAB__OPC_SSE, "/sse" }, + /* 498 */ { ud_itab__498, UD_TAB__OPC_OSIZE, "/o" }, + /* 499 */ { ud_itab__499, UD_TAB__OPC_SSE, "/sse" }, + /* 500 */ { ud_itab__500, UD_TAB__OPC_VENDOR, "intel" }, + /* 501 */ { ud_itab__501, UD_TAB__OPC_VENDOR, "intel" }, + /* 502 */ { ud_itab__502, UD_TAB__OPC_VENDOR, "intel" }, + /* 503 */ { ud_itab__503, UD_TAB__OPC_SSE, "/sse" }, + /* 504 */ { ud_itab__504, UD_TAB__OPC_VENDOR, "intel" }, + /* 505 */ { ud_itab__505, UD_TAB__OPC_SSE, "/sse" }, + /* 506 */ { ud_itab__506, UD_TAB__OPC_SSE, "/sse" }, + /* 507 */ { ud_itab__507, UD_TAB__OPC_SSE, "/sse" }, + /* 508 */ { ud_itab__508, UD_TAB__OPC_SSE, "/sse" }, + /* 509 */ { ud_itab__509, UD_TAB__OPC_SSE, "/sse" }, + /* 510 */ { ud_itab__510, UD_TAB__OPC_SSE, "/sse" }, + /* 511 */ { ud_itab__511, UD_TAB__OPC_SSE, "/sse" }, + /* 512 */ { ud_itab__512, UD_TAB__OPC_SSE, "/sse" }, + /* 513 */ { ud_itab__513, UD_TAB__OPC_SSE, "/sse" }, + /* 514 */ { ud_itab__514, UD_TAB__OPC_SSE, "/sse" }, + /* 515 */ { ud_itab__515, UD_TAB__OPC_SSE, "/sse" }, + /* 516 */ { ud_itab__516, UD_TAB__OPC_SSE, "/sse" }, + /* 517 */ { ud_itab__517, UD_TAB__OPC_SSE, "/sse" }, + /* 518 */ { ud_itab__518, UD_TAB__OPC_SSE, "/sse" }, + /* 519 */ { ud_itab__519, UD_TAB__OPC_SSE, "/sse" }, + /* 520 */ { ud_itab__520, UD_TAB__OPC_SSE, "/sse" }, + /* 521 */ { ud_itab__521, UD_TAB__OPC_SSE, "/sse" }, + /* 522 */ { ud_itab__522, UD_TAB__OPC_SSE, "/sse" }, + /* 523 */ { ud_itab__523, UD_TAB__OPC_SSE, "/sse" }, + /* 524 */ { ud_itab__524, UD_TAB__OPC_SSE, "/sse" }, + /* 525 */ { ud_itab__525, UD_TAB__OPC_SSE, "/sse" }, + /* 526 */ { ud_itab__526, UD_TAB__OPC_SSE, "/sse" }, + /* 527 */ { ud_itab__527, UD_TAB__OPC_SSE, "/sse" }, + /* 528 */ { ud_itab__528, UD_TAB__OPC_SSE, "/sse" }, + /* 529 */ { ud_itab__529, UD_TAB__OPC_SSE, "/sse" }, + /* 530 */ { ud_itab__530, UD_TAB__OPC_SSE, "/sse" }, + /* 531 */ { ud_itab__531, UD_TAB__OPC_SSE, "/sse" }, + /* 532 */ { ud_itab__532, UD_TAB__OPC_SSE, "/sse" }, + /* 533 */ { ud_itab__533, UD_TAB__OPC_SSE, "/sse" }, + /* 534 */ { ud_itab__534, UD_TAB__OPC_SSE, "/sse" }, + /* 535 */ { ud_itab__535, UD_TAB__OPC_SSE, "/sse" }, + /* 536 */ { ud_itab__536, UD_TAB__OPC_SSE, "/sse" }, + /* 537 */ { ud_itab__537, UD_TAB__OPC_SSE, "/sse" }, + /* 538 */ { ud_itab__538, UD_TAB__OPC_SSE, "/sse" }, + /* 539 */ { ud_itab__539, UD_TAB__OPC_SSE, "/sse" }, + /* 540 */ { ud_itab__540, UD_TAB__OPC_SSE, "/sse" }, + /* 541 */ { ud_itab__541, UD_TAB__OPC_SSE, "/sse" }, + /* 542 */ { ud_itab__542, UD_TAB__OPC_SSE, "/sse" }, + /* 543 */ { ud_itab__543, UD_TAB__OPC_SSE, "/sse" }, + /* 544 */ { ud_itab__544, UD_TAB__OPC_SSE, "/sse" }, + /* 545 */ { ud_itab__545, UD_TAB__OPC_SSE, "/sse" }, + /* 546 */ { ud_itab__546, UD_TAB__OPC_SSE, "/sse" }, + /* 547 */ { ud_itab__547, UD_TAB__OPC_SSE, "/sse" }, + /* 548 */ { ud_itab__548, UD_TAB__OPC_SSE, "/sse" }, + /* 549 */ { ud_itab__549, UD_TAB__OPC_SSE, "/sse" }, + /* 550 */ { ud_itab__550, UD_TAB__OPC_SSE, "/sse" }, + /* 551 */ { ud_itab__551, UD_TAB__OPC_SSE, "/sse" }, + /* 552 */ { ud_itab__552, UD_TAB__OPC_MOD, "/mod" }, + /* 553 */ { ud_itab__553, UD_TAB__OPC_SSE, "/sse" }, + /* 554 */ { ud_itab__554, UD_TAB__OPC_MOD, "/mod" }, + /* 555 */ { ud_itab__555, UD_TAB__OPC_MOD, "/mod" }, + /* 556 */ { ud_itab__556, UD_TAB__OPC_SSE, "/sse" }, + /* 557 */ { ud_itab__557, UD_TAB__OPC_SSE, "/sse" }, + /* 558 */ { ud_itab__558, UD_TAB__OPC_SSE, "/sse" }, + /* 559 */ { ud_itab__559, UD_TAB__OPC_SSE, "/sse" }, + /* 560 */ { ud_itab__560, UD_TAB__OPC_SSE, "/sse" }, + /* 561 */ { ud_itab__561, UD_TAB__OPC_SSE, "/sse" }, + /* 562 */ { ud_itab__562, UD_TAB__OPC_SSE, "/sse" }, + /* 563 */ { ud_itab__563, UD_TAB__OPC_MODE, "/m" }, + /* 564 */ { ud_itab__564, UD_TAB__OPC_MODE, "/m" }, + /* 565 */ { ud_itab__565, UD_TAB__OPC_MODE, "/m" }, + /* 566 */ { ud_itab__566, UD_TAB__OPC_MODE, "/m" }, + /* 567 */ { ud_itab__567, UD_TAB__OPC_MODE, "/m" }, + /* 568 */ { ud_itab__568, UD_TAB__OPC_MODE, "/m" }, + /* 569 */ { ud_itab__569, UD_TAB__OPC_MODE, "/m" }, + /* 570 */ { ud_itab__570, UD_TAB__OPC_MODE, "/m" }, + /* 571 */ { ud_itab__571, UD_TAB__OPC_OSIZE, "/o" }, + /* 572 */ { ud_itab__572, UD_TAB__OPC_MODE, "/m" }, + /* 573 */ { ud_itab__573, UD_TAB__OPC_MODE, "/m" }, + /* 574 */ { ud_itab__574, UD_TAB__OPC_OSIZE, "/o" }, + /* 575 */ { ud_itab__575, UD_TAB__OPC_MODE, "/m" }, + /* 576 */ { ud_itab__576, UD_TAB__OPC_MODE, "/m" }, + /* 577 */ { ud_itab__577, UD_TAB__OPC_MODE, "/m" }, + /* 578 */ { ud_itab__578, UD_TAB__OPC_MODE, "/m" }, + /* 579 */ { ud_itab__579, UD_TAB__OPC_OSIZE, "/o" }, + /* 580 */ { ud_itab__580, UD_TAB__OPC_OSIZE, "/o" }, + /* 581 */ { ud_itab__581, UD_TAB__OPC_REG, "/reg" }, + /* 582 */ { ud_itab__582, UD_TAB__OPC_REG, "/reg" }, + /* 583 */ { ud_itab__583, UD_TAB__OPC_REG, "/reg" }, + /* 584 */ { ud_itab__584, UD_TAB__OPC_MODE, "/m" }, + /* 585 */ { ud_itab__585, UD_TAB__OPC_MODE, "/m" }, + /* 586 */ { ud_itab__586, UD_TAB__OPC_MODE, "/m" }, + /* 587 */ { ud_itab__587, UD_TAB__OPC_MODE, "/m" }, + /* 588 */ { ud_itab__588, UD_TAB__OPC_MODE, "/m" }, + /* 589 */ { ud_itab__589, UD_TAB__OPC_MODE, "/m" }, + /* 590 */ { ud_itab__590, UD_TAB__OPC_MODE, "/m" }, + /* 591 */ { ud_itab__591, UD_TAB__OPC_MODE, "/m" }, + /* 592 */ { ud_itab__592, UD_TAB__OPC_REG, "/reg" }, + /* 593 */ { ud_itab__593, UD_TAB__OPC_REG, "/reg" }, + /* 594 */ { ud_itab__594, UD_TAB__OPC_OSIZE, "/o" }, + /* 595 */ { ud_itab__595, UD_TAB__OPC_OSIZE, "/o" }, + /* 596 */ { ud_itab__596, UD_TAB__OPC_MODE, "/m" }, + /* 597 */ { ud_itab__597, UD_TAB__OPC_OSIZE, "/o" }, + /* 598 */ { ud_itab__598, UD_TAB__OPC_MODE, "/m" }, + /* 599 */ { ud_itab__599, UD_TAB__OPC_MODE, "/m" }, + /* 600 */ { ud_itab__600, UD_TAB__OPC_MODE, "/m" }, + /* 601 */ { ud_itab__601, UD_TAB__OPC_OSIZE, "/o" }, + /* 602 */ { ud_itab__602, UD_TAB__OPC_MODE, "/m" }, + /* 603 */ { ud_itab__603, UD_TAB__OPC_MODE, "/m" }, + /* 604 */ { ud_itab__604, UD_TAB__OPC_MODE, "/m" }, + /* 605 */ { ud_itab__605, UD_TAB__OPC_OSIZE, "/o" }, + /* 606 */ { ud_itab__606, UD_TAB__OPC_OSIZE, "/o" }, + /* 607 */ { ud_itab__607, UD_TAB__OPC_OSIZE, "/o" }, + /* 608 */ { ud_itab__608, UD_TAB__OPC_OSIZE, "/o" }, + /* 609 */ { ud_itab__609, UD_TAB__OPC_OSIZE, "/o" }, + /* 610 */ { ud_itab__610, UD_TAB__OPC_REG, "/reg" }, + /* 611 */ { ud_itab__611, UD_TAB__OPC_REG, "/reg" }, + /* 612 */ { ud_itab__612, UD_TAB__OPC_MODE, "/m" }, + /* 613 */ { ud_itab__613, UD_TAB__OPC_MODE, "/m" }, + /* 614 */ { ud_itab__614, UD_TAB__OPC_REG, "/reg" }, + /* 615 */ { ud_itab__615, UD_TAB__OPC_REG, "/reg" }, + /* 616 */ { ud_itab__616, UD_TAB__OPC_MODE, "/m" }, + /* 617 */ { ud_itab__617, UD_TAB__OPC_OSIZE, "/o" }, + /* 618 */ { ud_itab__618, UD_TAB__OPC_REG, "/reg" }, + /* 619 */ { ud_itab__619, UD_TAB__OPC_REG, "/reg" }, + /* 620 */ { ud_itab__620, UD_TAB__OPC_REG, "/reg" }, + /* 621 */ { ud_itab__621, UD_TAB__OPC_REG, "/reg" }, + /* 622 */ { ud_itab__622, UD_TAB__OPC_MODE, "/m" }, + /* 623 */ { ud_itab__623, UD_TAB__OPC_MODE, "/m" }, + /* 624 */ { ud_itab__624, UD_TAB__OPC_MODE, "/m" }, + /* 625 */ { ud_itab__625, UD_TAB__OPC_MOD, "/mod" }, + /* 626 */ { ud_itab__626, UD_TAB__OPC_REG, "/reg" }, + /* 627 */ { ud_itab__627, UD_TAB__OPC_MOD, "/mod" }, + /* 628 */ { ud_itab__628, UD_TAB__OPC_MOD, "/mod" }, + /* 629 */ { ud_itab__629, UD_TAB__OPC_MOD, "/mod" }, + /* 630 */ { ud_itab__630, UD_TAB__OPC_MOD, "/mod" }, + /* 631 */ { ud_itab__631, UD_TAB__OPC_MOD, "/mod" }, + /* 632 */ { ud_itab__632, UD_TAB__OPC_MOD, "/mod" }, + /* 633 */ { ud_itab__633, UD_TAB__OPC_MOD, "/mod" }, + /* 634 */ { ud_itab__634, UD_TAB__OPC_MOD, "/mod" }, + /* 635 */ { ud_itab__635, UD_TAB__OPC_X87, "/x87" }, + /* 636 */ { ud_itab__636, UD_TAB__OPC_MOD, "/mod" }, + /* 637 */ { ud_itab__637, UD_TAB__OPC_MOD, "/mod" }, + /* 638 */ { ud_itab__638, UD_TAB__OPC_MOD, "/mod" }, + /* 639 */ { ud_itab__639, UD_TAB__OPC_MOD, "/mod" }, + /* 640 */ { ud_itab__640, UD_TAB__OPC_MOD, "/mod" }, + /* 641 */ { ud_itab__641, UD_TAB__OPC_MOD, "/mod" }, + /* 642 */ { ud_itab__642, UD_TAB__OPC_MOD, "/mod" }, + /* 643 */ { ud_itab__643, UD_TAB__OPC_MOD, "/mod" }, + /* 644 */ { ud_itab__644, UD_TAB__OPC_MOD, "/mod" }, + /* 645 */ { ud_itab__645, UD_TAB__OPC_MOD, "/mod" }, + /* 646 */ { ud_itab__646, UD_TAB__OPC_MOD, "/mod" }, + /* 647 */ { ud_itab__647, UD_TAB__OPC_MOD, "/mod" }, + /* 648 */ { ud_itab__648, UD_TAB__OPC_MOD, "/mod" }, + /* 649 */ { ud_itab__649, UD_TAB__OPC_MOD, "/mod" }, + /* 650 */ { ud_itab__650, UD_TAB__OPC_MOD, "/mod" }, + /* 651 */ { ud_itab__651, UD_TAB__OPC_MOD, "/mod" }, + /* 652 */ { ud_itab__652, UD_TAB__OPC_MOD, "/mod" }, + /* 653 */ { ud_itab__653, UD_TAB__OPC_MOD, "/mod" }, + /* 654 */ { ud_itab__654, UD_TAB__OPC_MOD, "/mod" }, + /* 655 */ { ud_itab__655, UD_TAB__OPC_MOD, "/mod" }, + /* 656 */ { ud_itab__656, UD_TAB__OPC_MOD, "/mod" }, + /* 657 */ { ud_itab__657, UD_TAB__OPC_MOD, "/mod" }, + /* 658 */ { ud_itab__658, UD_TAB__OPC_MOD, "/mod" }, + /* 659 */ { ud_itab__659, UD_TAB__OPC_MOD, "/mod" }, + /* 660 */ { ud_itab__660, UD_TAB__OPC_MOD, "/mod" }, + /* 661 */ { ud_itab__661, UD_TAB__OPC_MOD, "/mod" }, + /* 662 */ { ud_itab__662, UD_TAB__OPC_MOD, "/mod" }, + /* 663 */ { ud_itab__663, UD_TAB__OPC_MOD, "/mod" }, + /* 664 */ { ud_itab__664, UD_TAB__OPC_MOD, "/mod" }, + /* 665 */ { ud_itab__665, UD_TAB__OPC_MOD, "/mod" }, + /* 666 */ { ud_itab__666, UD_TAB__OPC_MOD, "/mod" }, + /* 667 */ { ud_itab__667, UD_TAB__OPC_MOD, "/mod" }, + /* 668 */ { ud_itab__668, UD_TAB__OPC_MOD, "/mod" }, + /* 669 */ { ud_itab__669, UD_TAB__OPC_MOD, "/mod" }, + /* 670 */ { ud_itab__670, UD_TAB__OPC_MOD, "/mod" }, + /* 671 */ { ud_itab__671, UD_TAB__OPC_MOD, "/mod" }, + /* 672 */ { ud_itab__672, UD_TAB__OPC_MOD, "/mod" }, + /* 673 */ { ud_itab__673, UD_TAB__OPC_MOD, "/mod" }, + /* 674 */ { ud_itab__674, UD_TAB__OPC_MOD, "/mod" }, + /* 675 */ { ud_itab__675, UD_TAB__OPC_MOD, "/mod" }, + /* 676 */ { ud_itab__676, UD_TAB__OPC_MOD, "/mod" }, + /* 677 */ { ud_itab__677, UD_TAB__OPC_MOD, "/mod" }, + /* 678 */ { ud_itab__678, UD_TAB__OPC_MOD, "/mod" }, + /* 679 */ { ud_itab__679, UD_TAB__OPC_MOD, "/mod" }, + /* 680 */ { ud_itab__680, UD_TAB__OPC_MOD, "/mod" }, + /* 681 */ { ud_itab__681, UD_TAB__OPC_MOD, "/mod" }, + /* 682 */ { ud_itab__682, UD_TAB__OPC_MOD, "/mod" }, + /* 683 */ { ud_itab__683, UD_TAB__OPC_MOD, "/mod" }, + /* 684 */ { ud_itab__684, UD_TAB__OPC_MOD, "/mod" }, + /* 685 */ { ud_itab__685, UD_TAB__OPC_MOD, "/mod" }, + /* 686 */ { ud_itab__686, UD_TAB__OPC_MOD, "/mod" }, + /* 687 */ { ud_itab__687, UD_TAB__OPC_MOD, "/mod" }, + /* 688 */ { ud_itab__688, UD_TAB__OPC_MOD, "/mod" }, + /* 689 */ { ud_itab__689, UD_TAB__OPC_MOD, "/mod" }, + /* 690 */ { ud_itab__690, UD_TAB__OPC_MOD, "/mod" }, + /* 691 */ { ud_itab__691, UD_TAB__OPC_MOD, "/mod" }, + /* 692 */ { ud_itab__692, UD_TAB__OPC_MOD, "/mod" }, + /* 693 */ { ud_itab__693, UD_TAB__OPC_MOD, "/mod" }, + /* 694 */ { ud_itab__694, UD_TAB__OPC_MOD, "/mod" }, + /* 695 */ { ud_itab__695, UD_TAB__OPC_MOD, "/mod" }, + /* 696 */ { ud_itab__696, UD_TAB__OPC_MOD, "/mod" }, + /* 697 */ { ud_itab__697, UD_TAB__OPC_MOD, "/mod" }, + /* 698 */ { ud_itab__698, UD_TAB__OPC_MOD, "/mod" }, + /* 699 */ { ud_itab__699, UD_TAB__OPC_MOD, "/mod" }, + /* 700 */ { ud_itab__700, UD_TAB__OPC_MOD, "/mod" }, + /* 701 */ { ud_itab__701, UD_TAB__OPC_REG, "/reg" }, + /* 702 */ { ud_itab__702, UD_TAB__OPC_MOD, "/mod" }, + /* 703 */ { ud_itab__703, UD_TAB__OPC_MOD, "/mod" }, + /* 704 */ { ud_itab__704, UD_TAB__OPC_MOD, "/mod" }, + /* 705 */ { ud_itab__705, UD_TAB__OPC_MOD, "/mod" }, + /* 706 */ { ud_itab__706, UD_TAB__OPC_MOD, "/mod" }, + /* 707 */ { ud_itab__707, UD_TAB__OPC_MOD, "/mod" }, + /* 708 */ { ud_itab__708, UD_TAB__OPC_MOD, "/mod" }, + /* 709 */ { ud_itab__709, UD_TAB__OPC_X87, "/x87" }, + /* 710 */ { ud_itab__710, UD_TAB__OPC_MOD, "/mod" }, + /* 711 */ { ud_itab__711, UD_TAB__OPC_MOD, "/mod" }, + /* 712 */ { ud_itab__712, UD_TAB__OPC_MOD, "/mod" }, + /* 713 */ { ud_itab__713, UD_TAB__OPC_MOD, "/mod" }, + /* 714 */ { ud_itab__714, UD_TAB__OPC_MOD, "/mod" }, + /* 715 */ { ud_itab__715, UD_TAB__OPC_MOD, "/mod" }, + /* 716 */ { ud_itab__716, UD_TAB__OPC_MOD, "/mod" }, + /* 717 */ { ud_itab__717, UD_TAB__OPC_MOD, "/mod" }, + /* 718 */ { ud_itab__718, UD_TAB__OPC_MOD, "/mod" }, + /* 719 */ { ud_itab__719, UD_TAB__OPC_MOD, "/mod" }, + /* 720 */ { ud_itab__720, UD_TAB__OPC_MOD, "/mod" }, + /* 721 */ { ud_itab__721, UD_TAB__OPC_MOD, "/mod" }, + /* 722 */ { ud_itab__722, UD_TAB__OPC_MOD, "/mod" }, + /* 723 */ { ud_itab__723, UD_TAB__OPC_MOD, "/mod" }, + /* 724 */ { ud_itab__724, UD_TAB__OPC_MOD, "/mod" }, + /* 725 */ { ud_itab__725, UD_TAB__OPC_MOD, "/mod" }, + /* 726 */ { ud_itab__726, UD_TAB__OPC_MOD, "/mod" }, + /* 727 */ { ud_itab__727, UD_TAB__OPC_MOD, "/mod" }, + /* 728 */ { ud_itab__728, UD_TAB__OPC_MOD, "/mod" }, + /* 729 */ { ud_itab__729, UD_TAB__OPC_MOD, "/mod" }, + /* 730 */ { ud_itab__730, UD_TAB__OPC_MOD, "/mod" }, + /* 731 */ { ud_itab__731, UD_TAB__OPC_MOD, "/mod" }, + /* 732 */ { ud_itab__732, UD_TAB__OPC_MOD, "/mod" }, + /* 733 */ { ud_itab__733, UD_TAB__OPC_MOD, "/mod" }, + /* 734 */ { ud_itab__734, UD_TAB__OPC_MOD, "/mod" }, + /* 735 */ { ud_itab__735, UD_TAB__OPC_MOD, "/mod" }, + /* 736 */ { ud_itab__736, UD_TAB__OPC_MOD, "/mod" }, + /* 737 */ { ud_itab__737, UD_TAB__OPC_MOD, "/mod" }, + /* 738 */ { ud_itab__738, UD_TAB__OPC_MOD, "/mod" }, + /* 739 */ { ud_itab__739, UD_TAB__OPC_MOD, "/mod" }, + /* 740 */ { ud_itab__740, UD_TAB__OPC_MOD, "/mod" }, + /* 741 */ { ud_itab__741, UD_TAB__OPC_MOD, "/mod" }, + /* 742 */ { ud_itab__742, UD_TAB__OPC_MOD, "/mod" }, + /* 743 */ { ud_itab__743, UD_TAB__OPC_MOD, "/mod" }, + /* 744 */ { ud_itab__744, UD_TAB__OPC_MOD, "/mod" }, + /* 745 */ { ud_itab__745, UD_TAB__OPC_MOD, "/mod" }, + /* 746 */ { ud_itab__746, UD_TAB__OPC_MOD, "/mod" }, + /* 747 */ { ud_itab__747, UD_TAB__OPC_MOD, "/mod" }, + /* 748 */ { ud_itab__748, UD_TAB__OPC_MOD, "/mod" }, + /* 749 */ { ud_itab__749, UD_TAB__OPC_MOD, "/mod" }, + /* 750 */ { ud_itab__750, UD_TAB__OPC_MOD, "/mod" }, + /* 751 */ { ud_itab__751, UD_TAB__OPC_MOD, "/mod" }, + /* 752 */ { ud_itab__752, UD_TAB__OPC_MOD, "/mod" }, + /* 753 */ { ud_itab__753, UD_TAB__OPC_MOD, "/mod" }, + /* 754 */ { ud_itab__754, UD_TAB__OPC_MOD, "/mod" }, + /* 755 */ { ud_itab__755, UD_TAB__OPC_MOD, "/mod" }, + /* 756 */ { ud_itab__756, UD_TAB__OPC_MOD, "/mod" }, + /* 757 */ { ud_itab__757, UD_TAB__OPC_MOD, "/mod" }, + /* 758 */ { ud_itab__758, UD_TAB__OPC_MOD, "/mod" }, + /* 759 */ { ud_itab__759, UD_TAB__OPC_MOD, "/mod" }, + /* 760 */ { ud_itab__760, UD_TAB__OPC_MOD, "/mod" }, + /* 761 */ { ud_itab__761, UD_TAB__OPC_MOD, "/mod" }, + /* 762 */ { ud_itab__762, UD_TAB__OPC_MOD, "/mod" }, + /* 763 */ { ud_itab__763, UD_TAB__OPC_REG, "/reg" }, + /* 764 */ { ud_itab__764, UD_TAB__OPC_MOD, "/mod" }, + /* 765 */ { ud_itab__765, UD_TAB__OPC_MOD, "/mod" }, + /* 766 */ { ud_itab__766, UD_TAB__OPC_MOD, "/mod" }, + /* 767 */ { ud_itab__767, UD_TAB__OPC_MOD, "/mod" }, + /* 768 */ { ud_itab__768, UD_TAB__OPC_MOD, "/mod" }, + /* 769 */ { ud_itab__769, UD_TAB__OPC_MOD, "/mod" }, + /* 770 */ { ud_itab__770, UD_TAB__OPC_MOD, "/mod" }, + /* 771 */ { ud_itab__771, UD_TAB__OPC_MOD, "/mod" }, + /* 772 */ { ud_itab__772, UD_TAB__OPC_X87, "/x87" }, + /* 773 */ { ud_itab__773, UD_TAB__OPC_MOD, "/mod" }, + /* 774 */ { ud_itab__774, UD_TAB__OPC_MOD, "/mod" }, + /* 775 */ { ud_itab__775, UD_TAB__OPC_MOD, "/mod" }, + /* 776 */ { ud_itab__776, UD_TAB__OPC_MOD, "/mod" }, + /* 777 */ { ud_itab__777, UD_TAB__OPC_MOD, "/mod" }, + /* 778 */ { ud_itab__778, UD_TAB__OPC_MOD, "/mod" }, + /* 779 */ { ud_itab__779, UD_TAB__OPC_MOD, "/mod" }, + /* 780 */ { ud_itab__780, UD_TAB__OPC_MOD, "/mod" }, + /* 781 */ { ud_itab__781, UD_TAB__OPC_MOD, "/mod" }, + /* 782 */ { ud_itab__782, UD_TAB__OPC_MOD, "/mod" }, + /* 783 */ { ud_itab__783, UD_TAB__OPC_MOD, "/mod" }, + /* 784 */ { ud_itab__784, UD_TAB__OPC_MOD, "/mod" }, + /* 785 */ { ud_itab__785, UD_TAB__OPC_MOD, "/mod" }, + /* 786 */ { ud_itab__786, UD_TAB__OPC_MOD, "/mod" }, + /* 787 */ { ud_itab__787, UD_TAB__OPC_MOD, "/mod" }, + /* 788 */ { ud_itab__788, UD_TAB__OPC_MOD, "/mod" }, + /* 789 */ { ud_itab__789, UD_TAB__OPC_MOD, "/mod" }, + /* 790 */ { ud_itab__790, UD_TAB__OPC_MOD, "/mod" }, + /* 791 */ { ud_itab__791, UD_TAB__OPC_MOD, "/mod" }, + /* 792 */ { ud_itab__792, UD_TAB__OPC_MOD, "/mod" }, + /* 793 */ { ud_itab__793, UD_TAB__OPC_MOD, "/mod" }, + /* 794 */ { ud_itab__794, UD_TAB__OPC_MOD, "/mod" }, + /* 795 */ { ud_itab__795, UD_TAB__OPC_MOD, "/mod" }, + /* 796 */ { ud_itab__796, UD_TAB__OPC_MOD, "/mod" }, + /* 797 */ { ud_itab__797, UD_TAB__OPC_MOD, "/mod" }, + /* 798 */ { ud_itab__798, UD_TAB__OPC_MOD, "/mod" }, + /* 799 */ { ud_itab__799, UD_TAB__OPC_MOD, "/mod" }, + /* 800 */ { ud_itab__800, UD_TAB__OPC_MOD, "/mod" }, + /* 801 */ { ud_itab__801, UD_TAB__OPC_MOD, "/mod" }, + /* 802 */ { ud_itab__802, UD_TAB__OPC_MOD, "/mod" }, + /* 803 */ { ud_itab__803, UD_TAB__OPC_MOD, "/mod" }, + /* 804 */ { ud_itab__804, UD_TAB__OPC_MOD, "/mod" }, + /* 805 */ { ud_itab__805, UD_TAB__OPC_MOD, "/mod" }, + /* 806 */ { ud_itab__806, UD_TAB__OPC_MOD, "/mod" }, + /* 807 */ { ud_itab__807, UD_TAB__OPC_REG, "/reg" }, + /* 808 */ { ud_itab__808, UD_TAB__OPC_MOD, "/mod" }, + /* 809 */ { ud_itab__809, UD_TAB__OPC_MOD, "/mod" }, + /* 810 */ { ud_itab__810, UD_TAB__OPC_MOD, "/mod" }, + /* 811 */ { ud_itab__811, UD_TAB__OPC_MOD, "/mod" }, + /* 812 */ { ud_itab__812, UD_TAB__OPC_MOD, "/mod" }, + /* 813 */ { ud_itab__813, UD_TAB__OPC_MOD, "/mod" }, + /* 814 */ { ud_itab__814, UD_TAB__OPC_X87, "/x87" }, + /* 815 */ { ud_itab__815, UD_TAB__OPC_MOD, "/mod" }, + /* 816 */ { ud_itab__816, UD_TAB__OPC_MOD, "/mod" }, + /* 817 */ { ud_itab__817, UD_TAB__OPC_MOD, "/mod" }, + /* 818 */ { ud_itab__818, UD_TAB__OPC_MOD, "/mod" }, + /* 819 */ { ud_itab__819, UD_TAB__OPC_MOD, "/mod" }, + /* 820 */ { ud_itab__820, UD_TAB__OPC_MOD, "/mod" }, + /* 821 */ { ud_itab__821, UD_TAB__OPC_MOD, "/mod" }, + /* 822 */ { ud_itab__822, UD_TAB__OPC_MOD, "/mod" }, + /* 823 */ { ud_itab__823, UD_TAB__OPC_MOD, "/mod" }, + /* 824 */ { ud_itab__824, UD_TAB__OPC_MOD, "/mod" }, + /* 825 */ { ud_itab__825, UD_TAB__OPC_MOD, "/mod" }, + /* 826 */ { ud_itab__826, UD_TAB__OPC_MOD, "/mod" }, + /* 827 */ { ud_itab__827, UD_TAB__OPC_MOD, "/mod" }, + /* 828 */ { ud_itab__828, UD_TAB__OPC_MOD, "/mod" }, + /* 829 */ { ud_itab__829, UD_TAB__OPC_MOD, "/mod" }, + /* 830 */ { ud_itab__830, UD_TAB__OPC_MOD, "/mod" }, + /* 831 */ { ud_itab__831, UD_TAB__OPC_MOD, "/mod" }, + /* 832 */ { ud_itab__832, UD_TAB__OPC_MOD, "/mod" }, + /* 833 */ { ud_itab__833, UD_TAB__OPC_MOD, "/mod" }, + /* 834 */ { ud_itab__834, UD_TAB__OPC_MOD, "/mod" }, + /* 835 */ { ud_itab__835, UD_TAB__OPC_MOD, "/mod" }, + /* 836 */ { ud_itab__836, UD_TAB__OPC_MOD, "/mod" }, + /* 837 */ { ud_itab__837, UD_TAB__OPC_MOD, "/mod" }, + /* 838 */ { ud_itab__838, UD_TAB__OPC_MOD, "/mod" }, + /* 839 */ { ud_itab__839, UD_TAB__OPC_MOD, "/mod" }, + /* 840 */ { ud_itab__840, UD_TAB__OPC_MOD, "/mod" }, + /* 841 */ { ud_itab__841, UD_TAB__OPC_MOD, "/mod" }, + /* 842 */ { ud_itab__842, UD_TAB__OPC_MOD, "/mod" }, + /* 843 */ { ud_itab__843, UD_TAB__OPC_MOD, "/mod" }, + /* 844 */ { ud_itab__844, UD_TAB__OPC_MOD, "/mod" }, + /* 845 */ { ud_itab__845, UD_TAB__OPC_MOD, "/mod" }, + /* 846 */ { ud_itab__846, UD_TAB__OPC_MOD, "/mod" }, + /* 847 */ { ud_itab__847, UD_TAB__OPC_MOD, "/mod" }, + /* 848 */ { ud_itab__848, UD_TAB__OPC_MOD, "/mod" }, + /* 849 */ { ud_itab__849, UD_TAB__OPC_MOD, "/mod" }, + /* 850 */ { ud_itab__850, UD_TAB__OPC_MOD, "/mod" }, + /* 851 */ { ud_itab__851, UD_TAB__OPC_MOD, "/mod" }, + /* 852 */ { ud_itab__852, UD_TAB__OPC_MOD, "/mod" }, + /* 853 */ { ud_itab__853, UD_TAB__OPC_MOD, "/mod" }, + /* 854 */ { ud_itab__854, UD_TAB__OPC_MOD, "/mod" }, + /* 855 */ { ud_itab__855, UD_TAB__OPC_MOD, "/mod" }, + /* 856 */ { ud_itab__856, UD_TAB__OPC_MOD, "/mod" }, + /* 857 */ { ud_itab__857, UD_TAB__OPC_MOD, "/mod" }, + /* 858 */ { ud_itab__858, UD_TAB__OPC_MOD, "/mod" }, + /* 859 */ { ud_itab__859, UD_TAB__OPC_MOD, "/mod" }, + /* 860 */ { ud_itab__860, UD_TAB__OPC_MOD, "/mod" }, + /* 861 */ { ud_itab__861, UD_TAB__OPC_MOD, "/mod" }, + /* 862 */ { ud_itab__862, UD_TAB__OPC_MOD, "/mod" }, + /* 863 */ { ud_itab__863, UD_TAB__OPC_MOD, "/mod" }, + /* 864 */ { ud_itab__864, UD_TAB__OPC_MOD, "/mod" }, + /* 865 */ { ud_itab__865, UD_TAB__OPC_MOD, "/mod" }, + /* 866 */ { ud_itab__866, UD_TAB__OPC_REG, "/reg" }, + /* 867 */ { ud_itab__867, UD_TAB__OPC_MOD, "/mod" }, + /* 868 */ { ud_itab__868, UD_TAB__OPC_MOD, "/mod" }, + /* 869 */ { ud_itab__869, UD_TAB__OPC_MOD, "/mod" }, + /* 870 */ { ud_itab__870, UD_TAB__OPC_MOD, "/mod" }, + /* 871 */ { ud_itab__871, UD_TAB__OPC_MOD, "/mod" }, + /* 872 */ { ud_itab__872, UD_TAB__OPC_MOD, "/mod" }, + /* 873 */ { ud_itab__873, UD_TAB__OPC_MOD, "/mod" }, + /* 874 */ { ud_itab__874, UD_TAB__OPC_MOD, "/mod" }, + /* 875 */ { ud_itab__875, UD_TAB__OPC_X87, "/x87" }, + /* 876 */ { ud_itab__876, UD_TAB__OPC_MOD, "/mod" }, + /* 877 */ { ud_itab__877, UD_TAB__OPC_MOD, "/mod" }, + /* 878 */ { ud_itab__878, UD_TAB__OPC_MOD, "/mod" }, + /* 879 */ { ud_itab__879, UD_TAB__OPC_MOD, "/mod" }, + /* 880 */ { ud_itab__880, UD_TAB__OPC_MOD, "/mod" }, + /* 881 */ { ud_itab__881, UD_TAB__OPC_MOD, "/mod" }, + /* 882 */ { ud_itab__882, UD_TAB__OPC_MOD, "/mod" }, + /* 883 */ { ud_itab__883, UD_TAB__OPC_MOD, "/mod" }, + /* 884 */ { ud_itab__884, UD_TAB__OPC_MOD, "/mod" }, + /* 885 */ { ud_itab__885, UD_TAB__OPC_MOD, "/mod" }, + /* 886 */ { ud_itab__886, UD_TAB__OPC_MOD, "/mod" }, + /* 887 */ { ud_itab__887, UD_TAB__OPC_MOD, "/mod" }, + /* 888 */ { ud_itab__888, UD_TAB__OPC_MOD, "/mod" }, + /* 889 */ { ud_itab__889, UD_TAB__OPC_MOD, "/mod" }, + /* 890 */ { ud_itab__890, UD_TAB__OPC_MOD, "/mod" }, + /* 891 */ { ud_itab__891, UD_TAB__OPC_MOD, "/mod" }, + /* 892 */ { ud_itab__892, UD_TAB__OPC_MOD, "/mod" }, + /* 893 */ { ud_itab__893, UD_TAB__OPC_MOD, "/mod" }, + /* 894 */ { ud_itab__894, UD_TAB__OPC_MOD, "/mod" }, + /* 895 */ { ud_itab__895, UD_TAB__OPC_MOD, "/mod" }, + /* 896 */ { ud_itab__896, UD_TAB__OPC_MOD, "/mod" }, + /* 897 */ { ud_itab__897, UD_TAB__OPC_MOD, "/mod" }, + /* 898 */ { ud_itab__898, UD_TAB__OPC_MOD, "/mod" }, + /* 899 */ { ud_itab__899, UD_TAB__OPC_MOD, "/mod" }, + /* 900 */ { ud_itab__900, UD_TAB__OPC_MOD, "/mod" }, + /* 901 */ { ud_itab__901, UD_TAB__OPC_MOD, "/mod" }, + /* 902 */ { ud_itab__902, UD_TAB__OPC_MOD, "/mod" }, + /* 903 */ { ud_itab__903, UD_TAB__OPC_MOD, "/mod" }, + /* 904 */ { ud_itab__904, UD_TAB__OPC_MOD, "/mod" }, + /* 905 */ { ud_itab__905, UD_TAB__OPC_MOD, "/mod" }, + /* 906 */ { ud_itab__906, UD_TAB__OPC_MOD, "/mod" }, + /* 907 */ { ud_itab__907, UD_TAB__OPC_MOD, "/mod" }, + /* 908 */ { ud_itab__908, UD_TAB__OPC_MOD, "/mod" }, + /* 909 */ { ud_itab__909, UD_TAB__OPC_MOD, "/mod" }, + /* 910 */ { ud_itab__910, UD_TAB__OPC_MOD, "/mod" }, + /* 911 */ { ud_itab__911, UD_TAB__OPC_MOD, "/mod" }, + /* 912 */ { ud_itab__912, UD_TAB__OPC_MOD, "/mod" }, + /* 913 */ { ud_itab__913, UD_TAB__OPC_MOD, "/mod" }, + /* 914 */ { ud_itab__914, UD_TAB__OPC_MOD, "/mod" }, + /* 915 */ { ud_itab__915, UD_TAB__OPC_MOD, "/mod" }, + /* 916 */ { ud_itab__916, UD_TAB__OPC_MOD, "/mod" }, + /* 917 */ { ud_itab__917, UD_TAB__OPC_MOD, "/mod" }, + /* 918 */ { ud_itab__918, UD_TAB__OPC_MOD, "/mod" }, + /* 919 */ { ud_itab__919, UD_TAB__OPC_MOD, "/mod" }, + /* 920 */ { ud_itab__920, UD_TAB__OPC_MOD, "/mod" }, + /* 921 */ { ud_itab__921, UD_TAB__OPC_MOD, "/mod" }, + /* 922 */ { ud_itab__922, UD_TAB__OPC_MOD, "/mod" }, + /* 923 */ { ud_itab__923, UD_TAB__OPC_MOD, "/mod" }, + /* 924 */ { ud_itab__924, UD_TAB__OPC_MOD, "/mod" }, + /* 925 */ { ud_itab__925, UD_TAB__OPC_MOD, "/mod" }, + /* 926 */ { ud_itab__926, UD_TAB__OPC_MOD, "/mod" }, + /* 927 */ { ud_itab__927, UD_TAB__OPC_MOD, "/mod" }, + /* 928 */ { ud_itab__928, UD_TAB__OPC_MOD, "/mod" }, + /* 929 */ { ud_itab__929, UD_TAB__OPC_MOD, "/mod" }, + /* 930 */ { ud_itab__930, UD_TAB__OPC_MOD, "/mod" }, + /* 931 */ { ud_itab__931, UD_TAB__OPC_MOD, "/mod" }, + /* 932 */ { ud_itab__932, UD_TAB__OPC_MOD, "/mod" }, + /* 933 */ { ud_itab__933, UD_TAB__OPC_MOD, "/mod" }, + /* 934 */ { ud_itab__934, UD_TAB__OPC_MOD, "/mod" }, + /* 935 */ { ud_itab__935, UD_TAB__OPC_MOD, "/mod" }, + /* 936 */ { ud_itab__936, UD_TAB__OPC_MOD, "/mod" }, + /* 937 */ { ud_itab__937, UD_TAB__OPC_MOD, "/mod" }, + /* 938 */ { ud_itab__938, UD_TAB__OPC_MOD, "/mod" }, + /* 939 */ { ud_itab__939, UD_TAB__OPC_MOD, "/mod" }, + /* 940 */ { ud_itab__940, UD_TAB__OPC_MOD, "/mod" }, + /* 941 */ { ud_itab__941, UD_TAB__OPC_REG, "/reg" }, + /* 942 */ { ud_itab__942, UD_TAB__OPC_MOD, "/mod" }, + /* 943 */ { ud_itab__943, UD_TAB__OPC_MOD, "/mod" }, + /* 944 */ { ud_itab__944, UD_TAB__OPC_MOD, "/mod" }, + /* 945 */ { ud_itab__945, UD_TAB__OPC_MOD, "/mod" }, + /* 946 */ { ud_itab__946, UD_TAB__OPC_MOD, "/mod" }, + /* 947 */ { ud_itab__947, UD_TAB__OPC_MOD, "/mod" }, + /* 948 */ { ud_itab__948, UD_TAB__OPC_MOD, "/mod" }, + /* 949 */ { ud_itab__949, UD_TAB__OPC_X87, "/x87" }, + /* 950 */ { ud_itab__950, UD_TAB__OPC_MOD, "/mod" }, + /* 951 */ { ud_itab__951, UD_TAB__OPC_MOD, "/mod" }, + /* 952 */ { ud_itab__952, UD_TAB__OPC_MOD, "/mod" }, + /* 953 */ { ud_itab__953, UD_TAB__OPC_MOD, "/mod" }, + /* 954 */ { ud_itab__954, UD_TAB__OPC_MOD, "/mod" }, + /* 955 */ { ud_itab__955, UD_TAB__OPC_MOD, "/mod" }, + /* 956 */ { ud_itab__956, UD_TAB__OPC_MOD, "/mod" }, + /* 957 */ { ud_itab__957, UD_TAB__OPC_MOD, "/mod" }, + /* 958 */ { ud_itab__958, UD_TAB__OPC_MOD, "/mod" }, + /* 959 */ { ud_itab__959, UD_TAB__OPC_MOD, "/mod" }, + /* 960 */ { ud_itab__960, UD_TAB__OPC_MOD, "/mod" }, + /* 961 */ { ud_itab__961, UD_TAB__OPC_MOD, "/mod" }, + /* 962 */ { ud_itab__962, UD_TAB__OPC_MOD, "/mod" }, + /* 963 */ { ud_itab__963, UD_TAB__OPC_MOD, "/mod" }, + /* 964 */ { ud_itab__964, UD_TAB__OPC_MOD, "/mod" }, + /* 965 */ { ud_itab__965, UD_TAB__OPC_MOD, "/mod" }, + /* 966 */ { ud_itab__966, UD_TAB__OPC_MOD, "/mod" }, + /* 967 */ { ud_itab__967, UD_TAB__OPC_MOD, "/mod" }, + /* 968 */ { ud_itab__968, UD_TAB__OPC_MOD, "/mod" }, + /* 969 */ { ud_itab__969, UD_TAB__OPC_MOD, "/mod" }, + /* 970 */ { ud_itab__970, UD_TAB__OPC_MOD, "/mod" }, + /* 971 */ { ud_itab__971, UD_TAB__OPC_MOD, "/mod" }, + /* 972 */ { ud_itab__972, UD_TAB__OPC_MOD, "/mod" }, + /* 973 */ { ud_itab__973, UD_TAB__OPC_MOD, "/mod" }, + /* 974 */ { ud_itab__974, UD_TAB__OPC_MOD, "/mod" }, + /* 975 */ { ud_itab__975, UD_TAB__OPC_MOD, "/mod" }, + /* 976 */ { ud_itab__976, UD_TAB__OPC_MOD, "/mod" }, + /* 977 */ { ud_itab__977, UD_TAB__OPC_MOD, "/mod" }, + /* 978 */ { ud_itab__978, UD_TAB__OPC_MOD, "/mod" }, + /* 979 */ { ud_itab__979, UD_TAB__OPC_MOD, "/mod" }, + /* 980 */ { ud_itab__980, UD_TAB__OPC_MOD, "/mod" }, + /* 981 */ { ud_itab__981, UD_TAB__OPC_MOD, "/mod" }, + /* 982 */ { ud_itab__982, UD_TAB__OPC_MOD, "/mod" }, + /* 983 */ { ud_itab__983, UD_TAB__OPC_MOD, "/mod" }, + /* 984 */ { ud_itab__984, UD_TAB__OPC_MOD, "/mod" }, + /* 985 */ { ud_itab__985, UD_TAB__OPC_MOD, "/mod" }, + /* 986 */ { ud_itab__986, UD_TAB__OPC_MOD, "/mod" }, + /* 987 */ { ud_itab__987, UD_TAB__OPC_MOD, "/mod" }, + /* 988 */ { ud_itab__988, UD_TAB__OPC_MOD, "/mod" }, + /* 989 */ { ud_itab__989, UD_TAB__OPC_MOD, "/mod" }, + /* 990 */ { ud_itab__990, UD_TAB__OPC_MOD, "/mod" }, + /* 991 */ { ud_itab__991, UD_TAB__OPC_MOD, "/mod" }, + /* 992 */ { ud_itab__992, UD_TAB__OPC_MOD, "/mod" }, + /* 993 */ { ud_itab__993, UD_TAB__OPC_MOD, "/mod" }, + /* 994 */ { ud_itab__994, UD_TAB__OPC_MOD, "/mod" }, + /* 995 */ { ud_itab__995, UD_TAB__OPC_MOD, "/mod" }, + /* 996 */ { ud_itab__996, UD_TAB__OPC_MOD, "/mod" }, + /* 997 */ { ud_itab__997, UD_TAB__OPC_MOD, "/mod" }, + /* 998 */ { ud_itab__998, UD_TAB__OPC_MOD, "/mod" }, + /* 999 */ { ud_itab__999, UD_TAB__OPC_REG, "/reg" }, + /* 1000 */ { ud_itab__1000, UD_TAB__OPC_MOD, "/mod" }, + /* 1001 */ { ud_itab__1001, UD_TAB__OPC_MOD, "/mod" }, + /* 1002 */ { ud_itab__1002, UD_TAB__OPC_MOD, "/mod" }, + /* 1003 */ { ud_itab__1003, UD_TAB__OPC_MOD, "/mod" }, + /* 1004 */ { ud_itab__1004, UD_TAB__OPC_MOD, "/mod" }, + /* 1005 */ { ud_itab__1005, UD_TAB__OPC_MOD, "/mod" }, + /* 1006 */ { ud_itab__1006, UD_TAB__OPC_MOD, "/mod" }, + /* 1007 */ { ud_itab__1007, UD_TAB__OPC_MOD, "/mod" }, + /* 1008 */ { ud_itab__1008, UD_TAB__OPC_X87, "/x87" }, + /* 1009 */ { ud_itab__1009, UD_TAB__OPC_MOD, "/mod" }, + /* 1010 */ { ud_itab__1010, UD_TAB__OPC_MOD, "/mod" }, + /* 1011 */ { ud_itab__1011, UD_TAB__OPC_MOD, "/mod" }, + /* 1012 */ { ud_itab__1012, UD_TAB__OPC_MOD, "/mod" }, + /* 1013 */ { ud_itab__1013, UD_TAB__OPC_MOD, "/mod" }, + /* 1014 */ { ud_itab__1014, UD_TAB__OPC_MOD, "/mod" }, + /* 1015 */ { ud_itab__1015, UD_TAB__OPC_MOD, "/mod" }, + /* 1016 */ { ud_itab__1016, UD_TAB__OPC_MOD, "/mod" }, + /* 1017 */ { ud_itab__1017, UD_TAB__OPC_MOD, "/mod" }, + /* 1018 */ { ud_itab__1018, UD_TAB__OPC_MOD, "/mod" }, + /* 1019 */ { ud_itab__1019, UD_TAB__OPC_MOD, "/mod" }, + /* 1020 */ { ud_itab__1020, UD_TAB__OPC_MOD, "/mod" }, + /* 1021 */ { ud_itab__1021, UD_TAB__OPC_MOD, "/mod" }, + /* 1022 */ { ud_itab__1022, UD_TAB__OPC_MOD, "/mod" }, + /* 1023 */ { ud_itab__1023, UD_TAB__OPC_MOD, "/mod" }, + /* 1024 */ { ud_itab__1024, UD_TAB__OPC_MOD, "/mod" }, + /* 1025 */ { ud_itab__1025, UD_TAB__OPC_MOD, "/mod" }, + /* 1026 */ { ud_itab__1026, UD_TAB__OPC_MOD, "/mod" }, + /* 1027 */ { ud_itab__1027, UD_TAB__OPC_MOD, "/mod" }, + /* 1028 */ { ud_itab__1028, UD_TAB__OPC_MOD, "/mod" }, + /* 1029 */ { ud_itab__1029, UD_TAB__OPC_MOD, "/mod" }, + /* 1030 */ { ud_itab__1030, UD_TAB__OPC_MOD, "/mod" }, + /* 1031 */ { ud_itab__1031, UD_TAB__OPC_MOD, "/mod" }, + /* 1032 */ { ud_itab__1032, UD_TAB__OPC_MOD, "/mod" }, + /* 1033 */ { ud_itab__1033, UD_TAB__OPC_MOD, "/mod" }, + /* 1034 */ { ud_itab__1034, UD_TAB__OPC_MOD, "/mod" }, + /* 1035 */ { ud_itab__1035, UD_TAB__OPC_MOD, "/mod" }, + /* 1036 */ { ud_itab__1036, UD_TAB__OPC_MOD, "/mod" }, + /* 1037 */ { ud_itab__1037, UD_TAB__OPC_MOD, "/mod" }, + /* 1038 */ { ud_itab__1038, UD_TAB__OPC_MOD, "/mod" }, + /* 1039 */ { ud_itab__1039, UD_TAB__OPC_MOD, "/mod" }, + /* 1040 */ { ud_itab__1040, UD_TAB__OPC_MOD, "/mod" }, + /* 1041 */ { ud_itab__1041, UD_TAB__OPC_MOD, "/mod" }, + /* 1042 */ { ud_itab__1042, UD_TAB__OPC_MOD, "/mod" }, + /* 1043 */ { ud_itab__1043, UD_TAB__OPC_MOD, "/mod" }, + /* 1044 */ { ud_itab__1044, UD_TAB__OPC_MOD, "/mod" }, + /* 1045 */ { ud_itab__1045, UD_TAB__OPC_MOD, "/mod" }, + /* 1046 */ { ud_itab__1046, UD_TAB__OPC_MOD, "/mod" }, + /* 1047 */ { ud_itab__1047, UD_TAB__OPC_MOD, "/mod" }, + /* 1048 */ { ud_itab__1048, UD_TAB__OPC_MOD, "/mod" }, + /* 1049 */ { ud_itab__1049, UD_TAB__OPC_MOD, "/mod" }, + /* 1050 */ { ud_itab__1050, UD_TAB__OPC_MOD, "/mod" }, + /* 1051 */ { ud_itab__1051, UD_TAB__OPC_MOD, "/mod" }, + /* 1052 */ { ud_itab__1052, UD_TAB__OPC_MOD, "/mod" }, + /* 1053 */ { ud_itab__1053, UD_TAB__OPC_MOD, "/mod" }, + /* 1054 */ { ud_itab__1054, UD_TAB__OPC_MOD, "/mod" }, + /* 1055 */ { ud_itab__1055, UD_TAB__OPC_MOD, "/mod" }, + /* 1056 */ { ud_itab__1056, UD_TAB__OPC_MOD, "/mod" }, + /* 1057 */ { ud_itab__1057, UD_TAB__OPC_MOD, "/mod" }, + /* 1058 */ { ud_itab__1058, UD_TAB__OPC_MOD, "/mod" }, + /* 1059 */ { ud_itab__1059, UD_TAB__OPC_MOD, "/mod" }, + /* 1060 */ { ud_itab__1060, UD_TAB__OPC_MOD, "/mod" }, + /* 1061 */ { ud_itab__1061, UD_TAB__OPC_MOD, "/mod" }, + /* 1062 */ { ud_itab__1062, UD_TAB__OPC_MOD, "/mod" }, + /* 1063 */ { ud_itab__1063, UD_TAB__OPC_MOD, "/mod" }, + /* 1064 */ { ud_itab__1064, UD_TAB__OPC_MOD, "/mod" }, + /* 1065 */ { ud_itab__1065, UD_TAB__OPC_MOD, "/mod" }, + /* 1066 */ { ud_itab__1066, UD_TAB__OPC_MOD, "/mod" }, + /* 1067 */ { ud_itab__1067, UD_TAB__OPC_REG, "/reg" }, + /* 1068 */ { ud_itab__1068, UD_TAB__OPC_MOD, "/mod" }, + /* 1069 */ { ud_itab__1069, UD_TAB__OPC_MOD, "/mod" }, + /* 1070 */ { ud_itab__1070, UD_TAB__OPC_MOD, "/mod" }, + /* 1071 */ { ud_itab__1071, UD_TAB__OPC_MOD, "/mod" }, + /* 1072 */ { ud_itab__1072, UD_TAB__OPC_MOD, "/mod" }, + /* 1073 */ { ud_itab__1073, UD_TAB__OPC_MOD, "/mod" }, + /* 1074 */ { ud_itab__1074, UD_TAB__OPC_MOD, "/mod" }, + /* 1075 */ { ud_itab__1075, UD_TAB__OPC_MOD, "/mod" }, + /* 1076 */ { ud_itab__1076, UD_TAB__OPC_X87, "/x87" }, + /* 1077 */ { ud_itab__1077, UD_TAB__OPC_MOD, "/mod" }, + /* 1078 */ { ud_itab__1078, UD_TAB__OPC_MOD, "/mod" }, + /* 1079 */ { ud_itab__1079, UD_TAB__OPC_MOD, "/mod" }, + /* 1080 */ { ud_itab__1080, UD_TAB__OPC_MOD, "/mod" }, + /* 1081 */ { ud_itab__1081, UD_TAB__OPC_MOD, "/mod" }, + /* 1082 */ { ud_itab__1082, UD_TAB__OPC_MOD, "/mod" }, + /* 1083 */ { ud_itab__1083, UD_TAB__OPC_MOD, "/mod" }, + /* 1084 */ { ud_itab__1084, UD_TAB__OPC_MOD, "/mod" }, + /* 1085 */ { ud_itab__1085, UD_TAB__OPC_MOD, "/mod" }, + /* 1086 */ { ud_itab__1086, UD_TAB__OPC_MOD, "/mod" }, + /* 1087 */ { ud_itab__1087, UD_TAB__OPC_MOD, "/mod" }, + /* 1088 */ { ud_itab__1088, UD_TAB__OPC_MOD, "/mod" }, + /* 1089 */ { ud_itab__1089, UD_TAB__OPC_MOD, "/mod" }, + /* 1090 */ { ud_itab__1090, UD_TAB__OPC_MOD, "/mod" }, + /* 1091 */ { ud_itab__1091, UD_TAB__OPC_MOD, "/mod" }, + /* 1092 */ { ud_itab__1092, UD_TAB__OPC_MOD, "/mod" }, + /* 1093 */ { ud_itab__1093, UD_TAB__OPC_MOD, "/mod" }, + /* 1094 */ { ud_itab__1094, UD_TAB__OPC_MOD, "/mod" }, + /* 1095 */ { ud_itab__1095, UD_TAB__OPC_MOD, "/mod" }, + /* 1096 */ { ud_itab__1096, UD_TAB__OPC_MOD, "/mod" }, + /* 1097 */ { ud_itab__1097, UD_TAB__OPC_MOD, "/mod" }, + /* 1098 */ { ud_itab__1098, UD_TAB__OPC_MOD, "/mod" }, + /* 1099 */ { ud_itab__1099, UD_TAB__OPC_MOD, "/mod" }, + /* 1100 */ { ud_itab__1100, UD_TAB__OPC_MOD, "/mod" }, + /* 1101 */ { ud_itab__1101, UD_TAB__OPC_MOD, "/mod" }, + /* 1102 */ { ud_itab__1102, UD_TAB__OPC_MOD, "/mod" }, + /* 1103 */ { ud_itab__1103, UD_TAB__OPC_MOD, "/mod" }, + /* 1104 */ { ud_itab__1104, UD_TAB__OPC_MOD, "/mod" }, + /* 1105 */ { ud_itab__1105, UD_TAB__OPC_MOD, "/mod" }, + /* 1106 */ { ud_itab__1106, UD_TAB__OPC_MOD, "/mod" }, + /* 1107 */ { ud_itab__1107, UD_TAB__OPC_MOD, "/mod" }, + /* 1108 */ { ud_itab__1108, UD_TAB__OPC_MOD, "/mod" }, + /* 1109 */ { ud_itab__1109, UD_TAB__OPC_MOD, "/mod" }, + /* 1110 */ { ud_itab__1110, UD_TAB__OPC_MOD, "/mod" }, + /* 1111 */ { ud_itab__1111, UD_TAB__OPC_MOD, "/mod" }, + /* 1112 */ { ud_itab__1112, UD_TAB__OPC_MOD, "/mod" }, + /* 1113 */ { ud_itab__1113, UD_TAB__OPC_MOD, "/mod" }, + /* 1114 */ { ud_itab__1114, UD_TAB__OPC_MOD, "/mod" }, + /* 1115 */ { ud_itab__1115, UD_TAB__OPC_MOD, "/mod" }, + /* 1116 */ { ud_itab__1116, UD_TAB__OPC_MOD, "/mod" }, + /* 1117 */ { ud_itab__1117, UD_TAB__OPC_MOD, "/mod" }, + /* 1118 */ { ud_itab__1118, UD_TAB__OPC_MOD, "/mod" }, + /* 1119 */ { ud_itab__1119, UD_TAB__OPC_MOD, "/mod" }, + /* 1120 */ { ud_itab__1120, UD_TAB__OPC_MOD, "/mod" }, + /* 1121 */ { ud_itab__1121, UD_TAB__OPC_MOD, "/mod" }, + /* 1122 */ { ud_itab__1122, UD_TAB__OPC_MOD, "/mod" }, + /* 1123 */ { ud_itab__1123, UD_TAB__OPC_MOD, "/mod" }, + /* 1124 */ { ud_itab__1124, UD_TAB__OPC_MOD, "/mod" }, + /* 1125 */ { ud_itab__1125, UD_TAB__OPC_MOD, "/mod" }, + /* 1126 */ { ud_itab__1126, UD_TAB__OPC_ASIZE, "/a" }, + /* 1127 */ { ud_itab__1127, UD_TAB__OPC_MODE, "/m" }, + /* 1128 */ { ud_itab__1128, UD_TAB__OPC_REG, "/reg" }, + /* 1129 */ { ud_itab__1129, UD_TAB__OPC_REG, "/reg" }, + /* 1130 */ { ud_itab__1130, UD_TAB__OPC_REG, "/reg" }, + /* 1131 */ { ud_itab__1131, UD_TAB__OPC_REG, "/reg" }, + /* 1132 */ { ud_itab__1132, UD_TAB__OPC_MODE, "/m" }, +}; + +/* itab entry operand definitions (for readability) */ +#define O_AL { OP_AL, SZ_B } +#define O_AX { OP_AX, SZ_W } +#define O_Av { OP_A, SZ_V } +#define O_C { OP_C, SZ_NA } +#define O_CL { OP_CL, SZ_B } +#define O_CS { OP_CS, SZ_NA } +#define O_CX { OP_CX, SZ_W } +#define O_D { OP_D, SZ_NA } +#define O_DL { OP_DL, SZ_B } +#define O_DS { OP_DS, SZ_NA } +#define O_DX { OP_DX, SZ_W } +#define O_E { OP_E, SZ_NA } +#define O_ES { OP_ES, SZ_NA } +#define O_Eb { OP_E, SZ_B } +#define O_Ed { OP_E, SZ_D } +#define O_Eq { OP_E, SZ_Q } +#define O_Ev { OP_E, SZ_V } +#define O_Ew { OP_E, SZ_W } +#define O_Ey { OP_E, SZ_Y } +#define O_Ez { OP_E, SZ_Z } +#define O_FS { OP_FS, SZ_NA } +#define O_Fv { OP_F, SZ_V } +#define O_G { OP_G, SZ_NA } +#define O_GS { OP_GS, SZ_NA } +#define O_Gb { OP_G, SZ_B } +#define O_Gd { OP_G, SZ_D } +#define O_Gq { OP_G, SZ_Q } +#define O_Gv { OP_G, SZ_V } +#define O_Gw { OP_G, SZ_W } +#define O_Gy { OP_G, SZ_Y } +#define O_Gz { OP_G, SZ_Z } +#define O_I1 { OP_I1, SZ_NA } +#define O_I3 { OP_I3, SZ_NA } +#define O_Ib { OP_I, SZ_B } +#define O_Iv { OP_I, SZ_V } +#define O_Iw { OP_I, SZ_W } +#define O_Iz { OP_I, SZ_Z } +#define O_Jb { OP_J, SZ_B } +#define O_Jv { OP_J, SZ_V } +#define O_Jz { OP_J, SZ_Z } +#define O_M { OP_M, SZ_NA } +#define O_Mb { OP_M, SZ_B } +#define O_MbRd { OP_MR, SZ_BD } +#define O_MbRv { OP_MR, SZ_BV } +#define O_Md { OP_M, SZ_D } +#define O_MdRy { OP_MR, SZ_DY } +#define O_MdU { OP_MU, SZ_DO } +#define O_Mo { OP_M, SZ_O } +#define O_Mq { OP_M, SZ_Q } +#define O_MqU { OP_MU, SZ_QO } +#define O_Ms { OP_M, SZ_W } +#define O_Mt { OP_M, SZ_T } +#define O_Mv { OP_M, SZ_V } +#define O_Mw { OP_M, SZ_W } +#define O_MwRd { OP_MR, SZ_WD } +#define O_MwRv { OP_MR, SZ_WV } +#define O_MwRy { OP_MR, SZ_WY } +#define O_MwU { OP_MU, SZ_WO } +#define O_N { OP_N, SZ_Q } +#define O_NONE { OP_NONE, SZ_NA } +#define O_Ob { OP_O, SZ_B } +#define O_Ov { OP_O, SZ_V } +#define O_Ow { OP_O, SZ_W } +#define O_P { OP_P, SZ_Q } +#define O_Q { OP_Q, SZ_Q } +#define O_R { OP_R, SZ_RDQ } +#define O_R0b { OP_R0, SZ_B } +#define O_R0v { OP_R0, SZ_V } +#define O_R0w { OP_R0, SZ_W } +#define O_R0y { OP_R0, SZ_Y } +#define O_R0z { OP_R0, SZ_Z } +#define O_R1b { OP_R1, SZ_B } +#define O_R1v { OP_R1, SZ_V } +#define O_R1w { OP_R1, SZ_W } +#define O_R1y { OP_R1, SZ_Y } +#define O_R1z { OP_R1, SZ_Z } +#define O_R2b { OP_R2, SZ_B } +#define O_R2v { OP_R2, SZ_V } +#define O_R2w { OP_R2, SZ_W } +#define O_R2y { OP_R2, SZ_Y } +#define O_R2z { OP_R2, SZ_Z } +#define O_R3b { OP_R3, SZ_B } +#define O_R3v { OP_R3, SZ_V } +#define O_R3w { OP_R3, SZ_W } +#define O_R3y { OP_R3, SZ_Y } +#define O_R3z { OP_R3, SZ_Z } +#define O_R4b { OP_R4, SZ_B } +#define O_R4v { OP_R4, SZ_V } +#define O_R4w { OP_R4, SZ_W } +#define O_R4y { OP_R4, SZ_Y } +#define O_R4z { OP_R4, SZ_Z } +#define O_R5b { OP_R5, SZ_B } +#define O_R5v { OP_R5, SZ_V } +#define O_R5w { OP_R5, SZ_W } +#define O_R5y { OP_R5, SZ_Y } +#define O_R5z { OP_R5, SZ_Z } +#define O_R6b { OP_R6, SZ_B } +#define O_R6v { OP_R6, SZ_V } +#define O_R6w { OP_R6, SZ_W } +#define O_R6y { OP_R6, SZ_Y } +#define O_R6z { OP_R6, SZ_Z } +#define O_R7b { OP_R7, SZ_B } +#define O_R7v { OP_R7, SZ_V } +#define O_R7w { OP_R7, SZ_W } +#define O_R7y { OP_R7, SZ_Y } +#define O_R7z { OP_R7, SZ_Z } +#define O_S { OP_S, SZ_NA } +#define O_SS { OP_SS, SZ_NA } +#define O_ST0 { OP_ST0, SZ_NA } +#define O_ST1 { OP_ST1, SZ_NA } +#define O_ST2 { OP_ST2, SZ_NA } +#define O_ST3 { OP_ST3, SZ_NA } +#define O_ST4 { OP_ST4, SZ_NA } +#define O_ST5 { OP_ST5, SZ_NA } +#define O_ST6 { OP_ST6, SZ_NA } +#define O_ST7 { OP_ST7, SZ_NA } +#define O_U { OP_U, SZ_O } +#define O_V { OP_V, SZ_O } +#define O_W { OP_W, SZ_O } +#define O_eAX { OP_eAX, SZ_Z } +#define O_eCX { OP_eCX, SZ_Z } +#define O_eDX { OP_eDX, SZ_Z } +#define O_rAX { OP_rAX, SZ_V } +#define O_rCX { OP_rCX, SZ_V } +#define O_rDX { OP_rDX, SZ_V } +#define O_sIb { OP_sI, SZ_B } +#define O_sIv { OP_sI, SZ_V } +#define O_sIz { OP_sI, SZ_Z } + +struct ud_itab_entry ud_itab[] = { + /* 0000 */ { UD_Iinvalid, O_NONE, O_NONE, O_NONE, P_none }, + /* 0001 */ { UD_Iadd, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0002 */ { UD_Iadd, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0003 */ { UD_Iadd, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0004 */ { UD_Iadd, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0005 */ { UD_Iadd, O_AL, O_Ib, O_NONE, P_none }, + /* 0006 */ { UD_Iadd, O_rAX, O_sIz, O_NONE, P_oso|P_rexw }, + /* 0007 */ { UD_Ipush, O_ES, O_NONE, O_NONE, P_inv64 }, + /* 0008 */ { UD_Ipop, O_ES, O_NONE, O_NONE, P_inv64 }, + /* 0009 */ { UD_Ior, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0010 */ { UD_Ior, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0011 */ { UD_Ior, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0012 */ { UD_Ior, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0013 */ { UD_Ior, O_AL, O_Ib, O_NONE, P_none }, + /* 0014 */ { UD_Ior, O_rAX, O_sIz, O_NONE, P_oso|P_rexw }, + /* 0015 */ { UD_Ipush, O_CS, O_NONE, O_NONE, P_inv64 }, + /* 0016 */ { UD_Isldt, O_MwRv, O_NONE, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0017 */ { UD_Istr, O_MwRv, O_NONE, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0018 */ { UD_Illdt, O_Ew, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0019 */ { UD_Iltr, O_Ew, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0020 */ { UD_Iverr, O_Ew, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0021 */ { UD_Iverw, O_Ew, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0022 */ { UD_Isgdt, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0023 */ { UD_Isidt, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0024 */ { UD_Ilgdt, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0025 */ { UD_Ilidt, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0026 */ { UD_Ismsw, O_MwRv, O_NONE, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0027 */ { UD_Ilmsw, O_Ew, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0028 */ { UD_Iinvlpg, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0029 */ { UD_Ivmcall, O_NONE, O_NONE, O_NONE, P_none }, + /* 0030 */ { UD_Ivmlaunch, O_NONE, O_NONE, O_NONE, P_none }, + /* 0031 */ { UD_Ivmresume, O_NONE, O_NONE, O_NONE, P_none }, + /* 0032 */ { UD_Ivmxoff, O_NONE, O_NONE, O_NONE, P_none }, + /* 0033 */ { UD_Imonitor, O_NONE, O_NONE, O_NONE, P_none }, + /* 0034 */ { UD_Imwait, O_NONE, O_NONE, O_NONE, P_none }, + /* 0035 */ { UD_Ixgetbv, O_NONE, O_NONE, O_NONE, P_none }, + /* 0036 */ { UD_Ixsetbv, O_NONE, O_NONE, O_NONE, P_none }, + /* 0037 */ { UD_Ivmrun, O_NONE, O_NONE, O_NONE, P_none }, + /* 0038 */ { UD_Ivmmcall, O_NONE, O_NONE, O_NONE, P_none }, + /* 0039 */ { UD_Ivmload, O_NONE, O_NONE, O_NONE, P_none }, + /* 0040 */ { UD_Ivmsave, O_NONE, O_NONE, O_NONE, P_none }, + /* 0041 */ { UD_Istgi, O_NONE, O_NONE, O_NONE, P_none }, + /* 0042 */ { UD_Iclgi, O_NONE, O_NONE, O_NONE, P_none }, + /* 0043 */ { UD_Iskinit, O_NONE, O_NONE, O_NONE, P_none }, + /* 0044 */ { UD_Iinvlpga, O_NONE, O_NONE, O_NONE, P_none }, + /* 0045 */ { UD_Ismsw, O_MwRv, O_NONE, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0046 */ { UD_Ilmsw, O_Ew, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0047 */ { UD_Iswapgs, O_NONE, O_NONE, O_NONE, P_none }, + /* 0048 */ { UD_Irdtscp, O_NONE, O_NONE, O_NONE, P_none }, + /* 0049 */ { UD_Ilar, O_Gv, O_Ew, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0050 */ { UD_Ilsl, O_Gv, O_Ew, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0051 */ { UD_Isyscall, O_NONE, O_NONE, O_NONE, P_none }, + /* 0052 */ { UD_Iclts, O_NONE, O_NONE, O_NONE, P_none }, + /* 0053 */ { UD_Isysret, O_NONE, O_NONE, O_NONE, P_none }, + /* 0054 */ { UD_Iinvd, O_NONE, O_NONE, O_NONE, P_none }, + /* 0055 */ { UD_Iwbinvd, O_NONE, O_NONE, O_NONE, P_none }, + /* 0056 */ { UD_Iud2, O_NONE, O_NONE, O_NONE, P_none }, + /* 0057 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0058 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0059 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0060 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0061 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0062 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0063 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0064 */ { UD_Iprefetch, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0065 */ { UD_Ifemms, O_NONE, O_NONE, O_NONE, P_none }, + /* 0066 */ { UD_Ipi2fw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0067 */ { UD_Ipi2fd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0068 */ { UD_Ipf2iw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0069 */ { UD_Ipf2id, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0070 */ { UD_Ipfnacc, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0071 */ { UD_Ipfpnacc, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0072 */ { UD_Ipfcmpge, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0073 */ { UD_Ipfmin, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0074 */ { UD_Ipfrcp, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0075 */ { UD_Ipfrsqrt, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0076 */ { UD_Ipfsub, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0077 */ { UD_Ipfadd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0078 */ { UD_Ipfcmpgt, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0079 */ { UD_Ipfmax, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0080 */ { UD_Ipfrcpit1, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0081 */ { UD_Ipfrsqit1, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0082 */ { UD_Ipfsubr, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0083 */ { UD_Ipfacc, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0084 */ { UD_Ipfcmpeq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0085 */ { UD_Ipfmul, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0086 */ { UD_Ipfrcpit2, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0087 */ { UD_Ipmulhrw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0088 */ { UD_Ipswapd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0089 */ { UD_Ipavgusb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0090 */ { UD_Imovups, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0091 */ { UD_Imovsd, O_V, O_W, O_NONE, P_str|P_aso|P_rexr|P_rexx|P_rexb }, + /* 0092 */ { UD_Imovss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0093 */ { UD_Imovupd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0094 */ { UD_Imovups, O_W, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0095 */ { UD_Imovsd, O_W, O_V, O_NONE, P_str|P_aso|P_rexr|P_rexx|P_rexb }, + /* 0096 */ { UD_Imovss, O_W, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0097 */ { UD_Imovupd, O_W, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0098 */ { UD_Imovlps, O_V, O_M, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0099 */ { UD_Imovddup, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0100 */ { UD_Imovsldup, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0101 */ { UD_Imovlpd, O_V, O_M, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0102 */ { UD_Imovhlps, O_V, O_U, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0103 */ { UD_Imovddup, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0104 */ { UD_Imovsldup, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0105 */ { UD_Imovlps, O_M, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0106 */ { UD_Imovlpd, O_M, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0107 */ { UD_Iunpcklps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0108 */ { UD_Iunpcklpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0109 */ { UD_Iunpckhps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0110 */ { UD_Iunpckhpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0111 */ { UD_Imovhps, O_V, O_M, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0112 */ { UD_Imovshdup, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0113 */ { UD_Imovhpd, O_V, O_M, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0114 */ { UD_Imovlhps, O_V, O_U, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0115 */ { UD_Imovshdup, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0116 */ { UD_Imovhps, O_M, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0117 */ { UD_Imovhpd, O_M, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0118 */ { UD_Iprefetchnta, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0119 */ { UD_Iprefetcht0, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0120 */ { UD_Iprefetcht1, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0121 */ { UD_Iprefetcht2, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0122 */ { UD_Inop, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0123 */ { UD_Inop, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0124 */ { UD_Inop, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0125 */ { UD_Inop, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0126 */ { UD_Inop, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0127 */ { UD_Inop, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0128 */ { UD_Inop, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0129 */ { UD_Imov, O_R, O_C, O_NONE, P_rexr|P_rexw|P_rexb }, + /* 0130 */ { UD_Imov, O_R, O_D, O_NONE, P_rexr|P_rexw|P_rexb }, + /* 0131 */ { UD_Imov, O_C, O_R, O_NONE, P_rexr|P_rexw|P_rexb }, + /* 0132 */ { UD_Imov, O_D, O_R, O_NONE, P_rexr|P_rexw|P_rexb }, + /* 0133 */ { UD_Imovaps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0134 */ { UD_Imovapd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0135 */ { UD_Imovaps, O_W, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0136 */ { UD_Imovapd, O_W, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0137 */ { UD_Icvtpi2ps, O_V, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0138 */ { UD_Icvtsi2sd, O_V, O_Ey, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0139 */ { UD_Icvtsi2ss, O_V, O_Ey, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0140 */ { UD_Icvtpi2pd, O_V, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0141 */ { UD_Imovntps, O_M, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0142 */ { UD_Imovntpd, O_M, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0143 */ { UD_Icvttps2pi, O_P, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0144 */ { UD_Icvttsd2si, O_Gy, O_W, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0145 */ { UD_Icvttss2si, O_Gy, O_W, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0146 */ { UD_Icvttpd2pi, O_P, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0147 */ { UD_Icvtps2pi, O_P, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0148 */ { UD_Icvtsd2si, O_Gy, O_W, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0149 */ { UD_Icvtss2si, O_Gy, O_W, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0150 */ { UD_Icvtpd2pi, O_P, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0151 */ { UD_Iucomiss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0152 */ { UD_Iucomisd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0153 */ { UD_Icomiss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0154 */ { UD_Icomisd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0155 */ { UD_Iwrmsr, O_NONE, O_NONE, O_NONE, P_none }, + /* 0156 */ { UD_Irdtsc, O_NONE, O_NONE, O_NONE, P_none }, + /* 0157 */ { UD_Irdmsr, O_NONE, O_NONE, O_NONE, P_none }, + /* 0158 */ { UD_Irdpmc, O_NONE, O_NONE, O_NONE, P_none }, + /* 0159 */ { UD_Isysenter, O_NONE, O_NONE, O_NONE, P_none }, + /* 0160 */ { UD_Isysenter, O_NONE, O_NONE, O_NONE, P_none }, + /* 0161 */ { UD_Isysexit, O_NONE, O_NONE, O_NONE, P_none }, + /* 0162 */ { UD_Isysexit, O_NONE, O_NONE, O_NONE, P_none }, + /* 0163 */ { UD_Igetsec, O_NONE, O_NONE, O_NONE, P_none }, + /* 0164 */ { UD_Ipshufb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0165 */ { UD_Ipshufb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0166 */ { UD_Iphaddw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0167 */ { UD_Iphaddw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0168 */ { UD_Iphaddd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0169 */ { UD_Iphaddd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0170 */ { UD_Iphaddsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0171 */ { UD_Iphaddsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0172 */ { UD_Ipmaddubsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0173 */ { UD_Ipmaddubsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0174 */ { UD_Iphsubw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0175 */ { UD_Iphsubw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0176 */ { UD_Iphsubd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0177 */ { UD_Iphsubd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0178 */ { UD_Iphsubsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0179 */ { UD_Iphsubsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0180 */ { UD_Ipsignb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0181 */ { UD_Ipsignb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0182 */ { UD_Ipsignw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0183 */ { UD_Ipsignw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0184 */ { UD_Ipsignd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0185 */ { UD_Ipsignd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0186 */ { UD_Ipmulhrsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0187 */ { UD_Ipmulhrsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0188 */ { UD_Ipblendvb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0189 */ { UD_Iblendvps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0190 */ { UD_Iblendvpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0191 */ { UD_Iptest, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0192 */ { UD_Ipabsb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0193 */ { UD_Ipabsb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0194 */ { UD_Ipabsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0195 */ { UD_Ipabsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0196 */ { UD_Ipabsd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0197 */ { UD_Ipabsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0198 */ { UD_Ipmovsxbw, O_V, O_MqU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0199 */ { UD_Ipmovsxbd, O_V, O_MdU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0200 */ { UD_Ipmovsxbq, O_V, O_MwU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0201 */ { UD_Ipmovsxwd, O_V, O_MqU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0202 */ { UD_Ipmovsxwq, O_V, O_MdU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0203 */ { UD_Ipmovsxdq, O_V, O_MqU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0204 */ { UD_Ipmuldq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0205 */ { UD_Ipcmpeqq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0206 */ { UD_Imovntdqa, O_V, O_Mo, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0207 */ { UD_Ipackusdw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0208 */ { UD_Ipmovzxbw, O_V, O_MqU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0209 */ { UD_Ipmovzxbd, O_V, O_MdU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0210 */ { UD_Ipmovzxbq, O_V, O_MwU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0211 */ { UD_Ipmovzxwd, O_V, O_MqU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0212 */ { UD_Ipmovzxwq, O_V, O_MdU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0213 */ { UD_Ipmovzxdq, O_V, O_MqU, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0214 */ { UD_Ipcmpgtq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0215 */ { UD_Ipminsb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0216 */ { UD_Ipminsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0217 */ { UD_Ipminuw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0218 */ { UD_Ipminud, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0219 */ { UD_Ipmaxsb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0220 */ { UD_Ipmaxsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0221 */ { UD_Ipmaxuw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0222 */ { UD_Ipmaxud, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0223 */ { UD_Ipmulld, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0224 */ { UD_Iphminposuw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0225 */ { UD_Iinvept, O_Gq, O_Mo, O_NONE, P_none }, + /* 0226 */ { UD_Iinvvpid, O_Gq, O_Mo, O_NONE, P_none }, + /* 0227 */ { UD_Iaesimc, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0228 */ { UD_Iaesenc, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0229 */ { UD_Iaesenclast, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0230 */ { UD_Iaesdec, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0231 */ { UD_Iaesdeclast, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0232 */ { UD_Imovbe, O_Gv, O_Mv, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0233 */ { UD_Icrc32, O_Gy, O_Eb, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0234 */ { UD_Imovbe, O_Mv, O_Gv, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0235 */ { UD_Icrc32, O_Gy, O_Ev, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0236 */ { UD_Iroundps, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0237 */ { UD_Iroundpd, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0238 */ { UD_Iroundss, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0239 */ { UD_Iroundsd, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0240 */ { UD_Iblendps, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0241 */ { UD_Iblendpd, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0242 */ { UD_Ipblendw, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0243 */ { UD_Ipalignr, O_P, O_Q, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0244 */ { UD_Ipalignr, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0245 */ { UD_Ipextrb, O_MbRv, O_V, O_Ib, P_aso|P_rexx|P_rexr|P_rexb|P_def64 }, + /* 0246 */ { UD_Ipextrw, O_MwRd, O_V, O_Ib, P_aso|P_rexx|P_rexr|P_rexb }, + /* 0247 */ { UD_Ipextrd, O_Ed, O_V, O_Ib, P_aso|P_rexr|P_rexx|P_rexw|P_rexb }, + /* 0248 */ { UD_Ipextrd, O_Ed, O_V, O_Ib, P_aso|P_rexr|P_rexx|P_rexw|P_rexb }, + /* 0249 */ { UD_Ipextrq, O_Eq, O_V, O_Ib, P_aso|P_rexr|P_rexw|P_rexb|P_def64 }, + /* 0250 */ { UD_Iextractps, O_MdRy, O_V, O_Ib, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0251 */ { UD_Ipinsrb, O_V, O_MbRd, O_Ib, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0252 */ { UD_Iinsertps, O_V, O_Md, O_Ib, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0253 */ { UD_Ipinsrd, O_V, O_Ed, O_Ib, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0254 */ { UD_Ipinsrd, O_V, O_Ed, O_Ib, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0255 */ { UD_Ipinsrq, O_V, O_Eq, O_Ib, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0256 */ { UD_Idpps, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0257 */ { UD_Idppd, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0258 */ { UD_Impsadbw, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0259 */ { UD_Ipclmulqdq, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0260 */ { UD_Ipcmpestrm, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0261 */ { UD_Ipcmpestri, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0262 */ { UD_Ipcmpistrm, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0263 */ { UD_Ipcmpistri, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0264 */ { UD_Iaeskeygenassist, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0265 */ { UD_Icmovo, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0266 */ { UD_Icmovno, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0267 */ { UD_Icmovb, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0268 */ { UD_Icmovae, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0269 */ { UD_Icmovz, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0270 */ { UD_Icmovnz, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0271 */ { UD_Icmovbe, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0272 */ { UD_Icmova, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0273 */ { UD_Icmovs, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0274 */ { UD_Icmovns, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0275 */ { UD_Icmovp, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0276 */ { UD_Icmovnp, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0277 */ { UD_Icmovl, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0278 */ { UD_Icmovge, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0279 */ { UD_Icmovle, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0280 */ { UD_Icmovg, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0281 */ { UD_Imovmskps, O_Gd, O_U, O_NONE, P_oso|P_rexr|P_rexb }, + /* 0282 */ { UD_Imovmskpd, O_Gd, O_U, O_NONE, P_oso|P_rexr|P_rexb }, + /* 0283 */ { UD_Isqrtps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0284 */ { UD_Isqrtsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0285 */ { UD_Isqrtss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0286 */ { UD_Isqrtpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0287 */ { UD_Irsqrtps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0288 */ { UD_Irsqrtss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0289 */ { UD_Ircpps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0290 */ { UD_Ircpss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0291 */ { UD_Iandps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0292 */ { UD_Iandpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0293 */ { UD_Iandnps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0294 */ { UD_Iandnpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0295 */ { UD_Iorps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0296 */ { UD_Iorpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0297 */ { UD_Ixorps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0298 */ { UD_Ixorpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0299 */ { UD_Iaddps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0300 */ { UD_Iaddsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0301 */ { UD_Iaddss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0302 */ { UD_Iaddpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0303 */ { UD_Imulps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0304 */ { UD_Imulsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0305 */ { UD_Imulss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0306 */ { UD_Imulpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0307 */ { UD_Icvtps2pd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0308 */ { UD_Icvtsd2ss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0309 */ { UD_Icvtss2sd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0310 */ { UD_Icvtpd2ps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0311 */ { UD_Icvtdq2ps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0312 */ { UD_Icvttps2dq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0313 */ { UD_Icvtps2dq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0314 */ { UD_Isubps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0315 */ { UD_Isubsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0316 */ { UD_Isubss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0317 */ { UD_Isubpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0318 */ { UD_Iminps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0319 */ { UD_Iminsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0320 */ { UD_Iminss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0321 */ { UD_Iminpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0322 */ { UD_Idivps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0323 */ { UD_Idivsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0324 */ { UD_Idivss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0325 */ { UD_Idivpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0326 */ { UD_Imaxps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0327 */ { UD_Imaxsd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0328 */ { UD_Imaxss, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0329 */ { UD_Imaxpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0330 */ { UD_Ipunpcklbw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0331 */ { UD_Ipunpcklbw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0332 */ { UD_Ipunpcklwd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0333 */ { UD_Ipunpcklwd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0334 */ { UD_Ipunpckldq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0335 */ { UD_Ipunpckldq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0336 */ { UD_Ipacksswb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0337 */ { UD_Ipacksswb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0338 */ { UD_Ipcmpgtb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0339 */ { UD_Ipcmpgtb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0340 */ { UD_Ipcmpgtw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0341 */ { UD_Ipcmpgtw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0342 */ { UD_Ipcmpgtd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0343 */ { UD_Ipcmpgtd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0344 */ { UD_Ipackuswb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0345 */ { UD_Ipackuswb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0346 */ { UD_Ipunpckhbw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0347 */ { UD_Ipunpckhbw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0348 */ { UD_Ipunpckhwd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0349 */ { UD_Ipunpckhwd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0350 */ { UD_Ipunpckhdq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0351 */ { UD_Ipunpckhdq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0352 */ { UD_Ipackssdw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0353 */ { UD_Ipackssdw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0354 */ { UD_Ipunpcklqdq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0355 */ { UD_Ipunpckhqdq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0356 */ { UD_Imovd, O_P, O_Ey, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0357 */ { UD_Imovd, O_V, O_Ey, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0358 */ { UD_Imovq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0359 */ { UD_Imovdqu, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0360 */ { UD_Imovdqa, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0361 */ { UD_Ipshufw, O_P, O_Q, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0362 */ { UD_Ipshuflw, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0363 */ { UD_Ipshufhw, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0364 */ { UD_Ipshufd, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0365 */ { UD_Ipsrlw, O_N, O_Ib, O_NONE, P_none }, + /* 0366 */ { UD_Ipsrlw, O_U, O_Ib, O_NONE, P_rexb }, + /* 0367 */ { UD_Ipsraw, O_N, O_Ib, O_NONE, P_none }, + /* 0368 */ { UD_Ipsraw, O_U, O_Ib, O_NONE, P_rexb }, + /* 0369 */ { UD_Ipsllw, O_N, O_Ib, O_NONE, P_none }, + /* 0370 */ { UD_Ipsllw, O_U, O_Ib, O_NONE, P_rexb }, + /* 0371 */ { UD_Ipsrld, O_N, O_Ib, O_NONE, P_none }, + /* 0372 */ { UD_Ipsrld, O_U, O_Ib, O_NONE, P_rexb }, + /* 0373 */ { UD_Ipsrad, O_N, O_Ib, O_NONE, P_none }, + /* 0374 */ { UD_Ipsrad, O_U, O_Ib, O_NONE, P_rexb }, + /* 0375 */ { UD_Ipslld, O_N, O_Ib, O_NONE, P_none }, + /* 0376 */ { UD_Ipslld, O_U, O_Ib, O_NONE, P_rexb }, + /* 0377 */ { UD_Ipsrlq, O_N, O_Ib, O_NONE, P_none }, + /* 0378 */ { UD_Ipsrlq, O_U, O_Ib, O_NONE, P_rexb }, + /* 0379 */ { UD_Ipsrldq, O_U, O_Ib, O_NONE, P_rexb }, + /* 0380 */ { UD_Ipsllq, O_N, O_Ib, O_NONE, P_none }, + /* 0381 */ { UD_Ipsllq, O_U, O_Ib, O_NONE, P_rexb }, + /* 0382 */ { UD_Ipslldq, O_U, O_Ib, O_NONE, P_rexb }, + /* 0383 */ { UD_Ipcmpeqb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0384 */ { UD_Ipcmpeqb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0385 */ { UD_Ipcmpeqw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0386 */ { UD_Ipcmpeqw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0387 */ { UD_Ipcmpeqd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0388 */ { UD_Ipcmpeqd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0389 */ { UD_Iemms, O_NONE, O_NONE, O_NONE, P_none }, + /* 0390 */ { UD_Ivmread, O_Ey, O_Gy, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_def64 }, + /* 0391 */ { UD_Ivmwrite, O_Gy, O_Ey, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_def64 }, + /* 0392 */ { UD_Ihaddps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0393 */ { UD_Ihaddpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0394 */ { UD_Ihsubps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0395 */ { UD_Ihsubpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0396 */ { UD_Imovd, O_Ey, O_P, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0397 */ { UD_Imovq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0398 */ { UD_Imovd, O_Ey, O_V, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0399 */ { UD_Imovq, O_Q, O_P, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0400 */ { UD_Imovdqu, O_W, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0401 */ { UD_Imovdqa, O_W, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0402 */ { UD_Ijo, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0403 */ { UD_Ijno, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0404 */ { UD_Ijb, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0405 */ { UD_Ijae, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0406 */ { UD_Ijz, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0407 */ { UD_Ijnz, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0408 */ { UD_Ijbe, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0409 */ { UD_Ija, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0410 */ { UD_Ijs, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0411 */ { UD_Ijns, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0412 */ { UD_Ijp, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0413 */ { UD_Ijnp, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0414 */ { UD_Ijl, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0415 */ { UD_Ijge, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0416 */ { UD_Ijle, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0417 */ { UD_Ijg, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0418 */ { UD_Iseto, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0419 */ { UD_Isetno, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0420 */ { UD_Isetb, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0421 */ { UD_Isetae, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0422 */ { UD_Isetz, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0423 */ { UD_Isetnz, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0424 */ { UD_Isetbe, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0425 */ { UD_Iseta, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0426 */ { UD_Isets, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0427 */ { UD_Isetns, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0428 */ { UD_Isetp, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0429 */ { UD_Isetnp, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0430 */ { UD_Isetl, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0431 */ { UD_Isetge, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0432 */ { UD_Isetle, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0433 */ { UD_Isetg, O_Eb, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0434 */ { UD_Ipush, O_FS, O_NONE, O_NONE, P_none }, + /* 0435 */ { UD_Ipop, O_FS, O_NONE, O_NONE, P_none }, + /* 0436 */ { UD_Icpuid, O_NONE, O_NONE, O_NONE, P_none }, + /* 0437 */ { UD_Ibt, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0438 */ { UD_Ishld, O_Ev, O_Gv, O_Ib, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0439 */ { UD_Ishld, O_Ev, O_Gv, O_CL, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0440 */ { UD_Imontmul, O_NONE, O_NONE, O_NONE, P_none }, + /* 0441 */ { UD_Ixsha1, O_NONE, O_NONE, O_NONE, P_none }, + /* 0442 */ { UD_Ixsha256, O_NONE, O_NONE, O_NONE, P_none }, + /* 0443 */ { UD_Ixstore, O_NONE, O_NONE, O_NONE, P_none }, + /* 0444 */ { UD_Ixcryptecb, O_NONE, O_NONE, O_NONE, P_none }, + /* 0445 */ { UD_Ixcryptcbc, O_NONE, O_NONE, O_NONE, P_none }, + /* 0446 */ { UD_Ixcryptctr, O_NONE, O_NONE, O_NONE, P_none }, + /* 0447 */ { UD_Ixcryptcfb, O_NONE, O_NONE, O_NONE, P_none }, + /* 0448 */ { UD_Ixcryptofb, O_NONE, O_NONE, O_NONE, P_none }, + /* 0449 */ { UD_Ipush, O_GS, O_NONE, O_NONE, P_none }, + /* 0450 */ { UD_Ipop, O_GS, O_NONE, O_NONE, P_none }, + /* 0451 */ { UD_Irsm, O_NONE, O_NONE, O_NONE, P_none }, + /* 0452 */ { UD_Ibts, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0453 */ { UD_Ishrd, O_Ev, O_Gv, O_Ib, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0454 */ { UD_Ishrd, O_Ev, O_Gv, O_CL, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0455 */ { UD_Ifxsave, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0456 */ { UD_Ifxrstor, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0457 */ { UD_Ildmxcsr, O_Md, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0458 */ { UD_Istmxcsr, O_Md, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0459 */ { UD_Ixsave, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0460 */ { UD_Ixrstor, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0461 */ { UD_Iclflush, O_M, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0462 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0463 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0464 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0465 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0466 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0467 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0468 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0469 */ { UD_Ilfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0470 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0471 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0472 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0473 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0474 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0475 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0476 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0477 */ { UD_Imfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0478 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0479 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0480 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0481 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0482 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0483 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0484 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0485 */ { UD_Isfence, O_NONE, O_NONE, O_NONE, P_none }, + /* 0486 */ { UD_Iimul, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0487 */ { UD_Icmpxchg, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0488 */ { UD_Icmpxchg, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0489 */ { UD_Ilss, O_Gv, O_M, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0490 */ { UD_Ibtr, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0491 */ { UD_Ilfs, O_Gz, O_M, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0492 */ { UD_Ilgs, O_Gz, O_M, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0493 */ { UD_Imovzx, O_Gv, O_Eb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0494 */ { UD_Imovzx, O_Gy, O_Ew, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0495 */ { UD_Ipopcnt, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexr|P_rexw|P_rexx|P_rexb }, + /* 0496 */ { UD_Ibt, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0497 */ { UD_Ibts, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0498 */ { UD_Ibtr, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0499 */ { UD_Ibtc, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0500 */ { UD_Ibtc, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0501 */ { UD_Ibsf, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0502 */ { UD_Ibsr, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0503 */ { UD_Imovsx, O_Gv, O_Eb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0504 */ { UD_Imovsx, O_Gy, O_Ew, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0505 */ { UD_Ixadd, O_Eb, O_Gb, O_NONE, P_aso|P_oso|P_rexr|P_rexx|P_rexb }, + /* 0506 */ { UD_Ixadd, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0507 */ { UD_Icmpps, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0508 */ { UD_Icmpsd, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0509 */ { UD_Icmpss, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0510 */ { UD_Icmppd, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0511 */ { UD_Imovnti, O_M, O_Gy, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0512 */ { UD_Ipinsrw, O_P, O_MwRy, O_Ib, P_aso|P_rexw|P_rexr|P_rexx|P_rexb|P_def64 }, + /* 0513 */ { UD_Ipinsrw, O_V, O_MwRy, O_Ib, P_aso|P_rexw|P_rexr|P_rexx|P_rexb|P_def64 }, + /* 0514 */ { UD_Ipextrw, O_Gd, O_N, O_Ib, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0515 */ { UD_Ipextrw, O_Gd, O_U, O_Ib, P_aso|P_rexr|P_rexb }, + /* 0516 */ { UD_Ishufps, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0517 */ { UD_Ishufpd, O_V, O_W, O_Ib, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0518 */ { UD_Icmpxchg8b, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0519 */ { UD_Icmpxchg8b, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0520 */ { UD_Icmpxchg16b, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0521 */ { UD_Ivmptrld, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0522 */ { UD_Ivmxon, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0523 */ { UD_Ivmclear, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0524 */ { UD_Ivmptrst, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0525 */ { UD_Ibswap, O_R0y, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0526 */ { UD_Ibswap, O_R1y, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0527 */ { UD_Ibswap, O_R2y, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0528 */ { UD_Ibswap, O_R3y, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0529 */ { UD_Ibswap, O_R4y, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0530 */ { UD_Ibswap, O_R5y, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0531 */ { UD_Ibswap, O_R6y, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0532 */ { UD_Ibswap, O_R7y, O_NONE, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0533 */ { UD_Iaddsubps, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0534 */ { UD_Iaddsubpd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0535 */ { UD_Ipsrlw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0536 */ { UD_Ipsrlw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0537 */ { UD_Ipsrld, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0538 */ { UD_Ipsrld, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0539 */ { UD_Ipsrlq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0540 */ { UD_Ipsrlq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0541 */ { UD_Ipaddq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0542 */ { UD_Ipaddq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0543 */ { UD_Ipmullw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0544 */ { UD_Ipmullw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0545 */ { UD_Imovdq2q, O_P, O_U, O_NONE, P_aso|P_rexb }, + /* 0546 */ { UD_Imovq2dq, O_V, O_N, O_NONE, P_aso|P_rexr }, + /* 0547 */ { UD_Imovq, O_W, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0548 */ { UD_Ipmovmskb, O_Gd, O_N, O_NONE, P_oso|P_rexr|P_rexb }, + /* 0549 */ { UD_Ipmovmskb, O_Gd, O_U, O_NONE, P_rexr|P_rexb }, + /* 0550 */ { UD_Ipsubusb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0551 */ { UD_Ipsubusb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0552 */ { UD_Ipsubusw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0553 */ { UD_Ipsubusw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0554 */ { UD_Ipminub, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0555 */ { UD_Ipminub, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0556 */ { UD_Ipand, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0557 */ { UD_Ipand, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0558 */ { UD_Ipaddusb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0559 */ { UD_Ipaddusb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0560 */ { UD_Ipaddusw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0561 */ { UD_Ipaddusw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0562 */ { UD_Ipmaxub, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0563 */ { UD_Ipmaxub, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0564 */ { UD_Ipandn, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0565 */ { UD_Ipandn, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0566 */ { UD_Ipavgb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0567 */ { UD_Ipavgb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0568 */ { UD_Ipsraw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0569 */ { UD_Ipsraw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0570 */ { UD_Ipsrad, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0571 */ { UD_Ipsrad, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0572 */ { UD_Ipavgw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0573 */ { UD_Ipavgw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0574 */ { UD_Ipmulhuw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0575 */ { UD_Ipmulhuw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0576 */ { UD_Ipmulhw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0577 */ { UD_Ipmulhw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0578 */ { UD_Icvtpd2dq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0579 */ { UD_Icvtdq2pd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0580 */ { UD_Icvttpd2dq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0581 */ { UD_Imovntq, O_M, O_P, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0582 */ { UD_Imovntdq, O_M, O_V, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0583 */ { UD_Ipsubsb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0584 */ { UD_Ipsubsb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0585 */ { UD_Ipsubsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0586 */ { UD_Ipsubsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0587 */ { UD_Ipminsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0588 */ { UD_Ipminsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0589 */ { UD_Ipor, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0590 */ { UD_Ipor, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0591 */ { UD_Ipaddsb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0592 */ { UD_Ipaddsb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0593 */ { UD_Ipaddsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0594 */ { UD_Ipaddsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0595 */ { UD_Ipmaxsw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0596 */ { UD_Ipmaxsw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0597 */ { UD_Ipxor, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0598 */ { UD_Ipxor, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0599 */ { UD_Ilddqu, O_V, O_M, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0600 */ { UD_Ipsllw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0601 */ { UD_Ipsllw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0602 */ { UD_Ipslld, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0603 */ { UD_Ipslld, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0604 */ { UD_Ipsllq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0605 */ { UD_Ipsllq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0606 */ { UD_Ipmuludq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0607 */ { UD_Ipmuludq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0608 */ { UD_Ipmaddwd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0609 */ { UD_Ipmaddwd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0610 */ { UD_Ipsadbw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0611 */ { UD_Ipsadbw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0612 */ { UD_Imaskmovq, O_P, O_N, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0613 */ { UD_Imaskmovdqu, O_V, O_U, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0614 */ { UD_Ipsubb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0615 */ { UD_Ipsubb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0616 */ { UD_Ipsubw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0617 */ { UD_Ipsubw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0618 */ { UD_Ipsubd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0619 */ { UD_Ipsubd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0620 */ { UD_Ipsubq, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0621 */ { UD_Ipsubq, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0622 */ { UD_Ipaddb, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0623 */ { UD_Ipaddb, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0624 */ { UD_Ipaddw, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0625 */ { UD_Ipaddw, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0626 */ { UD_Ipaddd, O_P, O_Q, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0627 */ { UD_Ipaddd, O_V, O_W, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0628 */ { UD_Iadc, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0629 */ { UD_Iadc, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0630 */ { UD_Iadc, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0631 */ { UD_Iadc, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0632 */ { UD_Iadc, O_AL, O_Ib, O_NONE, P_none }, + /* 0633 */ { UD_Iadc, O_rAX, O_sIz, O_NONE, P_oso|P_rexw }, + /* 0634 */ { UD_Ipush, O_SS, O_NONE, O_NONE, P_inv64 }, + /* 0635 */ { UD_Ipop, O_SS, O_NONE, O_NONE, P_inv64 }, + /* 0636 */ { UD_Isbb, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0637 */ { UD_Isbb, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0638 */ { UD_Isbb, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0639 */ { UD_Isbb, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0640 */ { UD_Isbb, O_AL, O_Ib, O_NONE, P_none }, + /* 0641 */ { UD_Isbb, O_rAX, O_sIz, O_NONE, P_oso|P_rexw }, + /* 0642 */ { UD_Ipush, O_DS, O_NONE, O_NONE, P_inv64 }, + /* 0643 */ { UD_Ipop, O_DS, O_NONE, O_NONE, P_inv64 }, + /* 0644 */ { UD_Iand, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0645 */ { UD_Iand, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0646 */ { UD_Iand, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0647 */ { UD_Iand, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0648 */ { UD_Iand, O_AL, O_Ib, O_NONE, P_none }, + /* 0649 */ { UD_Iand, O_rAX, O_sIz, O_NONE, P_oso|P_rexw }, + /* 0650 */ { UD_Idaa, O_NONE, O_NONE, O_NONE, P_inv64 }, + /* 0651 */ { UD_Isub, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0652 */ { UD_Isub, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0653 */ { UD_Isub, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0654 */ { UD_Isub, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0655 */ { UD_Isub, O_AL, O_Ib, O_NONE, P_none }, + /* 0656 */ { UD_Isub, O_rAX, O_sIz, O_NONE, P_oso|P_rexw }, + /* 0657 */ { UD_Idas, O_NONE, O_NONE, O_NONE, P_inv64 }, + /* 0658 */ { UD_Ixor, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0659 */ { UD_Ixor, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0660 */ { UD_Ixor, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0661 */ { UD_Ixor, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0662 */ { UD_Ixor, O_AL, O_Ib, O_NONE, P_none }, + /* 0663 */ { UD_Ixor, O_rAX, O_sIz, O_NONE, P_oso|P_rexw }, + /* 0664 */ { UD_Iaaa, O_NONE, O_NONE, O_NONE, P_none }, + /* 0665 */ { UD_Icmp, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0666 */ { UD_Icmp, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0667 */ { UD_Icmp, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0668 */ { UD_Icmp, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0669 */ { UD_Icmp, O_AL, O_Ib, O_NONE, P_none }, + /* 0670 */ { UD_Icmp, O_rAX, O_sIz, O_NONE, P_oso|P_rexw }, + /* 0671 */ { UD_Iaas, O_NONE, O_NONE, O_NONE, P_none }, + /* 0672 */ { UD_Iinc, O_R0z, O_NONE, O_NONE, P_oso }, + /* 0673 */ { UD_Iinc, O_R1z, O_NONE, O_NONE, P_oso }, + /* 0674 */ { UD_Iinc, O_R2z, O_NONE, O_NONE, P_oso }, + /* 0675 */ { UD_Iinc, O_R3z, O_NONE, O_NONE, P_oso }, + /* 0676 */ { UD_Iinc, O_R4z, O_NONE, O_NONE, P_oso }, + /* 0677 */ { UD_Iinc, O_R5z, O_NONE, O_NONE, P_oso }, + /* 0678 */ { UD_Iinc, O_R6z, O_NONE, O_NONE, P_oso }, + /* 0679 */ { UD_Iinc, O_R7z, O_NONE, O_NONE, P_oso }, + /* 0680 */ { UD_Idec, O_R0z, O_NONE, O_NONE, P_oso }, + /* 0681 */ { UD_Idec, O_R1z, O_NONE, O_NONE, P_oso }, + /* 0682 */ { UD_Idec, O_R2z, O_NONE, O_NONE, P_oso }, + /* 0683 */ { UD_Idec, O_R3z, O_NONE, O_NONE, P_oso }, + /* 0684 */ { UD_Idec, O_R4z, O_NONE, O_NONE, P_oso }, + /* 0685 */ { UD_Idec, O_R5z, O_NONE, O_NONE, P_oso }, + /* 0686 */ { UD_Idec, O_R6z, O_NONE, O_NONE, P_oso }, + /* 0687 */ { UD_Idec, O_R7z, O_NONE, O_NONE, P_oso }, + /* 0688 */ { UD_Ipush, O_R0v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, + /* 0689 */ { UD_Ipush, O_R1v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, + /* 0690 */ { UD_Ipush, O_R2v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, + /* 0691 */ { UD_Ipush, O_R3v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, + /* 0692 */ { UD_Ipush, O_R4v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, + /* 0693 */ { UD_Ipush, O_R5v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, + /* 0694 */ { UD_Ipush, O_R6v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, + /* 0695 */ { UD_Ipush, O_R7v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, + /* 0696 */ { UD_Ipop, O_R0v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, + /* 0697 */ { UD_Ipop, O_R1v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, + /* 0698 */ { UD_Ipop, O_R2v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, + /* 0699 */ { UD_Ipop, O_R3v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, + /* 0700 */ { UD_Ipop, O_R4v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, + /* 0701 */ { UD_Ipop, O_R5v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, + /* 0702 */ { UD_Ipop, O_R6v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, + /* 0703 */ { UD_Ipop, O_R7v, O_NONE, O_NONE, P_oso|P_rexb|P_def64 }, + /* 0704 */ { UD_Ipusha, O_NONE, O_NONE, O_NONE, P_oso|P_inv64 }, + /* 0705 */ { UD_Ipushad, O_NONE, O_NONE, O_NONE, P_oso|P_inv64 }, + /* 0706 */ { UD_Ipopa, O_NONE, O_NONE, O_NONE, P_oso|P_inv64 }, + /* 0707 */ { UD_Ipopad, O_NONE, O_NONE, O_NONE, P_oso|P_inv64 }, + /* 0708 */ { UD_Ibound, O_Gv, O_M, O_NONE, P_aso|P_oso }, + /* 0709 */ { UD_Iarpl, O_Ew, O_Gw, O_NONE, P_aso }, + /* 0710 */ { UD_Imovsxd, O_Gq, O_Ed, O_NONE, P_aso|P_oso|P_rexw|P_rexx|P_rexr|P_rexb }, + /* 0711 */ { UD_Ipush, O_sIz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0712 */ { UD_Iimul, O_Gv, O_Ev, O_Iz, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0713 */ { UD_Ipush, O_sIb, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0714 */ { UD_Iimul, O_Gv, O_Ev, O_sIb, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0715 */ { UD_Iinsb, O_NONE, O_NONE, O_NONE, P_str|P_seg }, + /* 0716 */ { UD_Iinsw, O_NONE, O_NONE, O_NONE, P_str|P_oso|P_seg }, + /* 0717 */ { UD_Iinsd, O_NONE, O_NONE, O_NONE, P_str|P_oso|P_seg }, + /* 0718 */ { UD_Ioutsb, O_NONE, O_NONE, O_NONE, P_str|P_seg }, + /* 0719 */ { UD_Ioutsw, O_NONE, O_NONE, O_NONE, P_str|P_oso|P_seg }, + /* 0720 */ { UD_Ioutsd, O_NONE, O_NONE, O_NONE, P_str|P_oso|P_seg }, + /* 0721 */ { UD_Ijo, O_Jb, O_NONE, O_NONE, P_none }, + /* 0722 */ { UD_Ijno, O_Jb, O_NONE, O_NONE, P_none }, + /* 0723 */ { UD_Ijb, O_Jb, O_NONE, O_NONE, P_none }, + /* 0724 */ { UD_Ijae, O_Jb, O_NONE, O_NONE, P_none }, + /* 0725 */ { UD_Ijz, O_Jb, O_NONE, O_NONE, P_none }, + /* 0726 */ { UD_Ijnz, O_Jb, O_NONE, O_NONE, P_none }, + /* 0727 */ { UD_Ijbe, O_Jb, O_NONE, O_NONE, P_none }, + /* 0728 */ { UD_Ija, O_Jb, O_NONE, O_NONE, P_none }, + /* 0729 */ { UD_Ijs, O_Jb, O_NONE, O_NONE, P_none }, + /* 0730 */ { UD_Ijns, O_Jb, O_NONE, O_NONE, P_none }, + /* 0731 */ { UD_Ijp, O_Jb, O_NONE, O_NONE, P_none }, + /* 0732 */ { UD_Ijnp, O_Jb, O_NONE, O_NONE, P_none }, + /* 0733 */ { UD_Ijl, O_Jb, O_NONE, O_NONE, P_none }, + /* 0734 */ { UD_Ijge, O_Jb, O_NONE, O_NONE, P_none }, + /* 0735 */ { UD_Ijle, O_Jb, O_NONE, O_NONE, P_none }, + /* 0736 */ { UD_Ijg, O_Jb, O_NONE, O_NONE, P_none }, + /* 0737 */ { UD_Iadd, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0738 */ { UD_Ior, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0739 */ { UD_Iadc, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0740 */ { UD_Isbb, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0741 */ { UD_Iand, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0742 */ { UD_Isub, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0743 */ { UD_Ixor, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0744 */ { UD_Icmp, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0745 */ { UD_Iadd, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0746 */ { UD_Ior, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0747 */ { UD_Iadc, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0748 */ { UD_Isbb, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0749 */ { UD_Iand, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0750 */ { UD_Isub, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0751 */ { UD_Ixor, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0752 */ { UD_Icmp, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0753 */ { UD_Iadd, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 }, + /* 0754 */ { UD_Ior, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0755 */ { UD_Iadc, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 }, + /* 0756 */ { UD_Isbb, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 }, + /* 0757 */ { UD_Iand, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 }, + /* 0758 */ { UD_Isub, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 }, + /* 0759 */ { UD_Ixor, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 }, + /* 0760 */ { UD_Icmp, O_Eb, O_Ib, O_NONE, P_aso|P_rexr|P_rexx|P_rexb|P_inv64 }, + /* 0761 */ { UD_Iadd, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0762 */ { UD_Ior, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0763 */ { UD_Iadc, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0764 */ { UD_Isbb, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0765 */ { UD_Iand, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0766 */ { UD_Isub, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0767 */ { UD_Ixor, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0768 */ { UD_Icmp, O_Ev, O_sIb, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0769 */ { UD_Itest, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0770 */ { UD_Itest, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0771 */ { UD_Ixchg, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0772 */ { UD_Ixchg, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0773 */ { UD_Imov, O_Eb, O_Gb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0774 */ { UD_Imov, O_Ev, O_Gv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0775 */ { UD_Imov, O_Gb, O_Eb, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0776 */ { UD_Imov, O_Gv, O_Ev, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0777 */ { UD_Imov, O_MwRv, O_S, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0778 */ { UD_Ilea, O_Gv, O_M, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0779 */ { UD_Imov, O_S, O_MwRv, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0780 */ { UD_Ipop, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb|P_def64 }, + /* 0781 */ { UD_Ixchg, O_R0v, O_rAX, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0782 */ { UD_Ixchg, O_R1v, O_rAX, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0783 */ { UD_Ixchg, O_R2v, O_rAX, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0784 */ { UD_Ixchg, O_R3v, O_rAX, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0785 */ { UD_Ixchg, O_R4v, O_rAX, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0786 */ { UD_Ixchg, O_R5v, O_rAX, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0787 */ { UD_Ixchg, O_R6v, O_rAX, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0788 */ { UD_Ixchg, O_R7v, O_rAX, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0789 */ { UD_Icbw, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, + /* 0790 */ { UD_Icwde, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, + /* 0791 */ { UD_Icdqe, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, + /* 0792 */ { UD_Icwd, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, + /* 0793 */ { UD_Icdq, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, + /* 0794 */ { UD_Icqo, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, + /* 0795 */ { UD_Icall, O_Av, O_NONE, O_NONE, P_oso }, + /* 0796 */ { UD_Iwait, O_NONE, O_NONE, O_NONE, P_none }, + /* 0797 */ { UD_Ipushfw, O_NONE, O_NONE, O_NONE, P_oso }, + /* 0798 */ { UD_Ipushfw, O_NONE, O_NONE, O_NONE, P_oso|P_rexw|P_def64 }, + /* 0799 */ { UD_Ipushfd, O_NONE, O_NONE, O_NONE, P_oso }, + /* 0800 */ { UD_Ipushfq, O_NONE, O_NONE, O_NONE, P_oso|P_rexw|P_def64 }, + /* 0801 */ { UD_Ipushfq, O_NONE, O_NONE, O_NONE, P_oso|P_rexw|P_def64 }, + /* 0802 */ { UD_Ipopfw, O_NONE, O_NONE, O_NONE, P_oso }, + /* 0803 */ { UD_Ipopfd, O_NONE, O_NONE, O_NONE, P_oso }, + /* 0804 */ { UD_Ipopfq, O_NONE, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0805 */ { UD_Ipopfq, O_NONE, O_NONE, O_NONE, P_oso|P_def64 }, + /* 0806 */ { UD_Isahf, O_NONE, O_NONE, O_NONE, P_none }, + /* 0807 */ { UD_Ilahf, O_NONE, O_NONE, O_NONE, P_none }, + /* 0808 */ { UD_Imov, O_AL, O_Ob, O_NONE, P_none }, + /* 0809 */ { UD_Imov, O_rAX, O_Ov, O_NONE, P_aso|P_oso|P_rexw }, + /* 0810 */ { UD_Imov, O_Ob, O_AL, O_NONE, P_none }, + /* 0811 */ { UD_Imov, O_Ov, O_rAX, O_NONE, P_aso|P_oso|P_rexw }, + /* 0812 */ { UD_Imovsb, O_NONE, O_NONE, O_NONE, P_str|P_seg }, + /* 0813 */ { UD_Imovsw, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, + /* 0814 */ { UD_Imovsd, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, + /* 0815 */ { UD_Imovsq, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, + /* 0816 */ { UD_Icmpsb, O_NONE, O_NONE, O_NONE, P_strz|P_seg }, + /* 0817 */ { UD_Icmpsw, O_NONE, O_NONE, O_NONE, P_strz|P_oso|P_rexw|P_seg }, + /* 0818 */ { UD_Icmpsd, O_NONE, O_NONE, O_NONE, P_strz|P_oso|P_rexw|P_seg }, + /* 0819 */ { UD_Icmpsq, O_NONE, O_NONE, O_NONE, P_strz|P_oso|P_rexw|P_seg }, + /* 0820 */ { UD_Itest, O_AL, O_Ib, O_NONE, P_none }, + /* 0821 */ { UD_Itest, O_rAX, O_sIz, O_NONE, P_oso|P_rexw }, + /* 0822 */ { UD_Istosb, O_NONE, O_NONE, O_NONE, P_str|P_seg }, + /* 0823 */ { UD_Istosw, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, + /* 0824 */ { UD_Istosd, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, + /* 0825 */ { UD_Istosq, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, + /* 0826 */ { UD_Ilodsb, O_NONE, O_NONE, O_NONE, P_str|P_seg }, + /* 0827 */ { UD_Ilodsw, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, + /* 0828 */ { UD_Ilodsd, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, + /* 0829 */ { UD_Ilodsq, O_NONE, O_NONE, O_NONE, P_str|P_seg|P_oso|P_rexw }, + /* 0830 */ { UD_Iscasb, O_NONE, O_NONE, O_NONE, P_strz }, + /* 0831 */ { UD_Iscasw, O_NONE, O_NONE, O_NONE, P_strz|P_oso|P_rexw }, + /* 0832 */ { UD_Iscasd, O_NONE, O_NONE, O_NONE, P_strz|P_oso|P_rexw }, + /* 0833 */ { UD_Iscasq, O_NONE, O_NONE, O_NONE, P_strz|P_oso|P_rexw }, + /* 0834 */ { UD_Imov, O_R0b, O_Ib, O_NONE, P_rexb }, + /* 0835 */ { UD_Imov, O_R1b, O_Ib, O_NONE, P_rexb }, + /* 0836 */ { UD_Imov, O_R2b, O_Ib, O_NONE, P_rexb }, + /* 0837 */ { UD_Imov, O_R3b, O_Ib, O_NONE, P_rexb }, + /* 0838 */ { UD_Imov, O_R4b, O_Ib, O_NONE, P_rexb }, + /* 0839 */ { UD_Imov, O_R5b, O_Ib, O_NONE, P_rexb }, + /* 0840 */ { UD_Imov, O_R6b, O_Ib, O_NONE, P_rexb }, + /* 0841 */ { UD_Imov, O_R7b, O_Ib, O_NONE, P_rexb }, + /* 0842 */ { UD_Imov, O_R0v, O_Iv, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0843 */ { UD_Imov, O_R1v, O_Iv, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0844 */ { UD_Imov, O_R2v, O_Iv, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0845 */ { UD_Imov, O_R3v, O_Iv, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0846 */ { UD_Imov, O_R4v, O_Iv, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0847 */ { UD_Imov, O_R5v, O_Iv, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0848 */ { UD_Imov, O_R6v, O_Iv, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0849 */ { UD_Imov, O_R7v, O_Iv, O_NONE, P_oso|P_rexw|P_rexb }, + /* 0850 */ { UD_Irol, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0851 */ { UD_Iror, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0852 */ { UD_Ircl, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0853 */ { UD_Ircr, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0854 */ { UD_Ishl, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0855 */ { UD_Ishr, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0856 */ { UD_Ishl, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0857 */ { UD_Isar, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0858 */ { UD_Irol, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0859 */ { UD_Iror, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0860 */ { UD_Ircl, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0861 */ { UD_Ircr, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0862 */ { UD_Ishl, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0863 */ { UD_Ishr, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0864 */ { UD_Ishl, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0865 */ { UD_Isar, O_Ev, O_Ib, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0866 */ { UD_Iret, O_Iw, O_NONE, O_NONE, P_none }, + /* 0867 */ { UD_Iret, O_NONE, O_NONE, O_NONE, P_none }, + /* 0868 */ { UD_Iles, O_Gv, O_M, O_NONE, P_aso|P_oso }, + /* 0869 */ { UD_Ilds, O_Gv, O_M, O_NONE, P_aso|P_oso }, + /* 0870 */ { UD_Imov, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0871 */ { UD_Imov, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0872 */ { UD_Ienter, O_Iw, O_Ib, O_NONE, P_def64 }, + /* 0873 */ { UD_Ileave, O_NONE, O_NONE, O_NONE, P_none }, + /* 0874 */ { UD_Iretf, O_Iw, O_NONE, O_NONE, P_none }, + /* 0875 */ { UD_Iretf, O_NONE, O_NONE, O_NONE, P_none }, + /* 0876 */ { UD_Iint3, O_NONE, O_NONE, O_NONE, P_none }, + /* 0877 */ { UD_Iint, O_Ib, O_NONE, O_NONE, P_none }, + /* 0878 */ { UD_Iinto, O_NONE, O_NONE, O_NONE, P_inv64 }, + /* 0879 */ { UD_Iiretw, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, + /* 0880 */ { UD_Iiretd, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, + /* 0881 */ { UD_Iiretq, O_NONE, O_NONE, O_NONE, P_oso|P_rexw }, + /* 0882 */ { UD_Irol, O_Eb, O_I1, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0883 */ { UD_Iror, O_Eb, O_I1, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0884 */ { UD_Ircl, O_Eb, O_I1, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0885 */ { UD_Ircr, O_Eb, O_I1, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0886 */ { UD_Ishl, O_Eb, O_I1, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0887 */ { UD_Ishr, O_Eb, O_I1, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0888 */ { UD_Ishl, O_Eb, O_I1, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0889 */ { UD_Isar, O_Eb, O_I1, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0890 */ { UD_Irol, O_Ev, O_I1, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0891 */ { UD_Iror, O_Ev, O_I1, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0892 */ { UD_Ircl, O_Ev, O_I1, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0893 */ { UD_Ircr, O_Ev, O_I1, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0894 */ { UD_Ishl, O_Ev, O_I1, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0895 */ { UD_Ishr, O_Ev, O_I1, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0896 */ { UD_Ishl, O_Ev, O_I1, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0897 */ { UD_Isar, O_Ev, O_I1, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0898 */ { UD_Irol, O_Eb, O_CL, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0899 */ { UD_Iror, O_Eb, O_CL, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0900 */ { UD_Ircl, O_Eb, O_CL, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0901 */ { UD_Ircr, O_Eb, O_CL, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0902 */ { UD_Ishl, O_Eb, O_CL, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0903 */ { UD_Ishr, O_Eb, O_CL, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0904 */ { UD_Ishl, O_Eb, O_CL, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0905 */ { UD_Isar, O_Eb, O_CL, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0906 */ { UD_Irol, O_Ev, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0907 */ { UD_Iror, O_Ev, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0908 */ { UD_Ircl, O_Ev, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0909 */ { UD_Ircr, O_Ev, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0910 */ { UD_Ishl, O_Ev, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0911 */ { UD_Ishr, O_Ev, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0912 */ { UD_Ishl, O_Ev, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0913 */ { UD_Isar, O_Ev, O_CL, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 0914 */ { UD_Iaam, O_Ib, O_NONE, O_NONE, P_none }, + /* 0915 */ { UD_Iaad, O_Ib, O_NONE, O_NONE, P_none }, + /* 0916 */ { UD_Isalc, O_NONE, O_NONE, O_NONE, P_inv64 }, + /* 0917 */ { UD_Ixlatb, O_NONE, O_NONE, O_NONE, P_rexw|P_seg }, + /* 0918 */ { UD_Ifadd, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0919 */ { UD_Ifmul, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0920 */ { UD_Ifcom, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0921 */ { UD_Ifcomp, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0922 */ { UD_Ifsub, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0923 */ { UD_Ifsubr, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0924 */ { UD_Ifdiv, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0925 */ { UD_Ifdivr, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0926 */ { UD_Ifadd, O_ST0, O_ST0, O_NONE, P_none }, + /* 0927 */ { UD_Ifadd, O_ST0, O_ST1, O_NONE, P_none }, + /* 0928 */ { UD_Ifadd, O_ST0, O_ST2, O_NONE, P_none }, + /* 0929 */ { UD_Ifadd, O_ST0, O_ST3, O_NONE, P_none }, + /* 0930 */ { UD_Ifadd, O_ST0, O_ST4, O_NONE, P_none }, + /* 0931 */ { UD_Ifadd, O_ST0, O_ST5, O_NONE, P_none }, + /* 0932 */ { UD_Ifadd, O_ST0, O_ST6, O_NONE, P_none }, + /* 0933 */ { UD_Ifadd, O_ST0, O_ST7, O_NONE, P_none }, + /* 0934 */ { UD_Ifmul, O_ST0, O_ST0, O_NONE, P_none }, + /* 0935 */ { UD_Ifmul, O_ST0, O_ST1, O_NONE, P_none }, + /* 0936 */ { UD_Ifmul, O_ST0, O_ST2, O_NONE, P_none }, + /* 0937 */ { UD_Ifmul, O_ST0, O_ST3, O_NONE, P_none }, + /* 0938 */ { UD_Ifmul, O_ST0, O_ST4, O_NONE, P_none }, + /* 0939 */ { UD_Ifmul, O_ST0, O_ST5, O_NONE, P_none }, + /* 0940 */ { UD_Ifmul, O_ST0, O_ST6, O_NONE, P_none }, + /* 0941 */ { UD_Ifmul, O_ST0, O_ST7, O_NONE, P_none }, + /* 0942 */ { UD_Ifcom, O_ST0, O_ST0, O_NONE, P_none }, + /* 0943 */ { UD_Ifcom, O_ST0, O_ST1, O_NONE, P_none }, + /* 0944 */ { UD_Ifcom, O_ST0, O_ST2, O_NONE, P_none }, + /* 0945 */ { UD_Ifcom, O_ST0, O_ST3, O_NONE, P_none }, + /* 0946 */ { UD_Ifcom, O_ST0, O_ST4, O_NONE, P_none }, + /* 0947 */ { UD_Ifcom, O_ST0, O_ST5, O_NONE, P_none }, + /* 0948 */ { UD_Ifcom, O_ST0, O_ST6, O_NONE, P_none }, + /* 0949 */ { UD_Ifcom, O_ST0, O_ST7, O_NONE, P_none }, + /* 0950 */ { UD_Ifcomp, O_ST0, O_ST0, O_NONE, P_none }, + /* 0951 */ { UD_Ifcomp, O_ST0, O_ST1, O_NONE, P_none }, + /* 0952 */ { UD_Ifcomp, O_ST0, O_ST2, O_NONE, P_none }, + /* 0953 */ { UD_Ifcomp, O_ST0, O_ST3, O_NONE, P_none }, + /* 0954 */ { UD_Ifcomp, O_ST0, O_ST4, O_NONE, P_none }, + /* 0955 */ { UD_Ifcomp, O_ST0, O_ST5, O_NONE, P_none }, + /* 0956 */ { UD_Ifcomp, O_ST0, O_ST6, O_NONE, P_none }, + /* 0957 */ { UD_Ifcomp, O_ST0, O_ST7, O_NONE, P_none }, + /* 0958 */ { UD_Ifsub, O_ST0, O_ST0, O_NONE, P_none }, + /* 0959 */ { UD_Ifsub, O_ST0, O_ST1, O_NONE, P_none }, + /* 0960 */ { UD_Ifsub, O_ST0, O_ST2, O_NONE, P_none }, + /* 0961 */ { UD_Ifsub, O_ST0, O_ST3, O_NONE, P_none }, + /* 0962 */ { UD_Ifsub, O_ST0, O_ST4, O_NONE, P_none }, + /* 0963 */ { UD_Ifsub, O_ST0, O_ST5, O_NONE, P_none }, + /* 0964 */ { UD_Ifsub, O_ST0, O_ST6, O_NONE, P_none }, + /* 0965 */ { UD_Ifsub, O_ST0, O_ST7, O_NONE, P_none }, + /* 0966 */ { UD_Ifsubr, O_ST0, O_ST0, O_NONE, P_none }, + /* 0967 */ { UD_Ifsubr, O_ST0, O_ST1, O_NONE, P_none }, + /* 0968 */ { UD_Ifsubr, O_ST0, O_ST2, O_NONE, P_none }, + /* 0969 */ { UD_Ifsubr, O_ST0, O_ST3, O_NONE, P_none }, + /* 0970 */ { UD_Ifsubr, O_ST0, O_ST4, O_NONE, P_none }, + /* 0971 */ { UD_Ifsubr, O_ST0, O_ST5, O_NONE, P_none }, + /* 0972 */ { UD_Ifsubr, O_ST0, O_ST6, O_NONE, P_none }, + /* 0973 */ { UD_Ifsubr, O_ST0, O_ST7, O_NONE, P_none }, + /* 0974 */ { UD_Ifdiv, O_ST0, O_ST0, O_NONE, P_none }, + /* 0975 */ { UD_Ifdiv, O_ST0, O_ST1, O_NONE, P_none }, + /* 0976 */ { UD_Ifdiv, O_ST0, O_ST2, O_NONE, P_none }, + /* 0977 */ { UD_Ifdiv, O_ST0, O_ST3, O_NONE, P_none }, + /* 0978 */ { UD_Ifdiv, O_ST0, O_ST4, O_NONE, P_none }, + /* 0979 */ { UD_Ifdiv, O_ST0, O_ST5, O_NONE, P_none }, + /* 0980 */ { UD_Ifdiv, O_ST0, O_ST6, O_NONE, P_none }, + /* 0981 */ { UD_Ifdiv, O_ST0, O_ST7, O_NONE, P_none }, + /* 0982 */ { UD_Ifdivr, O_ST0, O_ST0, O_NONE, P_none }, + /* 0983 */ { UD_Ifdivr, O_ST0, O_ST1, O_NONE, P_none }, + /* 0984 */ { UD_Ifdivr, O_ST0, O_ST2, O_NONE, P_none }, + /* 0985 */ { UD_Ifdivr, O_ST0, O_ST3, O_NONE, P_none }, + /* 0986 */ { UD_Ifdivr, O_ST0, O_ST4, O_NONE, P_none }, + /* 0987 */ { UD_Ifdivr, O_ST0, O_ST5, O_NONE, P_none }, + /* 0988 */ { UD_Ifdivr, O_ST0, O_ST6, O_NONE, P_none }, + /* 0989 */ { UD_Ifdivr, O_ST0, O_ST7, O_NONE, P_none }, + /* 0990 */ { UD_Ifld, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0991 */ { UD_Ifst, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0992 */ { UD_Ifstp, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0993 */ { UD_Ifldenv, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0994 */ { UD_Ifldcw, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0995 */ { UD_Ifnstenv, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0996 */ { UD_Ifnstcw, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 0997 */ { UD_Ifld, O_ST0, O_NONE, O_NONE, P_none }, + /* 0998 */ { UD_Ifld, O_ST1, O_NONE, O_NONE, P_none }, + /* 0999 */ { UD_Ifld, O_ST2, O_NONE, O_NONE, P_none }, + /* 1000 */ { UD_Ifld, O_ST3, O_NONE, O_NONE, P_none }, + /* 1001 */ { UD_Ifld, O_ST4, O_NONE, O_NONE, P_none }, + /* 1002 */ { UD_Ifld, O_ST5, O_NONE, O_NONE, P_none }, + /* 1003 */ { UD_Ifld, O_ST6, O_NONE, O_NONE, P_none }, + /* 1004 */ { UD_Ifld, O_ST7, O_NONE, O_NONE, P_none }, + /* 1005 */ { UD_Ifxch, O_ST0, O_ST0, O_NONE, P_none }, + /* 1006 */ { UD_Ifxch, O_ST0, O_ST1, O_NONE, P_none }, + /* 1007 */ { UD_Ifxch, O_ST0, O_ST2, O_NONE, P_none }, + /* 1008 */ { UD_Ifxch, O_ST0, O_ST3, O_NONE, P_none }, + /* 1009 */ { UD_Ifxch, O_ST0, O_ST4, O_NONE, P_none }, + /* 1010 */ { UD_Ifxch, O_ST0, O_ST5, O_NONE, P_none }, + /* 1011 */ { UD_Ifxch, O_ST0, O_ST6, O_NONE, P_none }, + /* 1012 */ { UD_Ifxch, O_ST0, O_ST7, O_NONE, P_none }, + /* 1013 */ { UD_Ifnop, O_NONE, O_NONE, O_NONE, P_none }, + /* 1014 */ { UD_Ifstp1, O_ST0, O_NONE, O_NONE, P_none }, + /* 1015 */ { UD_Ifstp1, O_ST1, O_NONE, O_NONE, P_none }, + /* 1016 */ { UD_Ifstp1, O_ST2, O_NONE, O_NONE, P_none }, + /* 1017 */ { UD_Ifstp1, O_ST3, O_NONE, O_NONE, P_none }, + /* 1018 */ { UD_Ifstp1, O_ST4, O_NONE, O_NONE, P_none }, + /* 1019 */ { UD_Ifstp1, O_ST5, O_NONE, O_NONE, P_none }, + /* 1020 */ { UD_Ifstp1, O_ST6, O_NONE, O_NONE, P_none }, + /* 1021 */ { UD_Ifstp1, O_ST7, O_NONE, O_NONE, P_none }, + /* 1022 */ { UD_Ifchs, O_NONE, O_NONE, O_NONE, P_none }, + /* 1023 */ { UD_Ifabs, O_NONE, O_NONE, O_NONE, P_none }, + /* 1024 */ { UD_Iftst, O_NONE, O_NONE, O_NONE, P_none }, + /* 1025 */ { UD_Ifxam, O_NONE, O_NONE, O_NONE, P_none }, + /* 1026 */ { UD_Ifld1, O_NONE, O_NONE, O_NONE, P_none }, + /* 1027 */ { UD_Ifldl2t, O_NONE, O_NONE, O_NONE, P_none }, + /* 1028 */ { UD_Ifldl2e, O_NONE, O_NONE, O_NONE, P_none }, + /* 1029 */ { UD_Ifldpi, O_NONE, O_NONE, O_NONE, P_none }, + /* 1030 */ { UD_Ifldlg2, O_NONE, O_NONE, O_NONE, P_none }, + /* 1031 */ { UD_Ifldln2, O_NONE, O_NONE, O_NONE, P_none }, + /* 1032 */ { UD_Ifldz, O_NONE, O_NONE, O_NONE, P_none }, + /* 1033 */ { UD_If2xm1, O_NONE, O_NONE, O_NONE, P_none }, + /* 1034 */ { UD_Ifyl2x, O_NONE, O_NONE, O_NONE, P_none }, + /* 1035 */ { UD_Ifptan, O_NONE, O_NONE, O_NONE, P_none }, + /* 1036 */ { UD_Ifpatan, O_NONE, O_NONE, O_NONE, P_none }, + /* 1037 */ { UD_Ifxtract, O_NONE, O_NONE, O_NONE, P_none }, + /* 1038 */ { UD_Ifprem1, O_NONE, O_NONE, O_NONE, P_none }, + /* 1039 */ { UD_Ifdecstp, O_NONE, O_NONE, O_NONE, P_none }, + /* 1040 */ { UD_Ifincstp, O_NONE, O_NONE, O_NONE, P_none }, + /* 1041 */ { UD_Ifprem, O_NONE, O_NONE, O_NONE, P_none }, + /* 1042 */ { UD_Ifyl2xp1, O_NONE, O_NONE, O_NONE, P_none }, + /* 1043 */ { UD_Ifsqrt, O_NONE, O_NONE, O_NONE, P_none }, + /* 1044 */ { UD_Ifsincos, O_NONE, O_NONE, O_NONE, P_none }, + /* 1045 */ { UD_Ifrndint, O_NONE, O_NONE, O_NONE, P_none }, + /* 1046 */ { UD_Ifscale, O_NONE, O_NONE, O_NONE, P_none }, + /* 1047 */ { UD_Ifsin, O_NONE, O_NONE, O_NONE, P_none }, + /* 1048 */ { UD_Ifcos, O_NONE, O_NONE, O_NONE, P_none }, + /* 1049 */ { UD_Ifiadd, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1050 */ { UD_Ifimul, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1051 */ { UD_Ificom, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1052 */ { UD_Ificomp, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1053 */ { UD_Ifisub, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1054 */ { UD_Ifisubr, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1055 */ { UD_Ifidiv, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1056 */ { UD_Ifidivr, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1057 */ { UD_Ifcmovb, O_ST0, O_ST0, O_NONE, P_none }, + /* 1058 */ { UD_Ifcmovb, O_ST0, O_ST1, O_NONE, P_none }, + /* 1059 */ { UD_Ifcmovb, O_ST0, O_ST2, O_NONE, P_none }, + /* 1060 */ { UD_Ifcmovb, O_ST0, O_ST3, O_NONE, P_none }, + /* 1061 */ { UD_Ifcmovb, O_ST0, O_ST4, O_NONE, P_none }, + /* 1062 */ { UD_Ifcmovb, O_ST0, O_ST5, O_NONE, P_none }, + /* 1063 */ { UD_Ifcmovb, O_ST0, O_ST6, O_NONE, P_none }, + /* 1064 */ { UD_Ifcmovb, O_ST0, O_ST7, O_NONE, P_none }, + /* 1065 */ { UD_Ifcmove, O_ST0, O_ST0, O_NONE, P_none }, + /* 1066 */ { UD_Ifcmove, O_ST0, O_ST1, O_NONE, P_none }, + /* 1067 */ { UD_Ifcmove, O_ST0, O_ST2, O_NONE, P_none }, + /* 1068 */ { UD_Ifcmove, O_ST0, O_ST3, O_NONE, P_none }, + /* 1069 */ { UD_Ifcmove, O_ST0, O_ST4, O_NONE, P_none }, + /* 1070 */ { UD_Ifcmove, O_ST0, O_ST5, O_NONE, P_none }, + /* 1071 */ { UD_Ifcmove, O_ST0, O_ST6, O_NONE, P_none }, + /* 1072 */ { UD_Ifcmove, O_ST0, O_ST7, O_NONE, P_none }, + /* 1073 */ { UD_Ifcmovbe, O_ST0, O_ST0, O_NONE, P_none }, + /* 1074 */ { UD_Ifcmovbe, O_ST0, O_ST1, O_NONE, P_none }, + /* 1075 */ { UD_Ifcmovbe, O_ST0, O_ST2, O_NONE, P_none }, + /* 1076 */ { UD_Ifcmovbe, O_ST0, O_ST3, O_NONE, P_none }, + /* 1077 */ { UD_Ifcmovbe, O_ST0, O_ST4, O_NONE, P_none }, + /* 1078 */ { UD_Ifcmovbe, O_ST0, O_ST5, O_NONE, P_none }, + /* 1079 */ { UD_Ifcmovbe, O_ST0, O_ST6, O_NONE, P_none }, + /* 1080 */ { UD_Ifcmovbe, O_ST0, O_ST7, O_NONE, P_none }, + /* 1081 */ { UD_Ifcmovu, O_ST0, O_ST0, O_NONE, P_none }, + /* 1082 */ { UD_Ifcmovu, O_ST0, O_ST1, O_NONE, P_none }, + /* 1083 */ { UD_Ifcmovu, O_ST0, O_ST2, O_NONE, P_none }, + /* 1084 */ { UD_Ifcmovu, O_ST0, O_ST3, O_NONE, P_none }, + /* 1085 */ { UD_Ifcmovu, O_ST0, O_ST4, O_NONE, P_none }, + /* 1086 */ { UD_Ifcmovu, O_ST0, O_ST5, O_NONE, P_none }, + /* 1087 */ { UD_Ifcmovu, O_ST0, O_ST6, O_NONE, P_none }, + /* 1088 */ { UD_Ifcmovu, O_ST0, O_ST7, O_NONE, P_none }, + /* 1089 */ { UD_Ifucompp, O_NONE, O_NONE, O_NONE, P_none }, + /* 1090 */ { UD_Ifild, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1091 */ { UD_Ifisttp, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1092 */ { UD_Ifist, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1093 */ { UD_Ifistp, O_Md, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1094 */ { UD_Ifld, O_Mt, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1095 */ { UD_Ifstp, O_Mt, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1096 */ { UD_Ifcmovnb, O_ST0, O_ST0, O_NONE, P_none }, + /* 1097 */ { UD_Ifcmovnb, O_ST0, O_ST1, O_NONE, P_none }, + /* 1098 */ { UD_Ifcmovnb, O_ST0, O_ST2, O_NONE, P_none }, + /* 1099 */ { UD_Ifcmovnb, O_ST0, O_ST3, O_NONE, P_none }, + /* 1100 */ { UD_Ifcmovnb, O_ST0, O_ST4, O_NONE, P_none }, + /* 1101 */ { UD_Ifcmovnb, O_ST0, O_ST5, O_NONE, P_none }, + /* 1102 */ { UD_Ifcmovnb, O_ST0, O_ST6, O_NONE, P_none }, + /* 1103 */ { UD_Ifcmovnb, O_ST0, O_ST7, O_NONE, P_none }, + /* 1104 */ { UD_Ifcmovne, O_ST0, O_ST0, O_NONE, P_none }, + /* 1105 */ { UD_Ifcmovne, O_ST0, O_ST1, O_NONE, P_none }, + /* 1106 */ { UD_Ifcmovne, O_ST0, O_ST2, O_NONE, P_none }, + /* 1107 */ { UD_Ifcmovne, O_ST0, O_ST3, O_NONE, P_none }, + /* 1108 */ { UD_Ifcmovne, O_ST0, O_ST4, O_NONE, P_none }, + /* 1109 */ { UD_Ifcmovne, O_ST0, O_ST5, O_NONE, P_none }, + /* 1110 */ { UD_Ifcmovne, O_ST0, O_ST6, O_NONE, P_none }, + /* 1111 */ { UD_Ifcmovne, O_ST0, O_ST7, O_NONE, P_none }, + /* 1112 */ { UD_Ifcmovnbe, O_ST0, O_ST0, O_NONE, P_none }, + /* 1113 */ { UD_Ifcmovnbe, O_ST0, O_ST1, O_NONE, P_none }, + /* 1114 */ { UD_Ifcmovnbe, O_ST0, O_ST2, O_NONE, P_none }, + /* 1115 */ { UD_Ifcmovnbe, O_ST0, O_ST3, O_NONE, P_none }, + /* 1116 */ { UD_Ifcmovnbe, O_ST0, O_ST4, O_NONE, P_none }, + /* 1117 */ { UD_Ifcmovnbe, O_ST0, O_ST5, O_NONE, P_none }, + /* 1118 */ { UD_Ifcmovnbe, O_ST0, O_ST6, O_NONE, P_none }, + /* 1119 */ { UD_Ifcmovnbe, O_ST0, O_ST7, O_NONE, P_none }, + /* 1120 */ { UD_Ifcmovnu, O_ST0, O_ST0, O_NONE, P_none }, + /* 1121 */ { UD_Ifcmovnu, O_ST0, O_ST1, O_NONE, P_none }, + /* 1122 */ { UD_Ifcmovnu, O_ST0, O_ST2, O_NONE, P_none }, + /* 1123 */ { UD_Ifcmovnu, O_ST0, O_ST3, O_NONE, P_none }, + /* 1124 */ { UD_Ifcmovnu, O_ST0, O_ST4, O_NONE, P_none }, + /* 1125 */ { UD_Ifcmovnu, O_ST0, O_ST5, O_NONE, P_none }, + /* 1126 */ { UD_Ifcmovnu, O_ST0, O_ST6, O_NONE, P_none }, + /* 1127 */ { UD_Ifcmovnu, O_ST0, O_ST7, O_NONE, P_none }, + /* 1128 */ { UD_Ifclex, O_NONE, O_NONE, O_NONE, P_none }, + /* 1129 */ { UD_Ifninit, O_NONE, O_NONE, O_NONE, P_none }, + /* 1130 */ { UD_Ifucomi, O_ST0, O_ST0, O_NONE, P_none }, + /* 1131 */ { UD_Ifucomi, O_ST0, O_ST1, O_NONE, P_none }, + /* 1132 */ { UD_Ifucomi, O_ST0, O_ST2, O_NONE, P_none }, + /* 1133 */ { UD_Ifucomi, O_ST0, O_ST3, O_NONE, P_none }, + /* 1134 */ { UD_Ifucomi, O_ST0, O_ST4, O_NONE, P_none }, + /* 1135 */ { UD_Ifucomi, O_ST0, O_ST5, O_NONE, P_none }, + /* 1136 */ { UD_Ifucomi, O_ST0, O_ST6, O_NONE, P_none }, + /* 1137 */ { UD_Ifucomi, O_ST0, O_ST7, O_NONE, P_none }, + /* 1138 */ { UD_Ifcomi, O_ST0, O_ST0, O_NONE, P_none }, + /* 1139 */ { UD_Ifcomi, O_ST0, O_ST1, O_NONE, P_none }, + /* 1140 */ { UD_Ifcomi, O_ST0, O_ST2, O_NONE, P_none }, + /* 1141 */ { UD_Ifcomi, O_ST0, O_ST3, O_NONE, P_none }, + /* 1142 */ { UD_Ifcomi, O_ST0, O_ST4, O_NONE, P_none }, + /* 1143 */ { UD_Ifcomi, O_ST0, O_ST5, O_NONE, P_none }, + /* 1144 */ { UD_Ifcomi, O_ST0, O_ST6, O_NONE, P_none }, + /* 1145 */ { UD_Ifcomi, O_ST0, O_ST7, O_NONE, P_none }, + /* 1146 */ { UD_Ifadd, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1147 */ { UD_Ifmul, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1148 */ { UD_Ifcom, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1149 */ { UD_Ifcomp, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1150 */ { UD_Ifsub, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1151 */ { UD_Ifsubr, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1152 */ { UD_Ifdiv, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1153 */ { UD_Ifdivr, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1154 */ { UD_Ifadd, O_ST0, O_ST0, O_NONE, P_none }, + /* 1155 */ { UD_Ifadd, O_ST1, O_ST0, O_NONE, P_none }, + /* 1156 */ { UD_Ifadd, O_ST2, O_ST0, O_NONE, P_none }, + /* 1157 */ { UD_Ifadd, O_ST3, O_ST0, O_NONE, P_none }, + /* 1158 */ { UD_Ifadd, O_ST4, O_ST0, O_NONE, P_none }, + /* 1159 */ { UD_Ifadd, O_ST5, O_ST0, O_NONE, P_none }, + /* 1160 */ { UD_Ifadd, O_ST6, O_ST0, O_NONE, P_none }, + /* 1161 */ { UD_Ifadd, O_ST7, O_ST0, O_NONE, P_none }, + /* 1162 */ { UD_Ifmul, O_ST0, O_ST0, O_NONE, P_none }, + /* 1163 */ { UD_Ifmul, O_ST1, O_ST0, O_NONE, P_none }, + /* 1164 */ { UD_Ifmul, O_ST2, O_ST0, O_NONE, P_none }, + /* 1165 */ { UD_Ifmul, O_ST3, O_ST0, O_NONE, P_none }, + /* 1166 */ { UD_Ifmul, O_ST4, O_ST0, O_NONE, P_none }, + /* 1167 */ { UD_Ifmul, O_ST5, O_ST0, O_NONE, P_none }, + /* 1168 */ { UD_Ifmul, O_ST6, O_ST0, O_NONE, P_none }, + /* 1169 */ { UD_Ifmul, O_ST7, O_ST0, O_NONE, P_none }, + /* 1170 */ { UD_Ifcom2, O_ST0, O_NONE, O_NONE, P_none }, + /* 1171 */ { UD_Ifcom2, O_ST1, O_NONE, O_NONE, P_none }, + /* 1172 */ { UD_Ifcom2, O_ST2, O_NONE, O_NONE, P_none }, + /* 1173 */ { UD_Ifcom2, O_ST3, O_NONE, O_NONE, P_none }, + /* 1174 */ { UD_Ifcom2, O_ST4, O_NONE, O_NONE, P_none }, + /* 1175 */ { UD_Ifcom2, O_ST5, O_NONE, O_NONE, P_none }, + /* 1176 */ { UD_Ifcom2, O_ST6, O_NONE, O_NONE, P_none }, + /* 1177 */ { UD_Ifcom2, O_ST7, O_NONE, O_NONE, P_none }, + /* 1178 */ { UD_Ifcomp3, O_ST0, O_NONE, O_NONE, P_none }, + /* 1179 */ { UD_Ifcomp3, O_ST1, O_NONE, O_NONE, P_none }, + /* 1180 */ { UD_Ifcomp3, O_ST2, O_NONE, O_NONE, P_none }, + /* 1181 */ { UD_Ifcomp3, O_ST3, O_NONE, O_NONE, P_none }, + /* 1182 */ { UD_Ifcomp3, O_ST4, O_NONE, O_NONE, P_none }, + /* 1183 */ { UD_Ifcomp3, O_ST5, O_NONE, O_NONE, P_none }, + /* 1184 */ { UD_Ifcomp3, O_ST6, O_NONE, O_NONE, P_none }, + /* 1185 */ { UD_Ifcomp3, O_ST7, O_NONE, O_NONE, P_none }, + /* 1186 */ { UD_Ifsubr, O_ST0, O_ST0, O_NONE, P_none }, + /* 1187 */ { UD_Ifsubr, O_ST1, O_ST0, O_NONE, P_none }, + /* 1188 */ { UD_Ifsubr, O_ST2, O_ST0, O_NONE, P_none }, + /* 1189 */ { UD_Ifsubr, O_ST3, O_ST0, O_NONE, P_none }, + /* 1190 */ { UD_Ifsubr, O_ST4, O_ST0, O_NONE, P_none }, + /* 1191 */ { UD_Ifsubr, O_ST5, O_ST0, O_NONE, P_none }, + /* 1192 */ { UD_Ifsubr, O_ST6, O_ST0, O_NONE, P_none }, + /* 1193 */ { UD_Ifsubr, O_ST7, O_ST0, O_NONE, P_none }, + /* 1194 */ { UD_Ifsub, O_ST0, O_ST0, O_NONE, P_none }, + /* 1195 */ { UD_Ifsub, O_ST1, O_ST0, O_NONE, P_none }, + /* 1196 */ { UD_Ifsub, O_ST2, O_ST0, O_NONE, P_none }, + /* 1197 */ { UD_Ifsub, O_ST3, O_ST0, O_NONE, P_none }, + /* 1198 */ { UD_Ifsub, O_ST4, O_ST0, O_NONE, P_none }, + /* 1199 */ { UD_Ifsub, O_ST5, O_ST0, O_NONE, P_none }, + /* 1200 */ { UD_Ifsub, O_ST6, O_ST0, O_NONE, P_none }, + /* 1201 */ { UD_Ifsub, O_ST7, O_ST0, O_NONE, P_none }, + /* 1202 */ { UD_Ifdivr, O_ST0, O_ST0, O_NONE, P_none }, + /* 1203 */ { UD_Ifdivr, O_ST1, O_ST0, O_NONE, P_none }, + /* 1204 */ { UD_Ifdivr, O_ST2, O_ST0, O_NONE, P_none }, + /* 1205 */ { UD_Ifdivr, O_ST3, O_ST0, O_NONE, P_none }, + /* 1206 */ { UD_Ifdivr, O_ST4, O_ST0, O_NONE, P_none }, + /* 1207 */ { UD_Ifdivr, O_ST5, O_ST0, O_NONE, P_none }, + /* 1208 */ { UD_Ifdivr, O_ST6, O_ST0, O_NONE, P_none }, + /* 1209 */ { UD_Ifdivr, O_ST7, O_ST0, O_NONE, P_none }, + /* 1210 */ { UD_Ifdiv, O_ST0, O_ST0, O_NONE, P_none }, + /* 1211 */ { UD_Ifdiv, O_ST1, O_ST0, O_NONE, P_none }, + /* 1212 */ { UD_Ifdiv, O_ST2, O_ST0, O_NONE, P_none }, + /* 1213 */ { UD_Ifdiv, O_ST3, O_ST0, O_NONE, P_none }, + /* 1214 */ { UD_Ifdiv, O_ST4, O_ST0, O_NONE, P_none }, + /* 1215 */ { UD_Ifdiv, O_ST5, O_ST0, O_NONE, P_none }, + /* 1216 */ { UD_Ifdiv, O_ST6, O_ST0, O_NONE, P_none }, + /* 1217 */ { UD_Ifdiv, O_ST7, O_ST0, O_NONE, P_none }, + /* 1218 */ { UD_Ifld, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1219 */ { UD_Ifisttp, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1220 */ { UD_Ifst, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1221 */ { UD_Ifstp, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1222 */ { UD_Ifrstor, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1223 */ { UD_Ifnsave, O_M, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1224 */ { UD_Ifnstsw, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1225 */ { UD_Iffree, O_ST0, O_NONE, O_NONE, P_none }, + /* 1226 */ { UD_Iffree, O_ST1, O_NONE, O_NONE, P_none }, + /* 1227 */ { UD_Iffree, O_ST2, O_NONE, O_NONE, P_none }, + /* 1228 */ { UD_Iffree, O_ST3, O_NONE, O_NONE, P_none }, + /* 1229 */ { UD_Iffree, O_ST4, O_NONE, O_NONE, P_none }, + /* 1230 */ { UD_Iffree, O_ST5, O_NONE, O_NONE, P_none }, + /* 1231 */ { UD_Iffree, O_ST6, O_NONE, O_NONE, P_none }, + /* 1232 */ { UD_Iffree, O_ST7, O_NONE, O_NONE, P_none }, + /* 1233 */ { UD_Ifxch4, O_ST0, O_NONE, O_NONE, P_none }, + /* 1234 */ { UD_Ifxch4, O_ST1, O_NONE, O_NONE, P_none }, + /* 1235 */ { UD_Ifxch4, O_ST2, O_NONE, O_NONE, P_none }, + /* 1236 */ { UD_Ifxch4, O_ST3, O_NONE, O_NONE, P_none }, + /* 1237 */ { UD_Ifxch4, O_ST4, O_NONE, O_NONE, P_none }, + /* 1238 */ { UD_Ifxch4, O_ST5, O_NONE, O_NONE, P_none }, + /* 1239 */ { UD_Ifxch4, O_ST6, O_NONE, O_NONE, P_none }, + /* 1240 */ { UD_Ifxch4, O_ST7, O_NONE, O_NONE, P_none }, + /* 1241 */ { UD_Ifst, O_ST0, O_NONE, O_NONE, P_none }, + /* 1242 */ { UD_Ifst, O_ST1, O_NONE, O_NONE, P_none }, + /* 1243 */ { UD_Ifst, O_ST2, O_NONE, O_NONE, P_none }, + /* 1244 */ { UD_Ifst, O_ST3, O_NONE, O_NONE, P_none }, + /* 1245 */ { UD_Ifst, O_ST4, O_NONE, O_NONE, P_none }, + /* 1246 */ { UD_Ifst, O_ST5, O_NONE, O_NONE, P_none }, + /* 1247 */ { UD_Ifst, O_ST6, O_NONE, O_NONE, P_none }, + /* 1248 */ { UD_Ifst, O_ST7, O_NONE, O_NONE, P_none }, + /* 1249 */ { UD_Ifstp, O_ST0, O_NONE, O_NONE, P_none }, + /* 1250 */ { UD_Ifstp, O_ST1, O_NONE, O_NONE, P_none }, + /* 1251 */ { UD_Ifstp, O_ST2, O_NONE, O_NONE, P_none }, + /* 1252 */ { UD_Ifstp, O_ST3, O_NONE, O_NONE, P_none }, + /* 1253 */ { UD_Ifstp, O_ST4, O_NONE, O_NONE, P_none }, + /* 1254 */ { UD_Ifstp, O_ST5, O_NONE, O_NONE, P_none }, + /* 1255 */ { UD_Ifstp, O_ST6, O_NONE, O_NONE, P_none }, + /* 1256 */ { UD_Ifstp, O_ST7, O_NONE, O_NONE, P_none }, + /* 1257 */ { UD_Ifucom, O_ST0, O_NONE, O_NONE, P_none }, + /* 1258 */ { UD_Ifucom, O_ST1, O_NONE, O_NONE, P_none }, + /* 1259 */ { UD_Ifucom, O_ST2, O_NONE, O_NONE, P_none }, + /* 1260 */ { UD_Ifucom, O_ST3, O_NONE, O_NONE, P_none }, + /* 1261 */ { UD_Ifucom, O_ST4, O_NONE, O_NONE, P_none }, + /* 1262 */ { UD_Ifucom, O_ST5, O_NONE, O_NONE, P_none }, + /* 1263 */ { UD_Ifucom, O_ST6, O_NONE, O_NONE, P_none }, + /* 1264 */ { UD_Ifucom, O_ST7, O_NONE, O_NONE, P_none }, + /* 1265 */ { UD_Ifucomp, O_ST0, O_NONE, O_NONE, P_none }, + /* 1266 */ { UD_Ifucomp, O_ST1, O_NONE, O_NONE, P_none }, + /* 1267 */ { UD_Ifucomp, O_ST2, O_NONE, O_NONE, P_none }, + /* 1268 */ { UD_Ifucomp, O_ST3, O_NONE, O_NONE, P_none }, + /* 1269 */ { UD_Ifucomp, O_ST4, O_NONE, O_NONE, P_none }, + /* 1270 */ { UD_Ifucomp, O_ST5, O_NONE, O_NONE, P_none }, + /* 1271 */ { UD_Ifucomp, O_ST6, O_NONE, O_NONE, P_none }, + /* 1272 */ { UD_Ifucomp, O_ST7, O_NONE, O_NONE, P_none }, + /* 1273 */ { UD_Ifiadd, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1274 */ { UD_Ifimul, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1275 */ { UD_Ificom, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1276 */ { UD_Ificomp, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1277 */ { UD_Ifisub, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1278 */ { UD_Ifisubr, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1279 */ { UD_Ifidiv, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1280 */ { UD_Ifidivr, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1281 */ { UD_Ifaddp, O_ST0, O_ST0, O_NONE, P_none }, + /* 1282 */ { UD_Ifaddp, O_ST1, O_ST0, O_NONE, P_none }, + /* 1283 */ { UD_Ifaddp, O_ST2, O_ST0, O_NONE, P_none }, + /* 1284 */ { UD_Ifaddp, O_ST3, O_ST0, O_NONE, P_none }, + /* 1285 */ { UD_Ifaddp, O_ST4, O_ST0, O_NONE, P_none }, + /* 1286 */ { UD_Ifaddp, O_ST5, O_ST0, O_NONE, P_none }, + /* 1287 */ { UD_Ifaddp, O_ST6, O_ST0, O_NONE, P_none }, + /* 1288 */ { UD_Ifaddp, O_ST7, O_ST0, O_NONE, P_none }, + /* 1289 */ { UD_Ifmulp, O_ST0, O_ST0, O_NONE, P_none }, + /* 1290 */ { UD_Ifmulp, O_ST1, O_ST0, O_NONE, P_none }, + /* 1291 */ { UD_Ifmulp, O_ST2, O_ST0, O_NONE, P_none }, + /* 1292 */ { UD_Ifmulp, O_ST3, O_ST0, O_NONE, P_none }, + /* 1293 */ { UD_Ifmulp, O_ST4, O_ST0, O_NONE, P_none }, + /* 1294 */ { UD_Ifmulp, O_ST5, O_ST0, O_NONE, P_none }, + /* 1295 */ { UD_Ifmulp, O_ST6, O_ST0, O_NONE, P_none }, + /* 1296 */ { UD_Ifmulp, O_ST7, O_ST0, O_NONE, P_none }, + /* 1297 */ { UD_Ifcomp5, O_ST0, O_NONE, O_NONE, P_none }, + /* 1298 */ { UD_Ifcomp5, O_ST1, O_NONE, O_NONE, P_none }, + /* 1299 */ { UD_Ifcomp5, O_ST2, O_NONE, O_NONE, P_none }, + /* 1300 */ { UD_Ifcomp5, O_ST3, O_NONE, O_NONE, P_none }, + /* 1301 */ { UD_Ifcomp5, O_ST4, O_NONE, O_NONE, P_none }, + /* 1302 */ { UD_Ifcomp5, O_ST5, O_NONE, O_NONE, P_none }, + /* 1303 */ { UD_Ifcomp5, O_ST6, O_NONE, O_NONE, P_none }, + /* 1304 */ { UD_Ifcomp5, O_ST7, O_NONE, O_NONE, P_none }, + /* 1305 */ { UD_Ifcompp, O_NONE, O_NONE, O_NONE, P_none }, + /* 1306 */ { UD_Ifsubrp, O_ST0, O_ST0, O_NONE, P_none }, + /* 1307 */ { UD_Ifsubrp, O_ST1, O_ST0, O_NONE, P_none }, + /* 1308 */ { UD_Ifsubrp, O_ST2, O_ST0, O_NONE, P_none }, + /* 1309 */ { UD_Ifsubrp, O_ST3, O_ST0, O_NONE, P_none }, + /* 1310 */ { UD_Ifsubrp, O_ST4, O_ST0, O_NONE, P_none }, + /* 1311 */ { UD_Ifsubrp, O_ST5, O_ST0, O_NONE, P_none }, + /* 1312 */ { UD_Ifsubrp, O_ST6, O_ST0, O_NONE, P_none }, + /* 1313 */ { UD_Ifsubrp, O_ST7, O_ST0, O_NONE, P_none }, + /* 1314 */ { UD_Ifsubp, O_ST0, O_ST0, O_NONE, P_none }, + /* 1315 */ { UD_Ifsubp, O_ST1, O_ST0, O_NONE, P_none }, + /* 1316 */ { UD_Ifsubp, O_ST2, O_ST0, O_NONE, P_none }, + /* 1317 */ { UD_Ifsubp, O_ST3, O_ST0, O_NONE, P_none }, + /* 1318 */ { UD_Ifsubp, O_ST4, O_ST0, O_NONE, P_none }, + /* 1319 */ { UD_Ifsubp, O_ST5, O_ST0, O_NONE, P_none }, + /* 1320 */ { UD_Ifsubp, O_ST6, O_ST0, O_NONE, P_none }, + /* 1321 */ { UD_Ifsubp, O_ST7, O_ST0, O_NONE, P_none }, + /* 1322 */ { UD_Ifdivrp, O_ST0, O_ST0, O_NONE, P_none }, + /* 1323 */ { UD_Ifdivrp, O_ST1, O_ST0, O_NONE, P_none }, + /* 1324 */ { UD_Ifdivrp, O_ST2, O_ST0, O_NONE, P_none }, + /* 1325 */ { UD_Ifdivrp, O_ST3, O_ST0, O_NONE, P_none }, + /* 1326 */ { UD_Ifdivrp, O_ST4, O_ST0, O_NONE, P_none }, + /* 1327 */ { UD_Ifdivrp, O_ST5, O_ST0, O_NONE, P_none }, + /* 1328 */ { UD_Ifdivrp, O_ST6, O_ST0, O_NONE, P_none }, + /* 1329 */ { UD_Ifdivrp, O_ST7, O_ST0, O_NONE, P_none }, + /* 1330 */ { UD_Ifdivp, O_ST0, O_ST0, O_NONE, P_none }, + /* 1331 */ { UD_Ifdivp, O_ST1, O_ST0, O_NONE, P_none }, + /* 1332 */ { UD_Ifdivp, O_ST2, O_ST0, O_NONE, P_none }, + /* 1333 */ { UD_Ifdivp, O_ST3, O_ST0, O_NONE, P_none }, + /* 1334 */ { UD_Ifdivp, O_ST4, O_ST0, O_NONE, P_none }, + /* 1335 */ { UD_Ifdivp, O_ST5, O_ST0, O_NONE, P_none }, + /* 1336 */ { UD_Ifdivp, O_ST6, O_ST0, O_NONE, P_none }, + /* 1337 */ { UD_Ifdivp, O_ST7, O_ST0, O_NONE, P_none }, + /* 1338 */ { UD_Ifild, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1339 */ { UD_Ifisttp, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1340 */ { UD_Ifist, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1341 */ { UD_Ifistp, O_Mw, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1342 */ { UD_Ifbld, O_Mt, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1343 */ { UD_Ifild, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1344 */ { UD_Ifbstp, O_Mt, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1345 */ { UD_Ifistp, O_Mq, O_NONE, O_NONE, P_aso|P_rexr|P_rexx|P_rexb }, + /* 1346 */ { UD_Iffreep, O_ST0, O_NONE, O_NONE, P_none }, + /* 1347 */ { UD_Iffreep, O_ST1, O_NONE, O_NONE, P_none }, + /* 1348 */ { UD_Iffreep, O_ST2, O_NONE, O_NONE, P_none }, + /* 1349 */ { UD_Iffreep, O_ST3, O_NONE, O_NONE, P_none }, + /* 1350 */ { UD_Iffreep, O_ST4, O_NONE, O_NONE, P_none }, + /* 1351 */ { UD_Iffreep, O_ST5, O_NONE, O_NONE, P_none }, + /* 1352 */ { UD_Iffreep, O_ST6, O_NONE, O_NONE, P_none }, + /* 1353 */ { UD_Iffreep, O_ST7, O_NONE, O_NONE, P_none }, + /* 1354 */ { UD_Ifxch7, O_ST0, O_NONE, O_NONE, P_none }, + /* 1355 */ { UD_Ifxch7, O_ST1, O_NONE, O_NONE, P_none }, + /* 1356 */ { UD_Ifxch7, O_ST2, O_NONE, O_NONE, P_none }, + /* 1357 */ { UD_Ifxch7, O_ST3, O_NONE, O_NONE, P_none }, + /* 1358 */ { UD_Ifxch7, O_ST4, O_NONE, O_NONE, P_none }, + /* 1359 */ { UD_Ifxch7, O_ST5, O_NONE, O_NONE, P_none }, + /* 1360 */ { UD_Ifxch7, O_ST6, O_NONE, O_NONE, P_none }, + /* 1361 */ { UD_Ifxch7, O_ST7, O_NONE, O_NONE, P_none }, + /* 1362 */ { UD_Ifstp8, O_ST0, O_NONE, O_NONE, P_none }, + /* 1363 */ { UD_Ifstp8, O_ST1, O_NONE, O_NONE, P_none }, + /* 1364 */ { UD_Ifstp8, O_ST2, O_NONE, O_NONE, P_none }, + /* 1365 */ { UD_Ifstp8, O_ST3, O_NONE, O_NONE, P_none }, + /* 1366 */ { UD_Ifstp8, O_ST4, O_NONE, O_NONE, P_none }, + /* 1367 */ { UD_Ifstp8, O_ST5, O_NONE, O_NONE, P_none }, + /* 1368 */ { UD_Ifstp8, O_ST6, O_NONE, O_NONE, P_none }, + /* 1369 */ { UD_Ifstp8, O_ST7, O_NONE, O_NONE, P_none }, + /* 1370 */ { UD_Ifstp9, O_ST0, O_NONE, O_NONE, P_none }, + /* 1371 */ { UD_Ifstp9, O_ST1, O_NONE, O_NONE, P_none }, + /* 1372 */ { UD_Ifstp9, O_ST2, O_NONE, O_NONE, P_none }, + /* 1373 */ { UD_Ifstp9, O_ST3, O_NONE, O_NONE, P_none }, + /* 1374 */ { UD_Ifstp9, O_ST4, O_NONE, O_NONE, P_none }, + /* 1375 */ { UD_Ifstp9, O_ST5, O_NONE, O_NONE, P_none }, + /* 1376 */ { UD_Ifstp9, O_ST6, O_NONE, O_NONE, P_none }, + /* 1377 */ { UD_Ifstp9, O_ST7, O_NONE, O_NONE, P_none }, + /* 1378 */ { UD_Ifnstsw, O_AX, O_NONE, O_NONE, P_none }, + /* 1379 */ { UD_Ifucomip, O_ST0, O_ST0, O_NONE, P_none }, + /* 1380 */ { UD_Ifucomip, O_ST0, O_ST1, O_NONE, P_none }, + /* 1381 */ { UD_Ifucomip, O_ST0, O_ST2, O_NONE, P_none }, + /* 1382 */ { UD_Ifucomip, O_ST0, O_ST3, O_NONE, P_none }, + /* 1383 */ { UD_Ifucomip, O_ST0, O_ST4, O_NONE, P_none }, + /* 1384 */ { UD_Ifucomip, O_ST0, O_ST5, O_NONE, P_none }, + /* 1385 */ { UD_Ifucomip, O_ST0, O_ST6, O_NONE, P_none }, + /* 1386 */ { UD_Ifucomip, O_ST0, O_ST7, O_NONE, P_none }, + /* 1387 */ { UD_Ifcomip, O_ST0, O_ST0, O_NONE, P_none }, + /* 1388 */ { UD_Ifcomip, O_ST0, O_ST1, O_NONE, P_none }, + /* 1389 */ { UD_Ifcomip, O_ST0, O_ST2, O_NONE, P_none }, + /* 1390 */ { UD_Ifcomip, O_ST0, O_ST3, O_NONE, P_none }, + /* 1391 */ { UD_Ifcomip, O_ST0, O_ST4, O_NONE, P_none }, + /* 1392 */ { UD_Ifcomip, O_ST0, O_ST5, O_NONE, P_none }, + /* 1393 */ { UD_Ifcomip, O_ST0, O_ST6, O_NONE, P_none }, + /* 1394 */ { UD_Ifcomip, O_ST0, O_ST7, O_NONE, P_none }, + /* 1395 */ { UD_Iloopne, O_Jb, O_NONE, O_NONE, P_none }, + /* 1396 */ { UD_Iloope, O_Jb, O_NONE, O_NONE, P_none }, + /* 1397 */ { UD_Iloop, O_Jb, O_NONE, O_NONE, P_none }, + /* 1398 */ { UD_Ijcxz, O_Jb, O_NONE, O_NONE, P_aso }, + /* 1399 */ { UD_Ijecxz, O_Jb, O_NONE, O_NONE, P_aso }, + /* 1400 */ { UD_Ijrcxz, O_Jb, O_NONE, O_NONE, P_aso }, + /* 1401 */ { UD_Iin, O_AL, O_Ib, O_NONE, P_none }, + /* 1402 */ { UD_Iin, O_eAX, O_Ib, O_NONE, P_oso }, + /* 1403 */ { UD_Iout, O_Ib, O_AL, O_NONE, P_none }, + /* 1404 */ { UD_Iout, O_Ib, O_eAX, O_NONE, P_oso }, + /* 1405 */ { UD_Icall, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 1406 */ { UD_Ijmp, O_Jz, O_NONE, O_NONE, P_oso|P_def64 }, + /* 1407 */ { UD_Ijmp, O_Av, O_NONE, O_NONE, P_oso }, + /* 1408 */ { UD_Ijmp, O_Jb, O_NONE, O_NONE, P_def64 }, + /* 1409 */ { UD_Iin, O_AL, O_DX, O_NONE, P_none }, + /* 1410 */ { UD_Iin, O_eAX, O_DX, O_NONE, P_oso }, + /* 1411 */ { UD_Iout, O_DX, O_AL, O_NONE, P_none }, + /* 1412 */ { UD_Iout, O_DX, O_eAX, O_NONE, P_oso }, + /* 1413 */ { UD_Ilock, O_NONE, O_NONE, O_NONE, P_none }, + /* 1414 */ { UD_Iint1, O_NONE, O_NONE, O_NONE, P_none }, + /* 1415 */ { UD_Irepne, O_NONE, O_NONE, O_NONE, P_none }, + /* 1416 */ { UD_Irep, O_NONE, O_NONE, O_NONE, P_none }, + /* 1417 */ { UD_Ihlt, O_NONE, O_NONE, O_NONE, P_none }, + /* 1418 */ { UD_Icmc, O_NONE, O_NONE, O_NONE, P_none }, + /* 1419 */ { UD_Itest, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1420 */ { UD_Itest, O_Eb, O_Ib, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1421 */ { UD_Inot, O_Eb, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1422 */ { UD_Ineg, O_Eb, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1423 */ { UD_Imul, O_Eb, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1424 */ { UD_Iimul, O_Eb, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1425 */ { UD_Idiv, O_Eb, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1426 */ { UD_Iidiv, O_Eb, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1427 */ { UD_Itest, O_Ev, O_sIz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1428 */ { UD_Itest, O_Ev, O_Iz, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1429 */ { UD_Inot, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1430 */ { UD_Ineg, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1431 */ { UD_Imul, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1432 */ { UD_Iimul, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1433 */ { UD_Idiv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1434 */ { UD_Iidiv, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1435 */ { UD_Iclc, O_NONE, O_NONE, O_NONE, P_none }, + /* 1436 */ { UD_Istc, O_NONE, O_NONE, O_NONE, P_none }, + /* 1437 */ { UD_Icli, O_NONE, O_NONE, O_NONE, P_none }, + /* 1438 */ { UD_Isti, O_NONE, O_NONE, O_NONE, P_none }, + /* 1439 */ { UD_Icld, O_NONE, O_NONE, O_NONE, P_none }, + /* 1440 */ { UD_Istd, O_NONE, O_NONE, O_NONE, P_none }, + /* 1441 */ { UD_Iinc, O_Eb, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1442 */ { UD_Idec, O_Eb, O_NONE, O_NONE, P_aso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1443 */ { UD_Iinc, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1444 */ { UD_Idec, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1445 */ { UD_Icall, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1446 */ { UD_Icall, O_Eq, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb|P_def64 }, + /* 1447 */ { UD_Icall, O_Fv, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1448 */ { UD_Ijmp, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb|P_def64 }, + /* 1449 */ { UD_Ijmp, O_Fv, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb }, + /* 1450 */ { UD_Ipush, O_Ev, O_NONE, O_NONE, P_aso|P_oso|P_rexw|P_rexr|P_rexx|P_rexb|P_def64 }, +}; + + +const char * ud_mnemonics_str[] = { +"invalid", + "3dnow", + "none", + "db", + "pause", + "aaa", + "aad", + "aam", + "aas", + "adc", + "add", + "addpd", + "addps", + "addsd", + "addss", + "and", + "andpd", + "andps", + "andnpd", + "andnps", + "arpl", + "movsxd", + "bound", + "bsf", + "bsr", + "bswap", + "bt", + "btc", + "btr", + "bts", + "call", + "cbw", + "cwde", + "cdqe", + "clc", + "cld", + "clflush", + "clgi", + "cli", + "clts", + "cmc", + "cmovo", + "cmovno", + "cmovb", + "cmovae", + "cmovz", + "cmovnz", + "cmovbe", + "cmova", + "cmovs", + "cmovns", + "cmovp", + "cmovnp", + "cmovl", + "cmovge", + "cmovle", + "cmovg", + "cmp", + "cmppd", + "cmpps", + "cmpsb", + "cmpsw", + "cmpsd", + "cmpsq", + "cmpss", + "cmpxchg", + "cmpxchg8b", + "cmpxchg16b", + "comisd", + "comiss", + "cpuid", + "cvtdq2pd", + "cvtdq2ps", + "cvtpd2dq", + "cvtpd2pi", + "cvtpd2ps", + "cvtpi2ps", + "cvtpi2pd", + "cvtps2dq", + "cvtps2pi", + "cvtps2pd", + "cvtsd2si", + "cvtsd2ss", + "cvtsi2ss", + "cvtss2si", + "cvtss2sd", + "cvttpd2pi", + "cvttpd2dq", + "cvttps2dq", + "cvttps2pi", + "cvttsd2si", + "cvtsi2sd", + "cvttss2si", + "cwd", + "cdq", + "cqo", + "daa", + "das", + "dec", + "div", + "divpd", + "divps", + "divsd", + "divss", + "emms", + "enter", + "f2xm1", + "fabs", + "fadd", + "faddp", + "fbld", + "fbstp", + "fchs", + "fclex", + "fcmovb", + "fcmove", + "fcmovbe", + "fcmovu", + "fcmovnb", + "fcmovne", + "fcmovnbe", + "fcmovnu", + "fucomi", + "fcom", + "fcom2", + "fcomp3", + "fcomi", + "fucomip", + "fcomip", + "fcomp", + "fcomp5", + "fcompp", + "fcos", + "fdecstp", + "fdiv", + "fdivp", + "fdivr", + "fdivrp", + "femms", + "ffree", + "ffreep", + "ficom", + "ficomp", + "fild", + "fincstp", + "fninit", + "fiadd", + "fidivr", + "fidiv", + "fisub", + "fisubr", + "fist", + "fistp", + "fisttp", + "fld", + "fld1", + "fldl2t", + "fldl2e", + "fldpi", + "fldlg2", + "fldln2", + "fldz", + "fldcw", + "fldenv", + "fmul", + "fmulp", + "fimul", + "fnop", + "fpatan", + "fprem", + "fprem1", + "fptan", + "frndint", + "frstor", + "fnsave", + "fscale", + "fsin", + "fsincos", + "fsqrt", + "fstp", + "fstp1", + "fstp8", + "fstp9", + "fst", + "fnstcw", + "fnstenv", + "fnstsw", + "fsub", + "fsubp", + "fsubr", + "fsubrp", + "ftst", + "fucom", + "fucomp", + "fucompp", + "fxam", + "fxch", + "fxch4", + "fxch7", + "fxrstor", + "fxsave", + "fxtract", + "fyl2x", + "fyl2xp1", + "hlt", + "idiv", + "in", + "imul", + "inc", + "insb", + "insw", + "insd", + "int1", + "int3", + "int", + "into", + "invd", + "invept", + "invlpg", + "invlpga", + "invvpid", + "iretw", + "iretd", + "iretq", + "jo", + "jno", + "jb", + "jae", + "jz", + "jnz", + "jbe", + "ja", + "js", + "jns", + "jp", + "jnp", + "jl", + "jge", + "jle", + "jg", + "jcxz", + "jecxz", + "jrcxz", + "jmp", + "lahf", + "lar", + "lddqu", + "ldmxcsr", + "lds", + "lea", + "les", + "lfs", + "lgs", + "lidt", + "lss", + "leave", + "lfence", + "lgdt", + "lldt", + "lmsw", + "lock", + "lodsb", + "lodsw", + "lodsd", + "lodsq", + "loopne", + "loope", + "loop", + "lsl", + "ltr", + "maskmovq", + "maxpd", + "maxps", + "maxsd", + "maxss", + "mfence", + "minpd", + "minps", + "minsd", + "minss", + "monitor", + "montmul", + "mov", + "movapd", + "movaps", + "movd", + "movhpd", + "movhps", + "movlhps", + "movlpd", + "movlps", + "movhlps", + "movmskpd", + "movmskps", + "movntdq", + "movnti", + "movntpd", + "movntps", + "movntq", + "movq", + "movsb", + "movsw", + "movsd", + "movsq", + "movss", + "movsx", + "movupd", + "movups", + "movzx", + "mul", + "mulpd", + "mulps", + "mulsd", + "mulss", + "mwait", + "neg", + "nop", + "not", + "or", + "orpd", + "orps", + "out", + "outsb", + "outsw", + "outsd", + "packsswb", + "packssdw", + "packuswb", + "paddb", + "paddw", + "paddd", + "paddsb", + "paddsw", + "paddusb", + "paddusw", + "pand", + "pandn", + "pavgb", + "pavgw", + "pcmpeqb", + "pcmpeqw", + "pcmpeqd", + "pcmpgtb", + "pcmpgtw", + "pcmpgtd", + "pextrb", + "pextrd", + "pextrq", + "pextrw", + "pinsrb", + "pinsrw", + "pinsrd", + "pinsrq", + "pmaddwd", + "pmaxsw", + "pmaxub", + "pminsw", + "pminub", + "pmovmskb", + "pmulhuw", + "pmulhw", + "pmullw", + "pop", + "popa", + "popad", + "popfw", + "popfd", + "popfq", + "por", + "prefetch", + "prefetchnta", + "prefetcht0", + "prefetcht1", + "prefetcht2", + "psadbw", + "pshufw", + "psllw", + "pslld", + "psllq", + "psraw", + "psrad", + "psrlw", + "psrld", + "psrlq", + "psubb", + "psubw", + "psubd", + "psubsb", + "psubsw", + "psubusb", + "psubusw", + "punpckhbw", + "punpckhwd", + "punpckhdq", + "punpcklbw", + "punpcklwd", + "punpckldq", + "pi2fw", + "pi2fd", + "pf2iw", + "pf2id", + "pfnacc", + "pfpnacc", + "pfcmpge", + "pfmin", + "pfrcp", + "pfrsqrt", + "pfsub", + "pfadd", + "pfcmpgt", + "pfmax", + "pfrcpit1", + "pfrsqit1", + "pfsubr", + "pfacc", + "pfcmpeq", + "pfmul", + "pfrcpit2", + "pmulhrw", + "pswapd", + "pavgusb", + "push", + "pusha", + "pushad", + "pushfw", + "pushfd", + "pushfq", + "pxor", + "rcl", + "rcr", + "rol", + "ror", + "rcpps", + "rcpss", + "rdmsr", + "rdpmc", + "rdtsc", + "rdtscp", + "repne", + "rep", + "ret", + "retf", + "rsm", + "rsqrtps", + "rsqrtss", + "sahf", + "salc", + "sar", + "shl", + "shr", + "sbb", + "scasb", + "scasw", + "scasd", + "scasq", + "seto", + "setno", + "setb", + "setae", + "setz", + "setnz", + "setbe", + "seta", + "sets", + "setns", + "setp", + "setnp", + "setl", + "setge", + "setle", + "setg", + "sfence", + "sgdt", + "shld", + "shrd", + "shufpd", + "shufps", + "sidt", + "sldt", + "smsw", + "sqrtps", + "sqrtpd", + "sqrtsd", + "sqrtss", + "stc", + "std", + "stgi", + "sti", + "skinit", + "stmxcsr", + "stosb", + "stosw", + "stosd", + "stosq", + "str", + "sub", + "subpd", + "subps", + "subsd", + "subss", + "swapgs", + "syscall", + "sysenter", + "sysexit", + "sysret", + "test", + "ucomisd", + "ucomiss", + "ud2", + "unpckhpd", + "unpckhps", + "unpcklps", + "unpcklpd", + "verr", + "verw", + "vmcall", + "vmclear", + "vmxon", + "vmptrld", + "vmptrst", + "vmlaunch", + "vmresume", + "vmxoff", + "vmread", + "vmwrite", + "vmrun", + "vmmcall", + "vmload", + "vmsave", + "wait", + "wbinvd", + "wrmsr", + "xadd", + "xchg", + "xgetbv", + "xlatb", + "xor", + "xorpd", + "xorps", + "xcryptecb", + "xcryptcbc", + "xcryptctr", + "xcryptcfb", + "xcryptofb", + "xrstor", + "xsave", + "xsetbv", + "xsha1", + "xsha256", + "xstore", + "aesdec", + "aesdeclast", + "aesenc", + "aesenclast", + "aesimc", + "aeskeygenassist", + "pclmulqdq", + "getsec", + "movdqa", + "maskmovdqu", + "movdq2q", + "movdqu", + "movq2dq", + "paddq", + "psubq", + "pmuludq", + "pshufhw", + "pshuflw", + "pshufd", + "pslldq", + "psrldq", + "punpckhqdq", + "punpcklqdq", + "addsubpd", + "addsubps", + "haddpd", + "haddps", + "hsubpd", + "hsubps", + "movddup", + "movshdup", + "movsldup", + "pabsb", + "pabsw", + "pabsd", + "pshufb", + "phaddw", + "phaddd", + "phaddsw", + "pmaddubsw", + "phsubw", + "phsubd", + "phsubsw", + "psignb", + "psignd", + "psignw", + "pmulhrsw", + "palignr", + "pblendvb", + "pmuldq", + "pminsb", + "pminsd", + "pminuw", + "pminud", + "pmaxsb", + "pmaxsd", + "pmaxud", + "pmaxuw", + "pmulld", + "phminposuw", + "roundps", + "roundpd", + "roundss", + "roundsd", + "blendpd", + "pblendw", + "blendps", + "blendvpd", + "blendvps", + "dpps", + "dppd", + "mpsadbw", + "extractps", + "insertps", + "movntdqa", + "packusdw", + "pmovsxbw", + "pmovsxbd", + "pmovsxbq", + "pmovsxwd", + "pmovsxwq", + "pmovsxdq", + "pmovzxbw", + "pmovzxbd", + "pmovzxbq", + "pmovzxwd", + "pmovzxwq", + "pmovzxdq", + "pcmpeqq", + "popcnt", + "ptest", + "pcmpestri", + "pcmpestrm", + "pcmpgtq", + "pcmpistri", + "pcmpistrm", + "movbe", + "crc32" +}; diff --git a/public/libudis86/itab.h b/public/libudis86/itab.h new file mode 100644 index 0000000000..778a76d610 --- /dev/null +++ b/public/libudis86/itab.h @@ -0,0 +1,678 @@ +#ifndef UD_ITAB_H +#define UD_ITAB_H + +/* itab.h -- generated by udis86:scripts/ud_itab.py, do no edit */ + +/* ud_table_type -- lookup table types (see decode.c) */ +enum ud_table_type { + UD_TAB__OPC_TABLE, + UD_TAB__OPC_X87, + UD_TAB__OPC_MOD, + UD_TAB__OPC_VEX_M, + UD_TAB__OPC_VEX_P, + UD_TAB__OPC_RM, + UD_TAB__OPC_VENDOR, + UD_TAB__OPC_OSIZE, + UD_TAB__OPC_MODE, + UD_TAB__OPC_3DNOW, + UD_TAB__OPC_REG, + UD_TAB__OPC_ASIZE, + UD_TAB__OPC_SSE +}; + +/* ud_mnemonic -- mnemonic constants */ +enum ud_mnemonic_code { + UD_Iinvalid, + UD_I3dnow, + UD_Inone, + UD_Idb, + UD_Ipause, + UD_Iaaa, + UD_Iaad, + UD_Iaam, + UD_Iaas, + UD_Iadc, + UD_Iadd, + UD_Iaddpd, + UD_Iaddps, + UD_Iaddsd, + UD_Iaddss, + UD_Iand, + UD_Iandpd, + UD_Iandps, + UD_Iandnpd, + UD_Iandnps, + UD_Iarpl, + UD_Imovsxd, + UD_Ibound, + UD_Ibsf, + UD_Ibsr, + UD_Ibswap, + UD_Ibt, + UD_Ibtc, + UD_Ibtr, + UD_Ibts, + UD_Icall, + UD_Icbw, + UD_Icwde, + UD_Icdqe, + UD_Iclc, + UD_Icld, + UD_Iclflush, + UD_Iclgi, + UD_Icli, + UD_Iclts, + UD_Icmc, + UD_Icmovo, + UD_Icmovno, + UD_Icmovb, + UD_Icmovae, + UD_Icmovz, + UD_Icmovnz, + UD_Icmovbe, + UD_Icmova, + UD_Icmovs, + UD_Icmovns, + UD_Icmovp, + UD_Icmovnp, + UD_Icmovl, + UD_Icmovge, + UD_Icmovle, + UD_Icmovg, + UD_Icmp, + UD_Icmppd, + UD_Icmpps, + UD_Icmpsb, + UD_Icmpsw, + UD_Icmpsd, + UD_Icmpsq, + UD_Icmpss, + UD_Icmpxchg, + UD_Icmpxchg8b, + UD_Icmpxchg16b, + UD_Icomisd, + UD_Icomiss, + UD_Icpuid, + UD_Icvtdq2pd, + UD_Icvtdq2ps, + UD_Icvtpd2dq, + UD_Icvtpd2pi, + UD_Icvtpd2ps, + UD_Icvtpi2ps, + UD_Icvtpi2pd, + UD_Icvtps2dq, + UD_Icvtps2pi, + UD_Icvtps2pd, + UD_Icvtsd2si, + UD_Icvtsd2ss, + UD_Icvtsi2ss, + UD_Icvtss2si, + UD_Icvtss2sd, + UD_Icvttpd2pi, + UD_Icvttpd2dq, + UD_Icvttps2dq, + UD_Icvttps2pi, + UD_Icvttsd2si, + UD_Icvtsi2sd, + UD_Icvttss2si, + UD_Icwd, + UD_Icdq, + UD_Icqo, + UD_Idaa, + UD_Idas, + UD_Idec, + UD_Idiv, + UD_Idivpd, + UD_Idivps, + UD_Idivsd, + UD_Idivss, + UD_Iemms, + UD_Ienter, + UD_If2xm1, + UD_Ifabs, + UD_Ifadd, + UD_Ifaddp, + UD_Ifbld, + UD_Ifbstp, + UD_Ifchs, + UD_Ifclex, + UD_Ifcmovb, + UD_Ifcmove, + UD_Ifcmovbe, + UD_Ifcmovu, + UD_Ifcmovnb, + UD_Ifcmovne, + UD_Ifcmovnbe, + UD_Ifcmovnu, + UD_Ifucomi, + UD_Ifcom, + UD_Ifcom2, + UD_Ifcomp3, + UD_Ifcomi, + UD_Ifucomip, + UD_Ifcomip, + UD_Ifcomp, + UD_Ifcomp5, + UD_Ifcompp, + UD_Ifcos, + UD_Ifdecstp, + UD_Ifdiv, + UD_Ifdivp, + UD_Ifdivr, + UD_Ifdivrp, + UD_Ifemms, + UD_Iffree, + UD_Iffreep, + UD_Ificom, + UD_Ificomp, + UD_Ifild, + UD_Ifincstp, + UD_Ifninit, + UD_Ifiadd, + UD_Ifidivr, + UD_Ifidiv, + UD_Ifisub, + UD_Ifisubr, + UD_Ifist, + UD_Ifistp, + UD_Ifisttp, + UD_Ifld, + UD_Ifld1, + UD_Ifldl2t, + UD_Ifldl2e, + UD_Ifldpi, + UD_Ifldlg2, + UD_Ifldln2, + UD_Ifldz, + UD_Ifldcw, + UD_Ifldenv, + UD_Ifmul, + UD_Ifmulp, + UD_Ifimul, + UD_Ifnop, + UD_Ifpatan, + UD_Ifprem, + UD_Ifprem1, + UD_Ifptan, + UD_Ifrndint, + UD_Ifrstor, + UD_Ifnsave, + UD_Ifscale, + UD_Ifsin, + UD_Ifsincos, + UD_Ifsqrt, + UD_Ifstp, + UD_Ifstp1, + UD_Ifstp8, + UD_Ifstp9, + UD_Ifst, + UD_Ifnstcw, + UD_Ifnstenv, + UD_Ifnstsw, + UD_Ifsub, + UD_Ifsubp, + UD_Ifsubr, + UD_Ifsubrp, + UD_Iftst, + UD_Ifucom, + UD_Ifucomp, + UD_Ifucompp, + UD_Ifxam, + UD_Ifxch, + UD_Ifxch4, + UD_Ifxch7, + UD_Ifxrstor, + UD_Ifxsave, + UD_Ifxtract, + UD_Ifyl2x, + UD_Ifyl2xp1, + UD_Ihlt, + UD_Iidiv, + UD_Iin, + UD_Iimul, + UD_Iinc, + UD_Iinsb, + UD_Iinsw, + UD_Iinsd, + UD_Iint1, + UD_Iint3, + UD_Iint, + UD_Iinto, + UD_Iinvd, + UD_Iinvept, + UD_Iinvlpg, + UD_Iinvlpga, + UD_Iinvvpid, + UD_Iiretw, + UD_Iiretd, + UD_Iiretq, + UD_Ijo, + UD_Ijno, + UD_Ijb, + UD_Ijae, + UD_Ijz, + UD_Ijnz, + UD_Ijbe, + UD_Ija, + UD_Ijs, + UD_Ijns, + UD_Ijp, + UD_Ijnp, + UD_Ijl, + UD_Ijge, + UD_Ijle, + UD_Ijg, + UD_Ijcxz, + UD_Ijecxz, + UD_Ijrcxz, + UD_Ijmp, + UD_Ilahf, + UD_Ilar, + UD_Ilddqu, + UD_Ildmxcsr, + UD_Ilds, + UD_Ilea, + UD_Iles, + UD_Ilfs, + UD_Ilgs, + UD_Ilidt, + UD_Ilss, + UD_Ileave, + UD_Ilfence, + UD_Ilgdt, + UD_Illdt, + UD_Ilmsw, + UD_Ilock, + UD_Ilodsb, + UD_Ilodsw, + UD_Ilodsd, + UD_Ilodsq, + UD_Iloopne, + UD_Iloope, + UD_Iloop, + UD_Ilsl, + UD_Iltr, + UD_Imaskmovq, + UD_Imaxpd, + UD_Imaxps, + UD_Imaxsd, + UD_Imaxss, + UD_Imfence, + UD_Iminpd, + UD_Iminps, + UD_Iminsd, + UD_Iminss, + UD_Imonitor, + UD_Imontmul, + UD_Imov, + UD_Imovapd, + UD_Imovaps, + UD_Imovd, + UD_Imovhpd, + UD_Imovhps, + UD_Imovlhps, + UD_Imovlpd, + UD_Imovlps, + UD_Imovhlps, + UD_Imovmskpd, + UD_Imovmskps, + UD_Imovntdq, + UD_Imovnti, + UD_Imovntpd, + UD_Imovntps, + UD_Imovntq, + UD_Imovq, + UD_Imovsb, + UD_Imovsw, + UD_Imovsd, + UD_Imovsq, + UD_Imovss, + UD_Imovsx, + UD_Imovupd, + UD_Imovups, + UD_Imovzx, + UD_Imul, + UD_Imulpd, + UD_Imulps, + UD_Imulsd, + UD_Imulss, + UD_Imwait, + UD_Ineg, + UD_Inop, + UD_Inot, + UD_Ior, + UD_Iorpd, + UD_Iorps, + UD_Iout, + UD_Ioutsb, + UD_Ioutsw, + UD_Ioutsd, + UD_Ipacksswb, + UD_Ipackssdw, + UD_Ipackuswb, + UD_Ipaddb, + UD_Ipaddw, + UD_Ipaddd, + UD_Ipaddsb, + UD_Ipaddsw, + UD_Ipaddusb, + UD_Ipaddusw, + UD_Ipand, + UD_Ipandn, + UD_Ipavgb, + UD_Ipavgw, + UD_Ipcmpeqb, + UD_Ipcmpeqw, + UD_Ipcmpeqd, + UD_Ipcmpgtb, + UD_Ipcmpgtw, + UD_Ipcmpgtd, + UD_Ipextrb, + UD_Ipextrd, + UD_Ipextrq, + UD_Ipextrw, + UD_Ipinsrb, + UD_Ipinsrw, + UD_Ipinsrd, + UD_Ipinsrq, + UD_Ipmaddwd, + UD_Ipmaxsw, + UD_Ipmaxub, + UD_Ipminsw, + UD_Ipminub, + UD_Ipmovmskb, + UD_Ipmulhuw, + UD_Ipmulhw, + UD_Ipmullw, + UD_Ipop, + UD_Ipopa, + UD_Ipopad, + UD_Ipopfw, + UD_Ipopfd, + UD_Ipopfq, + UD_Ipor, + UD_Iprefetch, + UD_Iprefetchnta, + UD_Iprefetcht0, + UD_Iprefetcht1, + UD_Iprefetcht2, + UD_Ipsadbw, + UD_Ipshufw, + UD_Ipsllw, + UD_Ipslld, + UD_Ipsllq, + UD_Ipsraw, + UD_Ipsrad, + UD_Ipsrlw, + UD_Ipsrld, + UD_Ipsrlq, + UD_Ipsubb, + UD_Ipsubw, + UD_Ipsubd, + UD_Ipsubsb, + UD_Ipsubsw, + UD_Ipsubusb, + UD_Ipsubusw, + UD_Ipunpckhbw, + UD_Ipunpckhwd, + UD_Ipunpckhdq, + UD_Ipunpcklbw, + UD_Ipunpcklwd, + UD_Ipunpckldq, + UD_Ipi2fw, + UD_Ipi2fd, + UD_Ipf2iw, + UD_Ipf2id, + UD_Ipfnacc, + UD_Ipfpnacc, + UD_Ipfcmpge, + UD_Ipfmin, + UD_Ipfrcp, + UD_Ipfrsqrt, + UD_Ipfsub, + UD_Ipfadd, + UD_Ipfcmpgt, + UD_Ipfmax, + UD_Ipfrcpit1, + UD_Ipfrsqit1, + UD_Ipfsubr, + UD_Ipfacc, + UD_Ipfcmpeq, + UD_Ipfmul, + UD_Ipfrcpit2, + UD_Ipmulhrw, + UD_Ipswapd, + UD_Ipavgusb, + UD_Ipush, + UD_Ipusha, + UD_Ipushad, + UD_Ipushfw, + UD_Ipushfd, + UD_Ipushfq, + UD_Ipxor, + UD_Ircl, + UD_Ircr, + UD_Irol, + UD_Iror, + UD_Ircpps, + UD_Ircpss, + UD_Irdmsr, + UD_Irdpmc, + UD_Irdtsc, + UD_Irdtscp, + UD_Irepne, + UD_Irep, + UD_Iret, + UD_Iretf, + UD_Irsm, + UD_Irsqrtps, + UD_Irsqrtss, + UD_Isahf, + UD_Isalc, + UD_Isar, + UD_Ishl, + UD_Ishr, + UD_Isbb, + UD_Iscasb, + UD_Iscasw, + UD_Iscasd, + UD_Iscasq, + UD_Iseto, + UD_Isetno, + UD_Isetb, + UD_Isetae, + UD_Isetz, + UD_Isetnz, + UD_Isetbe, + UD_Iseta, + UD_Isets, + UD_Isetns, + UD_Isetp, + UD_Isetnp, + UD_Isetl, + UD_Isetge, + UD_Isetle, + UD_Isetg, + UD_Isfence, + UD_Isgdt, + UD_Ishld, + UD_Ishrd, + UD_Ishufpd, + UD_Ishufps, + UD_Isidt, + UD_Isldt, + UD_Ismsw, + UD_Isqrtps, + UD_Isqrtpd, + UD_Isqrtsd, + UD_Isqrtss, + UD_Istc, + UD_Istd, + UD_Istgi, + UD_Isti, + UD_Iskinit, + UD_Istmxcsr, + UD_Istosb, + UD_Istosw, + UD_Istosd, + UD_Istosq, + UD_Istr, + UD_Isub, + UD_Isubpd, + UD_Isubps, + UD_Isubsd, + UD_Isubss, + UD_Iswapgs, + UD_Isyscall, + UD_Isysenter, + UD_Isysexit, + UD_Isysret, + UD_Itest, + UD_Iucomisd, + UD_Iucomiss, + UD_Iud2, + UD_Iunpckhpd, + UD_Iunpckhps, + UD_Iunpcklps, + UD_Iunpcklpd, + UD_Iverr, + UD_Iverw, + UD_Ivmcall, + UD_Ivmclear, + UD_Ivmxon, + UD_Ivmptrld, + UD_Ivmptrst, + UD_Ivmlaunch, + UD_Ivmresume, + UD_Ivmxoff, + UD_Ivmread, + UD_Ivmwrite, + UD_Ivmrun, + UD_Ivmmcall, + UD_Ivmload, + UD_Ivmsave, + UD_Iwait, + UD_Iwbinvd, + UD_Iwrmsr, + UD_Ixadd, + UD_Ixchg, + UD_Ixgetbv, + UD_Ixlatb, + UD_Ixor, + UD_Ixorpd, + UD_Ixorps, + UD_Ixcryptecb, + UD_Ixcryptcbc, + UD_Ixcryptctr, + UD_Ixcryptcfb, + UD_Ixcryptofb, + UD_Ixrstor, + UD_Ixsave, + UD_Ixsetbv, + UD_Ixsha1, + UD_Ixsha256, + UD_Ixstore, + UD_Iaesdec, + UD_Iaesdeclast, + UD_Iaesenc, + UD_Iaesenclast, + UD_Iaesimc, + UD_Iaeskeygenassist, + UD_Ipclmulqdq, + UD_Igetsec, + UD_Imovdqa, + UD_Imaskmovdqu, + UD_Imovdq2q, + UD_Imovdqu, + UD_Imovq2dq, + UD_Ipaddq, + UD_Ipsubq, + UD_Ipmuludq, + UD_Ipshufhw, + UD_Ipshuflw, + UD_Ipshufd, + UD_Ipslldq, + UD_Ipsrldq, + UD_Ipunpckhqdq, + UD_Ipunpcklqdq, + UD_Iaddsubpd, + UD_Iaddsubps, + UD_Ihaddpd, + UD_Ihaddps, + UD_Ihsubpd, + UD_Ihsubps, + UD_Imovddup, + UD_Imovshdup, + UD_Imovsldup, + UD_Ipabsb, + UD_Ipabsw, + UD_Ipabsd, + UD_Ipshufb, + UD_Iphaddw, + UD_Iphaddd, + UD_Iphaddsw, + UD_Ipmaddubsw, + UD_Iphsubw, + UD_Iphsubd, + UD_Iphsubsw, + UD_Ipsignb, + UD_Ipsignd, + UD_Ipsignw, + UD_Ipmulhrsw, + UD_Ipalignr, + UD_Ipblendvb, + UD_Ipmuldq, + UD_Ipminsb, + UD_Ipminsd, + UD_Ipminuw, + UD_Ipminud, + UD_Ipmaxsb, + UD_Ipmaxsd, + UD_Ipmaxud, + UD_Ipmaxuw, + UD_Ipmulld, + UD_Iphminposuw, + UD_Iroundps, + UD_Iroundpd, + UD_Iroundss, + UD_Iroundsd, + UD_Iblendpd, + UD_Ipblendw, + UD_Iblendps, + UD_Iblendvpd, + UD_Iblendvps, + UD_Idpps, + UD_Idppd, + UD_Impsadbw, + UD_Iextractps, + UD_Iinsertps, + UD_Imovntdqa, + UD_Ipackusdw, + UD_Ipmovsxbw, + UD_Ipmovsxbd, + UD_Ipmovsxbq, + UD_Ipmovsxwd, + UD_Ipmovsxwq, + UD_Ipmovsxdq, + UD_Ipmovzxbw, + UD_Ipmovzxbd, + UD_Ipmovzxbq, + UD_Ipmovzxwd, + UD_Ipmovzxwq, + UD_Ipmovzxdq, + UD_Ipcmpeqq, + UD_Ipopcnt, + UD_Iptest, + UD_Ipcmpestri, + UD_Ipcmpestrm, + UD_Ipcmpgtq, + UD_Ipcmpistri, + UD_Ipcmpistrm, + UD_Imovbe, + UD_Icrc32, + UD_MAX_MNEMONIC_CODE +} UD_ATTR_PACKED; + +extern const char * ud_mnemonics_str[]; + +#endif /* UD_ITAB_H */ diff --git a/public/libudis86/syn-att.c b/public/libudis86/syn-att.c new file mode 100644 index 0000000000..dc9d73929c --- /dev/null +++ b/public/libudis86/syn-att.c @@ -0,0 +1,224 @@ +/* udis86 - libudis86/syn-att.c + * + * Copyright (c) 2002-2009 Vivek Thampi + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "types.h" +#include "extern.h" +#include "decode.h" +#include "itab.h" +#include "syn.h" +#include "udint.h" + +/* ----------------------------------------------------------------------------- + * opr_cast() - Prints an operand cast. + * ----------------------------------------------------------------------------- + */ +static void +opr_cast(struct ud* u, struct ud_operand* op) +{ + switch(op->size) { + case 16 : case 32 : + ud_asmprintf(u, "*"); break; + default: break; + } +} + +/* ----------------------------------------------------------------------------- + * gen_operand() - Generates assembly output for each operand. + * ----------------------------------------------------------------------------- + */ +static void +gen_operand(struct ud* u, struct ud_operand* op) +{ + switch(op->type) { + case UD_OP_CONST: + ud_asmprintf(u, "$0x%x", op->lval.udword); + break; + + case UD_OP_REG: + ud_asmprintf(u, "%%%s", ud_reg_tab[op->base - UD_R_AL]); + break; + + case UD_OP_MEM: + if (u->br_far) { + opr_cast(u, op); + } + if (u->pfx_seg) { + ud_asmprintf(u, "%%%s:", ud_reg_tab[u->pfx_seg - UD_R_AL]); + } + if (op->offset != 0) { + ud_syn_print_mem_disp(u, op, 0); + } + if (op->base) { + ud_asmprintf(u, "(%%%s", ud_reg_tab[op->base - UD_R_AL]); + } + if (op->index) { + if (op->base) { + ud_asmprintf(u, ","); + } else { + ud_asmprintf(u, "("); + } + ud_asmprintf(u, "%%%s", ud_reg_tab[op->index - UD_R_AL]); + } + if (op->scale) { + ud_asmprintf(u, ",%d", op->scale); + } + if (op->base || op->index) { + ud_asmprintf(u, ")"); + } + break; + + case UD_OP_IMM: + ud_asmprintf(u, "$"); + ud_syn_print_imm(u, op); + break; + + case UD_OP_JIMM: + ud_syn_print_addr(u, ud_syn_rel_target(u, op)); + break; + + case UD_OP_PTR: + switch (op->size) { + case 32: + ud_asmprintf(u, "$0x%x, $0x%x", op->lval.ptr.seg, + op->lval.ptr.off & 0xFFFF); + break; + case 48: + ud_asmprintf(u, "$0x%x, $0x%x", op->lval.ptr.seg, + op->lval.ptr.off); + break; + } + break; + + default: return; + } +} + +/* ============================================================================= + * translates to AT&T syntax + * ============================================================================= + */ +extern void +ud_translate_att(struct ud *u) +{ + int size = 0; + int star = 0; + + /* check if P_OSO prefix is used */ + if (! P_OSO(u->itab_entry->prefix) && u->pfx_opr) { + switch (u->dis_mode) { + case 16: + ud_asmprintf(u, "o32 "); + break; + case 32: + case 64: + ud_asmprintf(u, "o16 "); + break; + } + } + + /* check if P_ASO prefix was used */ + if (! P_ASO(u->itab_entry->prefix) && u->pfx_adr) { + switch (u->dis_mode) { + case 16: + ud_asmprintf(u, "a32 "); + break; + case 32: + ud_asmprintf(u, "a16 "); + break; + case 64: + ud_asmprintf(u, "a32 "); + break; + } + } + + if (u->pfx_lock) + ud_asmprintf(u, "lock "); + if (u->pfx_rep) { + ud_asmprintf(u, "rep "); + } else if (u->pfx_rep) { + ud_asmprintf(u, "repe "); + } else if (u->pfx_repne) { + ud_asmprintf(u, "repne "); + } + + /* special instructions */ + switch (u->mnemonic) { + case UD_Iretf: + ud_asmprintf(u, "lret "); + break; + case UD_Idb: + ud_asmprintf(u, ".byte 0x%x", u->operand[0].lval.ubyte); + return; + case UD_Ijmp: + case UD_Icall: + if (u->br_far) ud_asmprintf(u, "l"); + if (u->operand[0].type == UD_OP_REG) { + star = 1; + } + ud_asmprintf(u, "%s", ud_lookup_mnemonic(u->mnemonic)); + break; + case UD_Ibound: + case UD_Ienter: + if (u->operand[0].type != UD_NONE) + gen_operand(u, &u->operand[0]); + if (u->operand[1].type != UD_NONE) { + ud_asmprintf(u, ","); + gen_operand(u, &u->operand[1]); + } + return; + default: + ud_asmprintf(u, "%s", ud_lookup_mnemonic(u->mnemonic)); + } + + if (size == 8) + ud_asmprintf(u, "b"); + else if (size == 16) + ud_asmprintf(u, "w"); + else if (size == 64) + ud_asmprintf(u, "q"); + + if (star) { + ud_asmprintf(u, " *"); + } else { + ud_asmprintf(u, " "); + } + + if (u->operand[2].type != UD_NONE) { + gen_operand(u, &u->operand[2]); + ud_asmprintf(u, ", "); + } + + if (u->operand[1].type != UD_NONE) { + gen_operand(u, &u->operand[1]); + ud_asmprintf(u, ", "); + } + + if (u->operand[0].type != UD_NONE) + gen_operand(u, &u->operand[0]); +} + +/* +vim: set ts=2 sw=2 expandtab +*/ diff --git a/public/libudis86/syn-intel.c b/public/libudis86/syn-intel.c new file mode 100644 index 0000000000..e4d8409ee1 --- /dev/null +++ b/public/libudis86/syn-intel.c @@ -0,0 +1,213 @@ +/* udis86 - libudis86/syn-intel.c + * + * Copyright (c) 2002-2013 Vivek Thampi + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "types.h" +#include "extern.h" +#include "decode.h" +#include "itab.h" +#include "syn.h" +#include "udint.h" + +/* ----------------------------------------------------------------------------- + * opr_cast() - Prints an operand cast. + * ----------------------------------------------------------------------------- + */ +static void +opr_cast(struct ud* u, struct ud_operand* op) +{ + if (u->br_far) { + ud_asmprintf(u, "far "); + } + switch(op->size) { + case 8: ud_asmprintf(u, "byte " ); break; + case 16: ud_asmprintf(u, "word " ); break; + case 32: ud_asmprintf(u, "dword "); break; + case 64: ud_asmprintf(u, "qword "); break; + case 80: ud_asmprintf(u, "tword "); break; + default: break; + } +} + +/* ----------------------------------------------------------------------------- + * gen_operand() - Generates assembly output for each operand. + * ----------------------------------------------------------------------------- + */ +static void gen_operand(struct ud* u, struct ud_operand* op, int syn_cast) +{ + switch(op->type) { + case UD_OP_REG: + ud_asmprintf(u, "%s", ud_reg_tab[op->base - UD_R_AL]); + break; + + case UD_OP_MEM: + if (syn_cast) { + opr_cast(u, op); + } + ud_asmprintf(u, "["); + if (u->pfx_seg) { + ud_asmprintf(u, "%s:", ud_reg_tab[u->pfx_seg - UD_R_AL]); + } + if (op->base) { + ud_asmprintf(u, "%s", ud_reg_tab[op->base - UD_R_AL]); + } + if (op->index) { + ud_asmprintf(u, "%s%s", op->base != UD_NONE? "+" : "", + ud_reg_tab[op->index - UD_R_AL]); + if (op->scale) { + ud_asmprintf(u, "*%d", op->scale); + } + } + if (op->offset != 0) { + ud_syn_print_mem_disp(u, op, (op->base != UD_NONE || + op->index != UD_NONE) ? 1 : 0); + } + ud_asmprintf(u, "]"); + break; + + case UD_OP_IMM: + ud_syn_print_imm(u, op); + break; + + + case UD_OP_JIMM: + ud_syn_print_addr(u, ud_syn_rel_target(u, op)); + break; + + case UD_OP_PTR: + switch (op->size) { + case 32: + ud_asmprintf(u, "word 0x%x:0x%x", op->lval.ptr.seg, + op->lval.ptr.off & 0xFFFF); + break; + case 48: + ud_asmprintf(u, "dword 0x%x:0x%x", op->lval.ptr.seg, + op->lval.ptr.off); + break; + } + break; + + case UD_OP_CONST: + if (syn_cast) opr_cast(u, op); + ud_asmprintf(u, "%d", op->lval.udword); + break; + + default: return; + } +} + +/* ============================================================================= + * translates to intel syntax + * ============================================================================= + */ +extern void +ud_translate_intel(struct ud* u) +{ + /* check if P_OSO prefix is used */ + if (!P_OSO(u->itab_entry->prefix) && u->pfx_opr) { + switch (u->dis_mode) { + case 16: ud_asmprintf(u, "o32 "); break; + case 32: + case 64: ud_asmprintf(u, "o16 "); break; + } + } + + /* check if P_ASO prefix was used */ + if (!P_ASO(u->itab_entry->prefix) && u->pfx_adr) { + switch (u->dis_mode) { + case 16: ud_asmprintf(u, "a32 "); break; + case 32: ud_asmprintf(u, "a16 "); break; + case 64: ud_asmprintf(u, "a32 "); break; + } + } + + if (u->pfx_seg && + u->operand[0].type != UD_OP_MEM && + u->operand[1].type != UD_OP_MEM ) { + ud_asmprintf(u, "%s ", ud_reg_tab[u->pfx_seg - UD_R_AL]); + } + + if (u->pfx_lock) { + ud_asmprintf(u, "lock "); + } + if (u->pfx_rep) { + ud_asmprintf(u, "rep "); + } else if (u->pfx_repe) { + ud_asmprintf(u, "repe "); + } else if (u->pfx_repne) { + ud_asmprintf(u, "repne "); + } + + /* print the instruction mnemonic */ + ud_asmprintf(u, "%s", ud_lookup_mnemonic(u->mnemonic)); + + if (u->operand[0].type != UD_NONE) { + int cast = 0; + ud_asmprintf(u, " "); + if (u->operand[0].type == UD_OP_MEM) { + if (u->operand[1].type == UD_OP_IMM || + u->operand[1].type == UD_OP_CONST || + u->operand[1].type == UD_NONE || + (u->operand[0].size != u->operand[1].size && + u->operand[1].type != UD_OP_REG)) { + cast = 1; + } else if (u->operand[1].type == UD_OP_REG && + u->operand[1].base == UD_R_CL) { + switch (u->mnemonic) { + case UD_Ircl: + case UD_Irol: + case UD_Iror: + case UD_Ircr: + case UD_Ishl: + case UD_Ishr: + case UD_Isar: + cast = 1; + break; + default: break; + } + } + } + gen_operand(u, &u->operand[0], cast); + } + + if (u->operand[1].type != UD_NONE) { + int cast = 0; + ud_asmprintf(u, ", "); + if (u->operand[1].type == UD_OP_MEM && + u->operand[0].size != u->operand[1].size && + !ud_opr_is_sreg(&u->operand[0])) { + cast = 1; + } + gen_operand(u, &u->operand[1], cast); + } + + if (u->operand[2].type != UD_NONE) { + ud_asmprintf(u, ", "); + gen_operand(u, &u->operand[2], 0); + } +} + +/* +vim: set ts=2 sw=2 expandtab +*/ diff --git a/public/libudis86/syn.c b/public/libudis86/syn.c new file mode 100644 index 0000000000..5c54cfbeb1 --- /dev/null +++ b/public/libudis86/syn.c @@ -0,0 +1,207 @@ +/* udis86 - libudis86/syn.c + * + * Copyright (c) 2002-2013 Vivek Thampi + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "types.h" +#include "decode.h" +#include "syn.h" +#include "udint.h" + +/* ----------------------------------------------------------------------------- + * Intel Register Table - Order Matters (types.h)! + * ----------------------------------------------------------------------------- + */ +const char* ud_reg_tab[] = +{ + "al", "cl", "dl", "bl", + "ah", "ch", "dh", "bh", + "spl", "bpl", "sil", "dil", + "r8b", "r9b", "r10b", "r11b", + "r12b", "r13b", "r14b", "r15b", + + "ax", "cx", "dx", "bx", + "sp", "bp", "si", "di", + "r8w", "r9w", "r10w", "r11w", + "r12w", "r13w" , "r14w", "r15w", + + "eax", "ecx", "edx", "ebx", + "esp", "ebp", "esi", "edi", + "r8d", "r9d", "r10d", "r11d", + "r12d", "r13d", "r14d", "r15d", + + "rax", "rcx", "rdx", "rbx", + "rsp", "rbp", "rsi", "rdi", + "r8", "r9", "r10", "r11", + "r12", "r13", "r14", "r15", + + "es", "cs", "ss", "ds", + "fs", "gs", + + "cr0", "cr1", "cr2", "cr3", + "cr4", "cr5", "cr6", "cr7", + "cr8", "cr9", "cr10", "cr11", + "cr12", "cr13", "cr14", "cr15", + + "dr0", "dr1", "dr2", "dr3", + "dr4", "dr5", "dr6", "dr7", + "dr8", "dr9", "dr10", "dr11", + "dr12", "dr13", "dr14", "dr15", + + "mm0", "mm1", "mm2", "mm3", + "mm4", "mm5", "mm6", "mm7", + + "st0", "st1", "st2", "st3", + "st4", "st5", "st6", "st7", + + "xmm0", "xmm1", "xmm2", "xmm3", + "xmm4", "xmm5", "xmm6", "xmm7", + "xmm8", "xmm9", "xmm10", "xmm11", + "xmm12", "xmm13", "xmm14", "xmm15", + + "rip" +}; + + +uint64_t +ud_syn_rel_target(struct ud *u, struct ud_operand *opr) +{ + const uint64_t trunc_mask = 0xffffffffffffffffull >> (64 - u->opr_mode); + switch (opr->size) { + case 8 : return (u->pc + opr->lval.sbyte) & trunc_mask; + case 16: return (u->pc + opr->lval.sword) & trunc_mask; + case 32: return (u->pc + opr->lval.sdword) & trunc_mask; + default: UD_ASSERT(!"invalid relative offset size."); + return 0ull; + } +} + + +/* + * asmprintf + * Printf style function for printing translated assembly + * output. Returns the number of characters written and + * moves the buffer pointer forward. On an overflow, + * returns a negative number and truncates the output. + */ +int +ud_asmprintf(struct ud *u, const char *fmt, ...) +{ + int ret; + int avail; + va_list ap; + va_start(ap, fmt); + avail = u->asm_buf_size - u->asm_buf_fill - 1 /* nullchar */; + ret = vsnprintf((char*) u->asm_buf + u->asm_buf_fill, avail, fmt, ap); + if (ret < 0 || ret > avail) { + u->asm_buf_fill = u->asm_buf_size - 1; + } else { + u->asm_buf_fill += ret; + } + va_end(ap); + return ret; +} + + +void +ud_syn_print_addr(struct ud *u, uint64_t addr) +{ + const char *name = NULL; + if (u->sym_resolver) { + int64_t offset = 0; + name = u->sym_resolver(u, addr, &offset); + if (name) { + if (offset) { + ud_asmprintf(u, "%s%+" FMT64 "d", name, offset); + } else { + ud_asmprintf(u, "%s", name); + } + return; + } + } + ud_asmprintf(u, "0x%" FMT64 "x", addr); +} + + +void +ud_syn_print_imm(struct ud* u, const struct ud_operand *op) +{ + uint64_t v; + if (op->_oprcode == OP_sI && op->size != u->opr_mode) { + if (op->size == 8) { + v = (int64_t)op->lval.sbyte; + } else { + UD_ASSERT(op->size == 32); + v = (int64_t)op->lval.sdword; + } + if (u->opr_mode < 64) { + v = v & ((1ull << u->opr_mode) - 1ull); + } + } else { + switch (op->size) { + case 8 : v = op->lval.ubyte; break; + case 16: v = op->lval.uword; break; + case 32: v = op->lval.udword; break; + case 64: v = op->lval.uqword; break; + default: UD_ASSERT(!"invalid offset"); v = 0; /* keep cc happy */ + } + } + ud_asmprintf(u, "0x%" FMT64 "x", v); +} + + +void +ud_syn_print_mem_disp(struct ud* u, const struct ud_operand *op, int sign) +{ + UD_ASSERT(op->offset != 0); + if (op->base == UD_NONE && op->index == UD_NONE) { + uint64_t v; + UD_ASSERT(op->scale == UD_NONE && op->offset != 8); + /* unsigned mem-offset */ + switch (op->offset) { + case 16: v = op->lval.uword; break; + case 32: v = op->lval.udword; break; + case 64: v = op->lval.uqword; break; + default: UD_ASSERT(!"invalid offset"); v = 0; /* keep cc happy */ + } + ud_asmprintf(u, "0x%" FMT64 "x", v); + } else { + int64_t v; + UD_ASSERT(op->offset != 64); + switch (op->offset) { + case 8 : v = op->lval.sbyte; break; + case 16: v = op->lval.sword; break; + case 32: v = op->lval.sdword; break; + default: UD_ASSERT(!"invalid offset"); v = 0; /* keep cc happy */ + } + if (v < 0) { + ud_asmprintf(u, "-0x%" FMT64 "x", -v); + } else if (v > 0) { + ud_asmprintf(u, "%s0x%" FMT64 "x", sign? "+" : "", v); + } + } +} + +/* +vim: set ts=2 sw=2 expandtab +*/ diff --git a/public/libudis86/syn.h b/public/libudis86/syn.h new file mode 100644 index 0000000000..d3b1e3fe04 --- /dev/null +++ b/public/libudis86/syn.h @@ -0,0 +1,53 @@ +/* udis86 - libudis86/syn.h + * + * Copyright (c) 2002-2009 + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef UD_SYN_H +#define UD_SYN_H + +#include "types.h" +#ifndef __UD_STANDALONE__ +# include +#endif /* __UD_STANDALONE__ */ + +extern const char* ud_reg_tab[]; + +uint64_t ud_syn_rel_target(struct ud*, struct ud_operand*); + +#ifdef __GNUC__ +int ud_asmprintf(struct ud *u, const char *fmt, ...) + __attribute__ ((format (printf, 2, 3))); +#else +int ud_asmprintf(struct ud *u, const char *fmt, ...); +#endif + +void ud_syn_print_addr(struct ud *u, uint64_t addr); +void ud_syn_print_imm(struct ud* u, const struct ud_operand *op); +void ud_syn_print_mem_disp(struct ud* u, const struct ud_operand *, int sign); + +#endif /* UD_SYN_H */ + +/* +vim: set ts=2 sw=2 expandtab +*/ diff --git a/public/libudis86/types.h b/public/libudis86/types.h new file mode 100644 index 0000000000..8b012a98e6 --- /dev/null +++ b/public/libudis86/types.h @@ -0,0 +1,250 @@ +/* udis86 - libudis86/types.h + * + * Copyright (c) 2002-2013 Vivek Thampi + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef UD_TYPES_H +#define UD_TYPES_H + +#ifdef __KERNEL__ + /* -D__KERNEL__ is automatically passed on the command line when + building something as part of the Linux kernel */ +# include +# include +# ifndef __UD_STANDALONE__ +# define __UD_STANDALONE__ 1 +#endif +#endif /* __KERNEL__ */ + +#if defined(_MSC_VER) || defined(__BORLANDC__) +# include +# include +# define inline __inline /* MS Visual Studio requires __inline + instead of inline for C code */ +#elif !defined(__UD_STANDALONE__) +# include +# include +#endif /* !__UD_STANDALONE__ */ + +/* gcc specific extensions */ +#ifdef __GNUC__ +# define UD_ATTR_PACKED __attribute__((packed)) +#else +# define UD_ATTR_PACKED +#endif /* UD_ATTR_PACKED */ + + +/* ----------------------------------------------------------------------------- + * All possible "types" of objects in udis86. Order is Important! + * ----------------------------------------------------------------------------- + */ +enum ud_type +{ + UD_NONE, + + /* 8 bit GPRs */ + UD_R_AL, UD_R_CL, UD_R_DL, UD_R_BL, + UD_R_AH, UD_R_CH, UD_R_DH, UD_R_BH, + UD_R_SPL, UD_R_BPL, UD_R_SIL, UD_R_DIL, + UD_R_R8B, UD_R_R9B, UD_R_R10B, UD_R_R11B, + UD_R_R12B, UD_R_R13B, UD_R_R14B, UD_R_R15B, + + /* 16 bit GPRs */ + UD_R_AX, UD_R_CX, UD_R_DX, UD_R_BX, + UD_R_SP, UD_R_BP, UD_R_SI, UD_R_DI, + UD_R_R8W, UD_R_R9W, UD_R_R10W, UD_R_R11W, + UD_R_R12W, UD_R_R13W, UD_R_R14W, UD_R_R15W, + + /* 32 bit GPRs */ + UD_R_EAX, UD_R_ECX, UD_R_EDX, UD_R_EBX, + UD_R_ESP, UD_R_EBP, UD_R_ESI, UD_R_EDI, + UD_R_R8D, UD_R_R9D, UD_R_R10D, UD_R_R11D, + UD_R_R12D, UD_R_R13D, UD_R_R14D, UD_R_R15D, + + /* 64 bit GPRs */ + UD_R_RAX, UD_R_RCX, UD_R_RDX, UD_R_RBX, + UD_R_RSP, UD_R_RBP, UD_R_RSI, UD_R_RDI, + UD_R_R8, UD_R_R9, UD_R_R10, UD_R_R11, + UD_R_R12, UD_R_R13, UD_R_R14, UD_R_R15, + + /* segment registers */ + UD_R_ES, UD_R_CS, UD_R_SS, UD_R_DS, + UD_R_FS, UD_R_GS, + + /* control registers*/ + UD_R_CR0, UD_R_CR1, UD_R_CR2, UD_R_CR3, + UD_R_CR4, UD_R_CR5, UD_R_CR6, UD_R_CR7, + UD_R_CR8, UD_R_CR9, UD_R_CR10, UD_R_CR11, + UD_R_CR12, UD_R_CR13, UD_R_CR14, UD_R_CR15, + + /* debug registers */ + UD_R_DR0, UD_R_DR1, UD_R_DR2, UD_R_DR3, + UD_R_DR4, UD_R_DR5, UD_R_DR6, UD_R_DR7, + UD_R_DR8, UD_R_DR9, UD_R_DR10, UD_R_DR11, + UD_R_DR12, UD_R_DR13, UD_R_DR14, UD_R_DR15, + + /* mmx registers */ + UD_R_MM0, UD_R_MM1, UD_R_MM2, UD_R_MM3, + UD_R_MM4, UD_R_MM5, UD_R_MM6, UD_R_MM7, + + /* x87 registers */ + UD_R_ST0, UD_R_ST1, UD_R_ST2, UD_R_ST3, + UD_R_ST4, UD_R_ST5, UD_R_ST6, UD_R_ST7, + + /* extended multimedia registers */ + UD_R_XMM0, UD_R_XMM1, UD_R_XMM2, UD_R_XMM3, + UD_R_XMM4, UD_R_XMM5, UD_R_XMM6, UD_R_XMM7, + UD_R_XMM8, UD_R_XMM9, UD_R_XMM10, UD_R_XMM11, + UD_R_XMM12, UD_R_XMM13, UD_R_XMM14, UD_R_XMM15, + + UD_R_RIP, + + /* Operand Types */ + UD_OP_REG, UD_OP_MEM, UD_OP_PTR, UD_OP_IMM, + UD_OP_JIMM, UD_OP_CONST +}; + +#include "itab.h" + +union ud_lval { + int8_t sbyte; + uint8_t ubyte; + int16_t sword; + uint16_t uword; + int32_t sdword; + uint32_t udword; + int64_t sqword; + uint64_t uqword; + struct { + uint16_t seg; + uint32_t off; + } ptr; +}; + +/* ----------------------------------------------------------------------------- + * struct ud_operand - Disassembled instruction Operand. + * ----------------------------------------------------------------------------- + */ +struct ud_operand { + enum ud_type type; + uint8_t size; + enum ud_type base; + enum ud_type index; + uint8_t scale; + uint8_t offset; + union ud_lval lval; + /* + * internal use only + */ + uint64_t _legacy; /* this will be removed in 1.8 */ + uint8_t _oprcode; +}; + +/* ----------------------------------------------------------------------------- + * struct ud - The udis86 object. + * ----------------------------------------------------------------------------- + */ +struct ud +{ + /* + * input buffering + */ + int (*inp_hook) (struct ud*); +#ifndef __UD_STANDALONE__ + FILE* inp_file; +#endif + const uint8_t* inp_buf; + size_t inp_buf_size; + size_t inp_buf_index; + uint8_t inp_curr; + size_t inp_ctr; + uint8_t inp_sess[64]; + int inp_end; + + void (*translator)(struct ud*); + uint64_t insn_offset; + char insn_hexcode[64]; + + /* + * Assembly output buffer + */ + char *asm_buf; + size_t asm_buf_size; + size_t asm_buf_fill; + char asm_buf_int[128]; + + /* + * Symbol resolver for use in the translation phase. + */ + const char* (*sym_resolver)(struct ud*, uint64_t addr, int64_t *offset); + + uint8_t dis_mode; + uint64_t pc; + uint8_t vendor; + enum ud_mnemonic_code mnemonic; + struct ud_operand operand[3]; + uint8_t error; + uint8_t pfx_rex; + uint8_t pfx_seg; + uint8_t pfx_opr; + uint8_t pfx_adr; + uint8_t pfx_lock; + uint8_t pfx_str; + uint8_t pfx_rep; + uint8_t pfx_repe; + uint8_t pfx_repne; + uint8_t opr_mode; + uint8_t adr_mode; + uint8_t br_far; + uint8_t br_near; + uint8_t have_modrm; + uint8_t modrm; + uint8_t primary_opcode; + void * user_opaque_data; + struct ud_itab_entry * itab_entry; + struct ud_lookup_table_list_entry *le; +}; + +/* ----------------------------------------------------------------------------- + * Type-definitions + * ----------------------------------------------------------------------------- + */ +typedef enum ud_type ud_type_t; +typedef enum ud_mnemonic_code ud_mnemonic_code_t; + +typedef struct ud ud_t; +typedef struct ud_operand ud_operand_t; + +#define UD_SYN_INTEL ud_translate_intel +#define UD_SYN_ATT ud_translate_att +#define UD_EOI (-1) +#define UD_INP_CACHE_SZ 32 +#define UD_VENDOR_AMD 0 +#define UD_VENDOR_INTEL 1 +#define UD_VENDOR_ANY 2 + +#endif + +/* +vim: set ts=2 sw=2 expandtab +*/ diff --git a/public/libudis86/udint.h b/public/libudis86/udint.h new file mode 100644 index 0000000000..2908b613b6 --- /dev/null +++ b/public/libudis86/udint.h @@ -0,0 +1,89 @@ +/* udis86 - libudis86/udint.h -- definitions for internal use only + * + * Copyright (c) 2002-2009 Vivek Thampi + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _UDINT_H_ +#define _UDINT_H_ + +#ifdef HAVE_CONFIG_H +# include +#endif /* HAVE_CONFIG_H */ + +#if defined(UD_DEBUG) && HAVE_ASSERT_H +# include +# define UD_ASSERT(_x) assert(_x) +#else +# define UD_ASSERT(_x) +#endif /* !HAVE_ASSERT_H */ + +#if defined(UD_DEBUG) + #define UDERR(u, msg) \ + do { \ + (u)->error = 1; \ + fprintf(stderr, "decode-error: %s:%d: %s", \ + __FILE__, __LINE__, (msg)); \ + } while (0) +#else + #define UDERR(u, m) \ + do { \ + (u)->error = 1; \ + } while (0) +#endif /* !LOGERR */ + +#define UD_RETURN_ON_ERROR(u) \ + do { \ + if ((u)->error != 0) { \ + return (u)->error; \ + } \ + } while (0) + +#define UD_RETURN_WITH_ERROR(u, m) \ + do { \ + UDERR(u, m); \ + return (u)->error; \ + } while (0) + +#ifndef __UD_STANDALONE__ +# define UD_NON_STANDALONE(x) x +#else +# define UD_NON_STANDALONE(x) +#endif + +/* printf formatting int64 specifier */ +#ifdef FMT64 +# undef FMT64 +#endif +#if defined(_MSC_VER) || defined(__BORLANDC__) +# define FMT64 "I64" +#else +# if defined(__APPLE__) +# define FMT64 "ll" +# elif defined(__amd64__) || defined(__x86_64__) +# define FMT64 "l" +# else +# define FMT64 "ll" +# endif /* !x64 */ +#endif + +#endif /* _UDINT_H_ */ diff --git a/public/libudis86/udis86.c b/public/libudis86/udis86.c new file mode 100644 index 0000000000..d62af1f3df --- /dev/null +++ b/public/libudis86/udis86.c @@ -0,0 +1,457 @@ +/* udis86 - libudis86/udis86.c + * + * Copyright (c) 2002-2013 Vivek Thampi + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "udint.h" +#include "extern.h" +#include "decode.h" + +#if !defined(__UD_STANDALONE__) +# if HAVE_STRING_H +# include +# endif +#endif /* !__UD_STANDALONE__ */ + +static void ud_inp_init(struct ud *u); + +/* ============================================================================= + * ud_init + * Initializes ud_t object. + * ============================================================================= + */ +extern void +ud_init(struct ud* u) +{ + memset((void*)u, 0, sizeof(struct ud)); + ud_set_mode(u, 16); + u->mnemonic = UD_Iinvalid; + ud_set_pc(u, 0); +#ifndef __UD_STANDALONE__ + ud_set_input_file(u, stdin); +#endif /* __UD_STANDALONE__ */ + + ud_set_asm_buffer(u, u->asm_buf_int, sizeof(u->asm_buf_int)); +} + + +/* ============================================================================= + * ud_disassemble + * Disassembles one instruction and returns the number of + * bytes disassembled. A zero means end of disassembly. + * ============================================================================= + */ +extern unsigned int +ud_disassemble(struct ud* u) +{ + int len; + if (u->inp_end) { + return 0; + } + if ((len = ud_decode(u)) > 0) { + if (u->translator != NULL) { + u->asm_buf[0] = '\0'; + u->translator(u); + } + } + return len; +} + + +/* ============================================================================= + * ud_set_mode() - Set Disassemly Mode. + * ============================================================================= + */ +extern void +ud_set_mode(struct ud* u, uint8_t m) +{ + switch(m) { + case 16: + case 32: + case 64: u->dis_mode = m ; return; + default: u->dis_mode = 16; return; + } +} + +/* ============================================================================= + * ud_set_vendor() - Set vendor. + * ============================================================================= + */ +extern void +ud_set_vendor(struct ud* u, unsigned v) +{ + switch(v) { + case UD_VENDOR_INTEL: + u->vendor = v; + break; + case UD_VENDOR_ANY: + u->vendor = v; + break; + default: + u->vendor = UD_VENDOR_AMD; + } +} + +/* ============================================================================= + * ud_set_pc() - Sets code origin. + * ============================================================================= + */ +extern void +ud_set_pc(struct ud* u, uint64_t o) +{ + u->pc = o; +} + +/* ============================================================================= + * ud_set_syntax() - Sets the output syntax. + * ============================================================================= + */ +extern void +ud_set_syntax(struct ud* u, void (*t)(struct ud*)) +{ + u->translator = t; +} + +/* ============================================================================= + * ud_insn() - returns the disassembled instruction + * ============================================================================= + */ +const char* +ud_insn_asm(const struct ud* u) +{ + return u->asm_buf; +} + +/* ============================================================================= + * ud_insn_offset() - Returns the offset. + * ============================================================================= + */ +uint64_t +ud_insn_off(const struct ud* u) +{ + return u->insn_offset; +} + + +/* ============================================================================= + * ud_insn_hex() - Returns hex form of disassembled instruction. + * ============================================================================= + */ +const char* +ud_insn_hex(struct ud* u) +{ + u->insn_hexcode[0] = 0; + if (!u->error) { + unsigned int i; + const unsigned char *src_ptr = ud_insn_ptr(u); + char* src_hex; + src_hex = (char*) u->insn_hexcode; + /* for each byte used to decode instruction */ + for (i = 0; i < ud_insn_len(u) && i < sizeof(u->insn_hexcode) / 2; + ++i, ++src_ptr) { + sprintf(src_hex, "%02x", *src_ptr & 0xFF); + src_hex += 2; + } + } + return u->insn_hexcode; +} + + +/* ============================================================================= + * ud_insn_ptr + * Returns a pointer to buffer containing the bytes that were + * disassembled. + * ============================================================================= + */ +extern const uint8_t* +ud_insn_ptr(const struct ud* u) +{ + return (u->inp_buf == NULL) ? + u->inp_sess : u->inp_buf + (u->inp_buf_index - u->inp_ctr); +} + + +/* ============================================================================= + * ud_insn_len + * Returns the count of bytes disassembled. + * ============================================================================= + */ +extern unsigned int +ud_insn_len(const struct ud* u) +{ + return u->inp_ctr; +} + + +/* ============================================================================= + * ud_insn_get_opr + * Return the operand struct representing the nth operand of + * the currently disassembled instruction. Returns NULL if + * there's no such operand. + * ============================================================================= + */ +const struct ud_operand* +ud_insn_opr(const struct ud *u, unsigned int n) +{ + if (n > 2 || u->operand[n].type == UD_NONE) { + return NULL; + } else { + return &u->operand[n]; + } +} + + +/* ============================================================================= + * ud_opr_is_sreg + * Returns non-zero if the given operand is of a segment register type. + * ============================================================================= + */ +int +ud_opr_is_sreg(const struct ud_operand *opr) +{ + return opr->type == UD_OP_REG && + opr->base >= UD_R_ES && + opr->base <= UD_R_GS; +} + + +/* ============================================================================= + * ud_opr_is_sreg + * Returns non-zero if the given operand is of a general purpose + * register type. + * ============================================================================= + */ +int +ud_opr_is_gpr(const struct ud_operand *opr) +{ + return opr->type == UD_OP_REG && + opr->base >= UD_R_AL && + opr->base <= UD_R_R15; +} + + +/* ============================================================================= + * ud_set_user_opaque_data + * ud_get_user_opaque_data + * Get/set user opaqute data pointer + * ============================================================================= + */ +void +ud_set_user_opaque_data(struct ud * u, void* opaque) +{ + u->user_opaque_data = opaque; +} + +void* +ud_get_user_opaque_data(const struct ud *u) +{ + return u->user_opaque_data; +} + + +/* ============================================================================= + * ud_set_asm_buffer + * Allow the user to set an assembler output buffer. If `buf` is NULL, + * we switch back to the internal buffer. + * ============================================================================= + */ +void +ud_set_asm_buffer(struct ud *u, char *buf, size_t size) +{ + if (buf == NULL) { + ud_set_asm_buffer(u, u->asm_buf_int, sizeof(u->asm_buf_int)); + } else { + u->asm_buf = buf; + u->asm_buf_size = size; + } +} + + +/* ============================================================================= + * ud_set_sym_resolver + * Set symbol resolver for relative targets used in the translation + * phase. + * + * The resolver is a function that takes a uint64_t address and returns a + * symbolic name for the that address. The function also takes a second + * argument pointing to an integer that the client can optionally set to a + * non-zero value for offsetted targets. (symbol+offset) The function may + * also return NULL, in which case the translator only prints the target + * address. + * + * The function pointer maybe NULL which resets symbol resolution. + * ============================================================================= + */ +void +ud_set_sym_resolver(struct ud *u, const char* (*resolver)(struct ud*, + uint64_t addr, + int64_t *offset)) +{ + u->sym_resolver = resolver; +} + + +/* ============================================================================= + * ud_insn_mnemonic + * Return the current instruction mnemonic. + * ============================================================================= + */ +enum ud_mnemonic_code +ud_insn_mnemonic(const struct ud *u) +{ + return u->mnemonic; +} + + +/* ============================================================================= + * ud_lookup_mnemonic + * Looks up mnemonic code in the mnemonic string table. + * Returns NULL if the mnemonic code is invalid. + * ============================================================================= + */ +const char* +ud_lookup_mnemonic(enum ud_mnemonic_code c) +{ + if (c < UD_MAX_MNEMONIC_CODE) { + return ud_mnemonics_str[c]; + } else { + return NULL; + } +} + + +/* + * ud_inp_init + * Initializes the input system. + */ +static void +ud_inp_init(struct ud *u) +{ + u->inp_hook = NULL; + u->inp_buf = NULL; + u->inp_buf_size = 0; + u->inp_buf_index = 0; + u->inp_curr = 0; + u->inp_ctr = 0; + u->inp_end = 0; + UD_NON_STANDALONE(u->inp_file = NULL); +} + + +/* ============================================================================= + * ud_inp_set_hook + * Sets input hook. + * ============================================================================= + */ +void +ud_set_input_hook(register struct ud* u, int (*hook)(struct ud*)) +{ + ud_inp_init(u); + u->inp_hook = hook; +} + +/* ============================================================================= + * ud_inp_set_buffer + * Set buffer as input. + * ============================================================================= + */ +void +ud_set_input_buffer(register struct ud* u, const uint8_t* buf, size_t len) +{ + ud_inp_init(u); + u->inp_buf = buf; + u->inp_buf_size = len; + u->inp_buf_index = 0; +} + + +#ifndef __UD_STANDALONE__ +/* ============================================================================= + * ud_input_set_file + * Set FILE as input. + * ============================================================================= + */ +static int +inp_file_hook(struct ud* u) +{ + return fgetc(u->inp_file); +} + +void +ud_set_input_file(register struct ud* u, FILE* f) +{ + ud_inp_init(u); + u->inp_hook = inp_file_hook; + u->inp_file = f; +} +#endif /* __UD_STANDALONE__ */ + + +/* ============================================================================= + * ud_input_skip + * Skip n input bytes. + * ============================================================================ + */ +void +ud_input_skip(struct ud* u, size_t n) +{ + if (u->inp_end) { + return; + } + if (u->inp_buf == NULL) { + while (n--) { + int c = u->inp_hook(u); + if (c == UD_EOI) { + goto eoi; + } + } + return; + } else { + if (n > u->inp_buf_size || + u->inp_buf_index > u->inp_buf_size - n) { + u->inp_buf_index = u->inp_buf_size; + goto eoi; + } + u->inp_buf_index += n; + return; + } +eoi: + u->inp_end = 1; + UDERR(u, "cannot skip, eoi received\b"); + return; +} + + +/* ============================================================================= + * ud_input_end + * Returns non-zero on end-of-input. + * ============================================================================= + */ +int +ud_input_end(const struct ud *u) +{ + return u->inp_end; +} + +/* vim:set ts=2 sw=2 expandtab */ diff --git a/public/libudis86/udis86.h b/public/libudis86/udis86.h new file mode 100644 index 0000000000..bdd3857bfa --- /dev/null +++ b/public/libudis86/udis86.h @@ -0,0 +1,33 @@ +/* udis86 - udis86.h + * + * Copyright (c) 2002-2009 Vivek Thampi + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef UDIS86_H +#define UDIS86_H + +#include "libudis86/types.h" +#include "libudis86/extern.h" +#include "libudis86/itab.h" + +#endif diff --git a/public/sm_platform.h b/public/sm_platform.h index 95ecee60fa..c5ffec0244 100644 --- a/public/sm_platform.h +++ b/public/sm_platform.h @@ -41,6 +41,17 @@ #ifndef PLATFORM_WINDOWS #define PLATFORM_WINDOWS 1 #endif + +#if defined WIN64 || defined _WIN64 +#ifndef PLATFORM_X64 +# define PLATFORM_X64 1 +#endif +#else +#ifndef PLATFORM_X86 +# define PLATFORM_X86 1 +#endif +#endif // defined WIN64 || defined _WIN64 + #if !defined WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif @@ -58,6 +69,7 @@ #define PLATFORM_MAX_PATH MAX_PATH #define PLATFORM_SEP_CHAR '\\' #define PLATFORM_SEP_ALTCHAR '/' +#define PLATFORM_SEP "\\" #define PLATFORM_EXTERN_C extern "C" __declspec(dllexport) #if defined _MSC_VER && _MSC_VER >= 1400 #define SUBPLATFORM_SECURECRT @@ -73,6 +85,17 @@ #ifndef PLATFORM_POSIX # define PLATFORM_POSIX 1 #endif + +#if defined __x86_64__ +#ifndef PLATFORM_X64 +# define PLATFORM_X64 1 +#endif +#else +#ifndef PLATFORM_X86 +# define PLATFORM_X86 1 +#endif +#endif // defined __x86_64__ + #include #include #include @@ -84,6 +107,7 @@ #define PLATFORM_MAX_PATH PATH_MAX #define PLATFORM_SEP_CHAR '/' #define PLATFORM_SEP_ALTCHAR '\\' +#define PLATFORM_SEP "/" #define PLATFORM_EXTERN_C extern "C" __attribute__((visibility("default"))) #endif @@ -95,5 +119,25 @@ #define SM_ARRAYSIZE(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x]))))) #endif +#if defined PLATFORM_X64 +#define PLATFORM_ARCH_FOLDER "x64" PLATFORM_SEP +#ifdef PLATFORM_WINDOWS +#define PLATFORM_FOLDER "win64" PLATFORM_SEP +#elif defined PLATFORM_LINUX +#define PLATFORM_FOLDER "linux64" PLATFORM_SEP +#elif defined PLATFORM_APPLE +#define PLATFORM_FOLDER "osx64" PLATFORM_SEP +#endif +#else +#define PLATFORM_ARCH_FOLDER "" +#ifdef PLATFORM_WINDOWS +#define PLATFORM_FOLDER "win32" PLATFORM_SEP +#elif defined PLATFORM_LINUX +#define PLATFORM_FOLDER "linux32" PLATFORM_SEP +#elif defined PLATFORM_APPLE +#define PLATFORM_FOLDER "osx32" PLATFORM_SEP +#endif +#endif // defined PLATFORM_X64 + #endif //_INCLUDE_SOURCEMOD_PLATFORM_H_ diff --git a/sourcepawn b/sourcepawn index c78349382d..a51117e370 160000 --- a/sourcepawn +++ b/sourcepawn @@ -1 +1 @@ -Subproject commit c78349382d97d5a9f20b49975c47d9bb805c125d +Subproject commit a51117e370e679b275ad6c74c31e5b7c81e3508a diff --git a/tools/buildbot/PackageScript b/tools/buildbot/PackageScript index 89bf12a068..f00a7ab2b0 100644 --- a/tools/buildbot/PackageScript +++ b/tools/buildbot/PackageScript @@ -38,6 +38,12 @@ folder_list = [ 'cfg/sourcemod', ] +if 'x64' in SM.archs: + folder_list.extend([ + 'addons/sourcemod/bin/x64', + 'addons/sourcemod/extensions/x64', + ]) + # Create the distribution folder hierarchy. folder_map = {} for folder in folder_list: @@ -46,11 +52,41 @@ for folder in folder_list: # Copy binaries. for cxx_task in SM.binaries: - builder.AddCopy(cxx_task.binary, folder_map['addons/sourcemod/bin']) + binpath = cxx_task.binary.path + if '.x64' + os.sep in binpath and not 'sourcemod_mm' in binpath: + builder.AddCopy(cxx_task.binary, folder_map['addons/sourcemod/bin/x64']) + else: + builder.AddCopy(cxx_task.binary, folder_map['addons/sourcemod/bin']) for cxx_task in SM.extensions: - builder.AddCopy(cxx_task.binary, folder_map['addons/sourcemod/extensions']) -builder.AddCopy(SM.spcomp.binary, folder_map['addons/sourcemod/scripting']) + if '.x64' + os.sep in cxx_task.binary.path: + builder.AddCopy(cxx_task.binary, folder_map['addons/sourcemod/extensions/x64']) + else: + builder.AddCopy(cxx_task.binary, folder_map['addons/sourcemod/extensions']) + +def lipo(binaries, outFolder): + bins = [] + binPaths = [] + for bin in binaries: + bins.append(bin.binary) + binPaths.append(os.path.join(builder.buildPath, bin.binary.path)) + argv = ['lipo', '-create'] + binary = os.path.basename(binPaths[0]) + outputPath = os.path.join(builder.buildPath, builder.buildFolder, outFolder, binary) + builder.AddCommand( + argv = argv + binPaths + ['-output', outputPath], + inputs = bins, + outputs = [os.path.join(outFolder, binary)], + ) +if builder.target.platform == 'mac' and len(SM.archs) > 1: + lipo(SM.spcomp_bins, 'addons/sourcemod/scripting') +else: + for bin_task in SM.spcomp_bins: + if '.x64' + os.sep in bin_task.binary.path: + file = os.path.basename(bin_task.binary.path) + '64' + builder.AddCopy(bin_task.binary, os.path.normpath('addons/sourcemod/scripting/' + file)) + else: + builder.AddCopy(bin_task.binary, folder_map['addons/sourcemod/scripting']) if SM.use_auto_versioning(): # Copy version_auto.inc. @@ -61,7 +97,7 @@ if SM.use_auto_versioning(): # Export PDB files. We write to a file in the build folder which is pretty # verboten, but it's okay if it's in the root since AMBuild will never try # to rmdir the root. -full_binary_list = SM.binaries + SM.extensions + [SM.spcomp] +full_binary_list = SM.binaries + SM.extensions + SM.spcomp_bins with open(os.path.join(builder.buildPath, 'pdblog.txt'), 'w') as fp: for task in full_binary_list: fp.write(task.debug.path + '\n') diff --git a/tools/buildbot/bootstrap.pl b/tools/buildbot/bootstrap.pl index d6514a0cc1..9c694eddfa 100755 --- a/tools/buildbot/bootstrap.pl +++ b/tools/buildbot/bootstrap.pl @@ -46,14 +46,22 @@ push(@conf_argv, '--hl2sdk-root=/Volumes/hgshare'); push(@conf_argv, '--mms-path=/Users/builds/slaves/common/mmsource-1.10'); push(@conf_argv, '--mysql-path=/Users/builds/slaves/common/mysql-5.0'); + push(@conf_argv, '--mysql64-path=/Users/builds/slaves/common/mysql-5.0-x86_64'); } elsif ($^O =~ /linux/) { push(@conf_argv, '--hl2sdk-root=/hgshare'); push(@conf_argv, '--mms-path=/home/builds/common/mmsource-1.10'); push(@conf_argv, '--mysql-path=/home/builds/common/mysql-5.0'); + push(@conf_argv, '--mysql64-path=/home/builds/common/mysql-5.0-x86_64'); } elsif ($^O =~ /MSWin/) { push(@conf_argv, '--hl2sdk-root=H:\\'); } +if ($^O !~ /MSWin/) { + push(@conf_argv, '--target-arch=x86,x64'); +} else { + push(@conf_argv, '--target-arch=x86'); +} + my $conf_args = join(' ', @conf_argv); if ($argn > 0 && $^O !~ /MSWin/) { diff --git a/tools/checkout-deps.sh b/tools/checkout-deps.sh index b6292d2ff5..f2b023734d 100755 --- a/tools/checkout-deps.sh +++ b/tools/checkout-deps.sh @@ -24,6 +24,25 @@ if [ ! -d "sourcemod" ]; then fi fi +getmysql () +{ + if [ ! -d $mysqlfolder ]; then + if [ `command -v wget` ]; then + wget $mysqlurl -O $mysqlfolder.$archive_ext + elif [ `command -v curl` ]; then + curl -o $mysqlfolder.$archive_ext $mysqlurl + else + echo "Failed to locate wget or curl. Install one of these programs to download MySQL." + exit 1 + fi + $decomp $mysqlfolder.$archive_ext + mv $mysqlver $mysqlfolder + rm $mysqlfolder.$archive_ext + fi +} + +# 32-bit MySQL +mysqlfolder=mysql-5.0 if [ $ismac -eq 1 ]; then mysqlver=mysql-5.5.28-osx10.5-x86 mysqlurl=https://cdn.mysql.com/archives/mysql-5.5/$mysqlver.$archive_ext @@ -36,20 +55,18 @@ else mysqlver=mysql-5.6.15-linux-glibc2.5-i686 mysqlurl=https://cdn.mysql.com/archives/mysql-5.6/$mysqlver.$archive_ext fi +getmysql -if [ ! -d "mysql-5.0" ]; then - if [ `command -v wget` ]; then - wget $mysqlurl -O mysql.$archive_ext - elif [ `command -v curl` ]; then - curl -o mysql.$archive_ext $mysqlurl - else - echo "Failed to locate wget or curl. Install one of these programs to download MySQL." - exit 1 - fi - $decomp mysql.$archive_ext - mv $mysqlver mysql-5.0 - rm mysql.$archive_ext +# 64-bit MySQL +mysqlfolder=mysql-5.0-x86_64 +if [ $ismac -eq 1 ]; then + mysqlver=mysql-5.5.28-osx10.5-x86_64 + mysqlurl=https://cdn.mysql.com/archives/mysql-5.5/$mysqlver.$archive_ext +elif [ $iswin -eq 0 ]; then + mysqlver=mysql-5.6.15-linux-glibc2.5-x86_64 + mysqlurl=https://cdn.mysql.com/archives/mysql-5.6/$mysqlver.$archive_ext fi +getmysql checkout () { diff --git a/versionlib/AMBuilder b/versionlib/AMBuilder index 51eae7afd1..75018d7755 100644 --- a/versionlib/AMBuilder +++ b/versionlib/AMBuilder @@ -1,15 +1,17 @@ # vim: sts=2 ts=8 sw=2 tw=99 et ft=python: import os -lib = SM.StaticLibrary(builder, 'version') -lib.compiler.includes += [ - os.path.join(builder.sourcePath, 'public') -] -lib.compiler.defines.remove('SM_USE_VERSIONLIB') -lib.compiler.sourcedeps += SM.generated_headers -lib.sources += [ - 'versionlib.cpp' -] -task = builder.Add(lib) +rvalue = {} +for arch in SM.archs: + lib = SM.StaticLibrary(builder, 'version', arch) + lib.compiler.includes += [ + os.path.join(builder.sourcePath, 'public') + ] + lib.compiler.defines.remove('SM_USE_VERSIONLIB') + lib.compiler.sourcedeps += SM.generated_headers + lib.sources += [ + 'versionlib.cpp' + ] + task = builder.Add(lib) -rvalue = task.binary + rvalue[arch] = task.binary