Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1310 lines
64 KiB

4 years ago
  1. /********************************** module *********************************/
  2. /* */
  3. /* disasmtb */
  4. /* disassembler for CodeView */
  5. /* */
  6. /***************************************************************************/
  7. /* */
  8. /* @ Purpose: */
  9. /* */
  10. /* @ Functions included: */
  11. /* */
  12. /* */
  13. /* @ Author: Gerd Immeyer @ Version: */
  14. /* */
  15. /* @ Creation Date: 10.19.89 @ Modification Date: */
  16. /* */
  17. /***************************************************************************/
  18. /* Strings: Operand mnemonics, Segment overrides, etc. for disasm */
  19. char dszAAA[] = "aaa";
  20. char dszAAD[] = "aad";
  21. char dszAAM[] = "aam";
  22. char dszAAS[] = "aas";
  23. char dszADC[] = "adc";
  24. char dszADD[] = "add";
  25. char dszADDRPRFX[] = "";
  26. char dszAND[] = "and";
  27. char dszARPL[] = "arpl";
  28. char dszBOUND[] = "bound";
  29. char dszBSF[] = "bsf";
  30. char dszBSR[] = "bsr";
  31. char dszBST[] = "bst";
  32. char dszBSWAP[] = "bswap";
  33. char dszBT[] = "bt";
  34. char dszBTC[] = "btc";
  35. char dszBTR[] = "btr";
  36. char dszBTS[] = "bts";
  37. char dszCALL[] = "call";
  38. char dszCBW[] = "cbw";
  39. char dszCDQ[] = "cdq";
  40. char dszCLC[] = "clc";
  41. char dszCLD[] = "cld";
  42. char dszCLI[] = "cli";
  43. char dszCLTS[] = "clts";
  44. char dszCMC[] = "cmc";
  45. char dszCMOVO[] = "cmovo";
  46. char dszCMOVNO[] = "cmovno";
  47. char dszCMOVB[] = "cmovb";
  48. char dszCMOVNB[] = "cmovnb";
  49. char dszCMOVE[] = "cmove";
  50. char dszCMOVNE[] = "cmovne";
  51. char dszCMOVBE[] = "cmovbe";
  52. char dszCMOVA[] = "cmova";
  53. char dszCMOVS[] = "cmovs";
  54. char dszCMOVNS[] = "cmovns";
  55. char dszCMOVP[] = "cmovp";
  56. char dszCMOVNP[] = "cmovnp";
  57. char dszCMOVL[] = "cmovl";
  58. char dszCMOVGE[] = "cmovge";
  59. char dszCMOVLE[] = "cmovle";
  60. char dszCMOVNLE[] = "cmovnle";
  61. char dszCMP[] = "cmp";
  62. char dszCMPS[] = "cmps";
  63. char dszCMPSB[] = "cmpsb";
  64. char dszCMPSD[] = "cmpsd";
  65. char dszCMPSW[] = "cmpsw";
  66. char dszCMPXCHG[] = "cmpxchg";
  67. char dszCMPXCHG8B[] = "cmpxchg8b";
  68. char dszCPUID[] = "cpuid";
  69. char dszCS_[] = "cs:";
  70. char dszCWD[] = "cwd";
  71. char dszCWDE[] = "cwde";
  72. char dszDAA[] = "daa";
  73. char dszDAS[] = "das";
  74. char dszDEC[] = "dec";
  75. char dszDIV[] = "div";
  76. char dszDS_[] = "ds:";
  77. char dszENTER[] = "enter";
  78. char dszES_[] = "es:";
  79. char dszF2XM1[] = "f2xm1";
  80. char dszFABS[] = "fabs";
  81. char dszFADD[] = "fadd";
  82. char dszFADDP[] = "faddp";
  83. char dszFBLD[] = "fbld";
  84. char dszFBSTP[] = "fbstp";
  85. char dszFCHS[] = "fchs";
  86. char dszFCLEX[] = "fclex";
  87. char dszFCMOVB[] = "fcmovb";
  88. char dszFCMOVE[] = "fcmove";
  89. char dszFCMOVBE[] = "fcmovbe";
  90. char dszFCMOVU[] = "fcmovu";
  91. char dszFCMOVNB[] = "fcmovnb";
  92. char dszFCMOVNE[] = "fcmovne";
  93. char dszFCMOVNBE[] = "fcmovnbe";
  94. char dszFCMOVNU[] = "fcmovnu";
  95. char dszFCOM[] = "fcom";
  96. char dszFCOMI[] = "fcomi";
  97. char dszFCOMIP[] = "fcomip";
  98. char dszFCOMP[] = "fcomp";
  99. char dszFCOMPP[] = "fcompp";
  100. char dszFCOS[] = "fcos";
  101. char dszFDECSTP[] = "fdecstp";
  102. char dszFDISI[] = "fdisi";
  103. char dszFDIV[] = "fdiv";
  104. char dszFDIVP[] = "fdivp";
  105. char dszFDIVR[] = "fdivr";
  106. char dszFDIVRP[] = "fdivrp";
  107. char dszFENI[] = "feni";
  108. char dszFFREE[] = "ffree";
  109. char dszFIADD[] = "fiadd";
  110. char dszFICOM[] = "ficom";
  111. char dszFICOMP[] = "ficomp";
  112. char dszFIDIV[] = "fidiv";
  113. char dszFIDIVR[] = "fidivr";
  114. char dszFILD[] = "fild";
  115. char dszFIMUL[] = "fimul";
  116. char dszFINCSTP[] = "fincstp";
  117. char dszFINIT[] = "finit";
  118. char dszFIST[] = "fist";
  119. char dszFISTP[] = "fistp";
  120. char dszFISUB[] = "fisub";
  121. char dszFISUBR[] = "fisubr";
  122. char dszFLD[] = "fld";
  123. char dszFLD1[] = "fld1";
  124. char dszFLDCW[] = "fldcw";
  125. char dszFLDENV[] = "fldenv";
  126. char dszFLDL2E[] = "fldl2e";
  127. char dszFLDL2T[] = "fldl2t";
  128. char dszFLDLG2[] = "fldlg2";
  129. char dszFLDLN2[] = "fldln2";
  130. char dszFLDPI[] = "fldpi";
  131. char dszFLDZ[] = "fldz";
  132. char dszFMUL[] = "fmul";
  133. char dszFMULP[] = "fmulp";
  134. char dszFNCLEX[] = "fnclex";
  135. char dszFNDISI[] = "fndisi";
  136. char dszFNENI[] = "fneni";
  137. char dszFNINIT[] = "fninit";
  138. char dszFNOP[] = "fnop";
  139. char dszFNSAVE[] = "fnsave";
  140. char dszFNSTCW[] = "fnstcw";
  141. char dszFNSTENV[] = "fnstenv";
  142. char dszFNSTSW[] = "fnstsw";
  143. char dszFNSTSWAX[] = "fnstswax";
  144. char dszFPATAN[] = "fpatan";
  145. char dszFPREM[] = "fprem";
  146. char dszFPREM1[] = "fprem1";
  147. char dszFPTAN[] = "fptan";
  148. char dszFRNDINT[] = "frndint";
  149. char dszFRSTOR[] = "frstor";
  150. char dszFSAVE[] = "fsave";
  151. char dszFSCALE[] = "fscale";
  152. char dszFSETPM[] = "fsetpm";
  153. char dszFSIN[] = "fsin";
  154. char dszFSINCOS[] = "fsincos";
  155. char dszFSQRT[] = "fsqrt";
  156. char dszFST[] = "fst";
  157. char dszFSTCW[] = "fstcw";
  158. char dszFSTENV[] = "fstenv";
  159. char dszFSTP[] = "fstp";
  160. char dszFSTSW[] = "fstsw";
  161. char dszFSTSWAX[] = "fstswax";
  162. char dszFSUB[] = "fsub";
  163. char dszFSUBP[] = "fsubp";
  164. char dszFSUBR[] = "fsubr";
  165. char dszFSUBRP[] = "fsubrp";
  166. char dszFS_[] = "fs:";
  167. char dszFTST[] = "ftst";
  168. char dszFUCOM[] = "fucom";
  169. char dszFUCOMI[] = "fucomi";
  170. char dszFUCOMIP[] = "fucomip";
  171. char dszFUCOMP[] = "fucomp";
  172. char dszFUCOMPP[] = "fucompp";
  173. char dszFWAIT[] = "fwait";
  174. char dszFXAM[] = "fxam";
  175. char dszFXCH[] = "fxch";
  176. char dszFXTRACT[] = "fxtract";
  177. char dszFYL2X[] = "fyl2x";
  178. char dszFYL2XP1[] = "fyl2xp1";
  179. char dszGS_[] = "gs:";
  180. char dszHLT[] = "hlt";
  181. char dszIBTS[] = "ibts";
  182. char dszIDIV[] = "idiv";
  183. char dszIMUL[] = "imul";
  184. char dszIN[] = "in";
  185. char dszINC[] = "inc";
  186. char dszINS[] = "ins";
  187. char dszINSB[] = "insb";
  188. char dszINSD[] = "insd";
  189. char dszINSW[] = "insw";
  190. char dszINT[] = "int";
  191. char dszINTO[] = "into";
  192. char dszINVD[] = "invd";
  193. char dszINVLPG[] = "invlpg";
  194. char dszIRET[] = "iret";
  195. char dszIRETD[] = "iretd";
  196. char dszJA[] = "ja";
  197. char dszJAE[] = "jae";
  198. char dszJB[] = "jb";
  199. char dszJBE[] = "jbe";
  200. char dszJC[] = "jc";
  201. char dszJCXZ[] = "jcxz";
  202. char dszJE[] = "je";
  203. char dszJECXZ[] = "jecxz";
  204. char dszJG[] = "jg";
  205. char dszJGE[] = "jge";
  206. char dszJL[] = "jl";
  207. char dszJLE[] = "jle";
  208. char dszJMP[] = "jmp";
  209. char dszJNA[] = "jna";
  210. char dszJNAE[] = "jnae";
  211. char dszJNB[] = "jnb";
  212. char dszJNBE[] = "jnbe";
  213. char dszJNC[] = "jnc";
  214. char dszJNE[] = "jne";
  215. char dszJNG[] = "jng";
  216. char dszJNGE[] = "jnge";
  217. char dszJNL[] = "jnl";
  218. char dszJNLE[] = "jnle";
  219. char dszJNO[] = "jno";
  220. char dszJNP[] = "jnp";
  221. char dszJNS[] = "jns";
  222. char dszJNZ[] = "jnz";
  223. char dszJO[] = "jo";
  224. char dszJP[] = "jp";
  225. char dszJPE[] = "jpe";
  226. char dszJPO[] = "jpo";
  227. char dszJS[] = "js";
  228. char dszJZ[] = "jz";
  229. char dszLAHF[] = "lahf";
  230. char dszLAR[] = "lar";
  231. char dszLDS[] = "lds";
  232. char dszLEA[] = "lea";
  233. char dszLEAVE[] = "leave";
  234. char dszLES[] = "les";
  235. char dszLFS[] = "lfs";
  236. char dszLGDT[] = "lgdt";
  237. char dszLGS[] = "lgs";
  238. char dszLIDT[] = "lidt";
  239. char dszLLDT[] = "lldt";
  240. char dszLMSW[] = "lmsw";
  241. char dszLOADALL[] = "loadall";
  242. char dszLOCK[] = "lock";
  243. char dszLODS[] = "lods";
  244. char dszLODSB[] = "lodsb";
  245. char dszLODSD[] = "lodsd";
  246. char dszLODSW[] = "lodsw";
  247. char dszLOOP[] = "loop";
  248. char dszLOOPE[] = "loope";
  249. char dszLOOPNE[] = "loopne";
  250. char dszLOOPNZ[] = "loopnz";
  251. char dszLOOPZ[] = "loopz";
  252. char dszLSL[] = "lsl";
  253. char dszLSS[] = "lss";
  254. char dszLTR[] = "ltr";
  255. char dszMOV[] = "mov";
  256. char dszMOVS[] = "movs";
  257. char dszMOVSB[] = "movsb";
  258. char dszMOVSD[] = "movsd";
  259. char dszMOVSW[] = "movsw";
  260. char dszMOVSX[] = "movsx";
  261. char dszMOVZX[] = "movzx";
  262. char dszMUL[] = "mul";
  263. char dszNEG[] = "neg";
  264. char dszNOP[] = "nop";
  265. char dszNOT[] = "not";
  266. char dszOPPRFX[] = "";
  267. char dszOR[] = "or";
  268. char dszOUT[] = "out";
  269. char dszOUTS[] = "outs";
  270. char dszOUTSB[] = "outsb";
  271. char dszOUTSD[] = "outsd";
  272. char dszOUTSW[] = "outsw";
  273. char dszPOP[] = "pop";
  274. char dszPOPA[] = "popa";
  275. char dszPOPAD[] = "popad";
  276. char dszPOPF[] = "popf";
  277. char dszPOPFD[] = "popfd";
  278. char dszPUSH[] = "push";
  279. char dszPUSHA[] = "pusha";
  280. char dszPUSHAD[] = "pushad";
  281. char dszPUSHF[] = "pushf";
  282. char dszPUSHFD[] = "pushfd";
  283. char dszRCL[] = "rcl";
  284. char dszRCR[] = "rcr";
  285. char dszRDTSC[] = "rdtsc";
  286. char dszRDMSR[] = "rdmsr";
  287. char dszRDPMC[] = "rdpmc";
  288. char dszREP[] = "rep ";
  289. char dszREPE[] = "repe";
  290. char dszREPNE[] = "repne ";
  291. char dszREPNZ[] = "repnz";
  292. char dszREPZ[] = "repz";
  293. char dszRET[] = "ret";
  294. char dszRETF[] = "retf";
  295. char dszRETN[] = "retn";
  296. char dszROL[] = "rol";
  297. char dszROR[] = "ror";
  298. char dszRSM[] = "rsm";
  299. char dszSAHF[] = "sahf";
  300. char dszSAL[] = "sal";
  301. char dszSAR[] = "sar";
  302. char dszSBB[] = "sbb";
  303. char dszSCAS[] = "scas";
  304. char dszSCASB[] = "scasb";
  305. char dszSCASD[] = "scasd";
  306. char dszSCASW[] = "scasw";
  307. char dszSETA[] = "seta";
  308. char dszSETAE[] = "setae";
  309. char dszSETB[] = "setb";
  310. char dszSETBE[] = "setbe";
  311. char dszSETC[] = "setc";
  312. char dszSETE[] = "sete";
  313. char dszSETG[] = "setg";
  314. char dszSETGE[] = "setge";
  315. char dszSETL[] = "setl";
  316. char dszSETLE[] = "setle";
  317. char dszSETNA[] = "setna";
  318. char dszSETNAE[] = "setnae";
  319. char dszSETNB[] = "setnb";
  320. char dszSETNBE[] = "setnbe";
  321. char dszSETNC[] = "setnc";
  322. char dszSETNE[] = "setne";
  323. char dszSETNG[] = "setng";
  324. char dszSETNGE[] = "setnge";
  325. char dszSETNL[] = "setnl";
  326. char dszSETNLE[] = "setnle";
  327. char dszSETNO[] = "setno";
  328. char dszSETNP[] = "setnp";
  329. char dszSETNS[] = "setns";
  330. char dszSETNZ[] = "setnz";
  331. char dszSETO[] = "seto";
  332. char dszSETP[] = "setp";
  333. char dszSETPE[] = "setpe";
  334. char dszSETPO[] = "setpo";
  335. char dszSETS[] = "sets";
  336. char dszSETZ[] = "setz";
  337. char dszSGDT[] = "sgdt";
  338. char dszSHL[] = "shl";
  339. char dszSHLD[] = "shld";
  340. char dszSHR[] = "shr";
  341. char dszSHRD[] = "shrd";
  342. char dszSIDT[] = "sidt";
  343. char dszSLDT[] = "sldt";
  344. char dszSMSW[] = "smsw";
  345. char dszSS_[] = "ss:";
  346. char dszSTC[] = "stc";
  347. char dszSTD[] = "std";
  348. char dszSTI[] = "sti";
  349. char dszSTOS[] = "stos";
  350. char dszSTOSB[] = "stosb";
  351. char dszSTOSD[] = "stosd";
  352. char dszSTOSW[] = "stosw";
  353. char dszSTR[] = "str";
  354. char dszSUB[] = "sub";
  355. char dszTEST[] = "test";
  356. char dszUD2[] = "ud2";
  357. char dszVERR[] = "verr";
  358. char dszVERW[] = "verw";
  359. char dszWAIT[] = "wait";
  360. char dszWBINVD[] = "wbinvd";
  361. char dszWRMSR[] = "wrmsr";
  362. char dszXADD[] = "xadd";
  363. char dszXBTS[] = "xbts";
  364. char dszXCHG[] = "xchg";
  365. char dszXLAT[] = "xlat";
  366. char dszXOR[] = "xor";
  367. char dszRESERVED[] = "???";
  368. char dszMULTI[] = "";
  369. char dszDB[] = "db";
  370. #define MRM 0x40
  371. #define COM 0x80
  372. #define END 0xc0
  373. /* Enumeration of valid actions that can be included in the action table */
  374. enum oprtyp { ADDRP, ADR_OVR, ALSTR, ALT, AXSTR, BOREG,
  375. BREG, BRSTR, xBYTE, CHR, CREG, xDWORD,
  376. EDWORD, EGROUPT, FARPTR, GROUP, GROUPT, IB,
  377. IST, IST_ST, IV, IW, LMODRM, MODRM,
  378. NOP, OFFS, OPC0F, OPR_OVR, QWORD, REL16,
  379. REL8, REP, SEG_OVR, SREG2, SREG3, ST_IST,
  380. STROP, TBYTE, UBYTE, VAR, VOREG, VREG,
  381. xWORD, WREG, WRSTR
  382. };
  383. /* Enumeration of indices into the action table for instruction classes */
  384. #define O_DoDB 0
  385. #define O_NoOperands 0
  386. #define O_NoOpAlt5 O_NoOperands+1
  387. #define O_NoOpAlt4 O_NoOpAlt5+2
  388. #define O_NoOpAlt3 O_NoOpAlt4+2
  389. #define O_NoOpAlt1 O_NoOpAlt3+2
  390. #define O_NoOpAlt0 O_NoOpAlt1+2
  391. #define O_NoOpStrSI O_NoOpAlt0+2
  392. #define O_NoOpStrDI O_NoOpStrSI+2
  393. #define O_NoOpStrSIDI O_NoOpStrDI+2
  394. #define O_bModrm_Reg O_NoOpStrSIDI+2
  395. #define O_vModrm_Reg O_bModrm_Reg+3
  396. #define O_Modrm_Reg O_vModrm_Reg+3
  397. #define O_bReg_Modrm O_Modrm_Reg+3
  398. #define O_fReg_Modrm O_bReg_Modrm+3
  399. #define O_Reg_Modrm O_fReg_Modrm+3
  400. #define O_AL_Ib O_Reg_Modrm+3
  401. #define O_AX_Iv O_AL_Ib+2
  402. #define O_sReg2 O_AX_Iv+2
  403. #define O_oReg O_sReg2+1
  404. #define O_DoBound O_oReg+1
  405. #define O_Iv O_DoBound+3
  406. #define O_wModrm_Reg O_Iv+1
  407. #define O_Ib O_wModrm_Reg+3
  408. #define O_Imulb O_Ib+1
  409. #define O_Imul O_Imulb+4
  410. #define O_Rel8 O_Imul+4
  411. #define O_bModrm_Ib O_Rel8+1
  412. #define O_Modrm_Ib O_bModrm_Ib+3
  413. #define O_Modrm_Iv O_Modrm_Ib+3
  414. #define O_Modrm_sReg3 O_Modrm_Iv+3
  415. #define O_sReg3_Modrm O_Modrm_sReg3+3
  416. #define O_Modrm O_sReg3_Modrm+3
  417. #define O_FarPtr O_Modrm+2
  418. #define O_AL_Offs O_FarPtr+1
  419. #define O_Offs_AL O_AL_Offs+2
  420. #define O_AX_Offs O_Offs_AL+2
  421. #define O_Offs_AX O_AX_Offs+2
  422. #define O_oReg_Ib O_Offs_AX+2
  423. #define O_oReg_Iv O_oReg_Ib+2
  424. #define O_Iw O_oReg_Iv+2
  425. #define O_Enter O_Iw+1
  426. #define O_Ubyte_AL O_Enter+2
  427. #define O_Ubyte_AX O_Ubyte_AL+2
  428. #define O_AL_Ubyte O_Ubyte_AX+2
  429. #define O_AX_Ubyte O_AL_Ubyte+2
  430. #define O_DoInAL O_AX_Ubyte+2
  431. #define O_DoInAX O_DoInAL+3
  432. #define O_DoOutAL O_DoInAX+3
  433. #define O_DoOutAX O_DoOutAL+3
  434. #define O_Rel16 O_DoOutAX+3
  435. #define O_ADR_OVERRIDE O_Rel16+1
  436. #define O_OPR_OVERRIDE O_ADR_OVERRIDE+1
  437. #define O_SEG_OVERRIDE O_OPR_OVERRIDE+1
  438. #define O_DoInt3 O_SEG_OVERRIDE+1
  439. #if (O_DoInt3 != 115)
  440. #error "operand table has been modified!"
  441. #endif
  442. /* #define O_DoInt O_DoInt3+2 */
  443. #define O_DoInt 117
  444. #define O_OPC0F O_DoInt+1
  445. #define O_GROUP11 O_OPC0F+1
  446. #define O_GROUP13 O_GROUP11+5
  447. #define O_GROUP12 O_GROUP13+5
  448. #define O_GROUP21 O_GROUP12+5
  449. #define O_GROUP22 O_GROUP21+5
  450. #define O_GROUP23 O_GROUP22+5
  451. #define O_GROUP24 O_GROUP23+6
  452. #define O_GROUP25 O_GROUP24+6
  453. #define O_GROUP26 O_GROUP25+6
  454. #define O_GROUP4 O_GROUP26+6
  455. #define O_GROUP6 O_GROUP4+4
  456. #define O_GROUP8 O_GROUP6+4
  457. #define O_GROUP31 O_GROUP8+5
  458. #define O_GROUP32 O_GROUP31+3
  459. #define O_GROUP5 O_GROUP32+3
  460. #define O_GROUP7 O_GROUP5+3
  461. #define O_x87_ESC O_GROUP7+3
  462. #define O_bModrm O_x87_ESC+2
  463. #define O_wModrm O_bModrm+2
  464. #define O_dModrm O_wModrm+2
  465. #define O_fModrm O_dModrm+2
  466. #define O_vModrm O_fModrm+2
  467. #define O_vModrm_Iv O_vModrm+2
  468. #define O_Reg_bModrm O_vModrm_Iv+3
  469. #define O_Reg_wModrm O_Reg_bModrm+3
  470. #define O_Modrm_Reg_Ib O_Reg_wModrm+3
  471. #define O_Modrm_Reg_CL O_Modrm_Reg_Ib+4
  472. #define O_ST_iST O_Modrm_Reg_CL+5
  473. #define O_iST O_ST_iST+2
  474. #define O_iST_ST O_iST+2
  475. #define O_qModrm O_iST_ST+2
  476. #define O_tModrm O_qModrm+2
  477. #define O_DoRep O_tModrm+2
  478. #define O_Modrm_CReg O_DoRep+1
  479. #define O_CReg_Modrm O_Modrm_CReg+3
  480. #define O_AX_oReg O_CReg_Modrm+3
  481. #define O_length O_AX_oReg+3
  482. #if( O_length > 255 )
  483. #error "operand table too large!"
  484. #endif
  485. /* The action table: range of lists of actions to be taken for each possible */
  486. /* instruction class. */
  487. static unsigned char actiontbl[] = {
  488. /* NoOperands */ NOP+END,
  489. /* NoOpAlt5 */ ALT+END, 5,
  490. /* NoOpAlt4 */ ALT+END, 4,
  491. /* NoOpAlt3 */ ALT+END, 3,
  492. /* NoOpAlt1 */ ALT+END, 1,
  493. /* NoOpAlt0 */ ALT+END, 0,
  494. /* NoOpStrSI */ STROP+END, 1,
  495. /* NoOpStrDI */ STROP+END, 2,
  496. /* NoOpStrSIDI */ STROP+END, 3,
  497. /* bModrm_Reg */ xBYTE+MRM, MODRM+COM, BREG+END,
  498. /* vModrm_Reg */ VAR+MRM, LMODRM+COM, BREG+END,
  499. /* Modrm_Reg */ VAR+MRM, MODRM+COM, VREG+END,
  500. /* bReg_Modrm */ xBYTE+MRM, BREG+COM, MODRM+END,
  501. /* fReg_Modrm */ FARPTR+MRM,VREG+COM, MODRM+END,
  502. /* Reg_Modrm */ VAR+MRM, VREG+COM, MODRM+END,
  503. /* AL_Ib */ ALSTR+COM, IB+END,
  504. /* AX_Iv */ AXSTR+COM, IV+END,
  505. /* sReg2 */ SREG2+END,
  506. /* oReg */ VOREG+END,
  507. /* DoBound */ VAR+MRM, VREG+COM, MODRM+END,
  508. /* Iv */ IV+END,
  509. /* wModrm_Reg */ xWORD+MRM, LMODRM+COM, WREG+END,
  510. /* Ib */ IB+END,
  511. /* Imulb */ VAR+MRM, VREG+COM, MODRM+COM, IB+END,
  512. /* Imul */ VAR+MRM, VREG+COM, MODRM+COM, IV+END,
  513. /* REL8 */ REL8+END,
  514. /* bModrm_Ib */ xBYTE+MRM, LMODRM+COM, IB+END,
  515. /* Modrm_Ib */ VAR+MRM, LMODRM+COM, IB+END,
  516. /* Modrm_Iv */ VAR+MRM, LMODRM+COM, IV+END,
  517. /* Modrm_sReg3 */ xWORD+MRM, MODRM+COM, SREG3+END,
  518. /* sReg3_Modrm */ xWORD+MRM, SREG3+COM, MODRM+END,
  519. /* Modrm */ VAR+MRM, MODRM+END,
  520. /* FarPtr */ ADDRP+END,
  521. /* AL_Offs */ ALSTR+COM, OFFS+END,
  522. /* Offs_AL */ OFFS+COM, ALSTR+END,
  523. /* AX_Offs */ AXSTR+COM, OFFS+END,
  524. /* Offs_AX */ OFFS+COM, AXSTR+END,
  525. /* oReg_Ib */ BOREG+COM, IB+END,
  526. /* oReg_Iv */ VOREG+COM, IV+END,
  527. /* Iw */ IW+END,
  528. /* enter */ IW+COM, IB+END,
  529. /* Ubyte_AL */ UBYTE+COM, ALSTR+END,
  530. /* Ubyte_AX */ UBYTE+COM, AXSTR+END,
  531. /* AL_Ubyte */ ALSTR+COM, UBYTE+END,
  532. /* AX_Ubyte */ AXSTR+COM, UBYTE+END,
  533. /* DoInAL */ ALSTR+COM, WRSTR+END, 2,
  534. /* DoInAX */ AXSTR+COM, WRSTR+END, 2,
  535. /* DoOutAL */ WRSTR+COM, 2, ALSTR+END,
  536. /* DoOutAX */ WRSTR+COM, 2, AXSTR+END,
  537. /* REL16 */ REL16+END,
  538. /* ADR_OVERRIDE*/ ADR_OVR,
  539. /* OPR_OVERRIDE*/ OPR_OVR,
  540. /* SEG_OVERRIDE*/ SEG_OVR,
  541. /* DoInt3 */ CHR+END, '3',
  542. /* DoInt */ UBYTE+END,
  543. /* Opcode0F */ OPC0F,
  544. /* group1_1 */ xBYTE+MRM, GROUP, 0, LMODRM+COM, IB+END,
  545. /* group1_3 */ VAR+MRM, GROUP, 0, LMODRM+COM, IB+END,
  546. /* group1_2 */ VAR+MRM, GROUP, 0, LMODRM+COM, IV+END,
  547. /* group2_1 */ xBYTE+MRM, GROUP, 1, LMODRM+COM, IB+END,
  548. /* group2_2 */ VAR+MRM, GROUP, 1, LMODRM+COM, IB+END,
  549. /* group2_3 */ xBYTE+MRM, GROUP, 1, LMODRM+COM, CHR+END, '1',
  550. /* group2_4 */ VAR+MRM, GROUP, 1, LMODRM+COM, CHR+END, '1',
  551. /* group2_5 */ xBYTE+MRM, GROUP, 1, LMODRM+COM, BRSTR+END, 1,
  552. /* group2_6 */ VAR+MRM, GROUP, 1, LMODRM+COM, BRSTR+END, 1,
  553. /* group4 */ xBYTE+MRM, GROUP, 2, LMODRM+END,
  554. /* group6 */ xWORD+MRM, GROUP, 3, LMODRM+END,
  555. /* group8 */ xWORD+MRM, GROUP, 4, LMODRM+COM, IB+END,
  556. /* group3_1 */ xBYTE+MRM, GROUPT, 20,
  557. /* group3_2 */ VAR+MRM, GROUPT, 21,
  558. /* group5 */ VAR+MRM, GROUPT, 22,
  559. /* group7 */ NOP+MRM, GROUPT, 23,
  560. /* x87_ESC */ NOP+MRM, EGROUPT,
  561. /* bModrm */ xBYTE+MRM, LMODRM+END,
  562. /* wModrm */ xWORD+MRM, LMODRM+END,
  563. /* dModrm */ xDWORD+MRM,LMODRM+END,
  564. /* fModrm */ FARPTR+MRM,LMODRM+END,
  565. /* vModrm */ VAR+MRM, LMODRM+END,
  566. /* vModrm_Iv */ VAR+MRM, LMODRM+COM, IV+END,
  567. /* reg_bModrm */ xBYTE+MRM, VREG+COM, LMODRM+END,
  568. /* reg_wModrm */ xWORD+MRM, VREG+COM, LMODRM+END,
  569. /* Modrm_Reg_Ib*/ VAR+MRM, MODRM+COM, VREG+COM, IB+END,
  570. /* Modrm_Reg_CL*/ VAR+MRM, MODRM+COM, VREG+COM, BRSTR+END, 1,
  571. /* ST_iST */ NOP+MRM, ST_IST+END,
  572. /* iST */ NOP+MRM, IST+END,
  573. /* iST_ST */ NOP+MRM, IST_ST+END,
  574. /* qModrm */ QWORD+MRM, LMODRM+END,
  575. /* tModrm */ TBYTE+MRM, LMODRM+END,
  576. /* REP */ REP,
  577. /* Modrm_CReg */ EDWORD+MRM,MODRM+COM, CREG+END,
  578. /* CReg_Modrm */ EDWORD+MRM,CREG+COM, MODRM+END,
  579. /* AX_oReg */ AXSTR+COM, VOREG+END
  580. };
  581. #if defined(_M_IX86)
  582. #define BUILDING_ON_X86 1
  583. #else
  584. #define BUILDING_ON_X86 0
  585. #endif
  586. #if BUILDING_ON_X86 == 1
  587. #pragma pack(1)
  588. #endif
  589. typedef struct Tdistbl{
  590. char *instruct;
  591. unsigned char opr;
  592. } Tdistbl;
  593. #if BUILDING_ON_X86 == 1
  594. #pragma pack()
  595. #endif
  596. //
  597. // Secondary opcode table is compressed - only "filled" locations are
  598. // allocated space in distbl. Offsets for indexing into the secondary
  599. // opcode table are calculcated as follows and defined below.
  600. //
  601. // Pack# Opcodes in Pack #Ops before Offset(add to opcode)
  602. // 1 0h - Bh 0 256 (# of primary opcodes)
  603. // 2 20h - 26h 12 256-32+12 = 236
  604. // 3 30h - 33h 19 256-48+19 = 227
  605. // 4 40h - 4fh 23 256-64+23 = 215
  606. // 5 7dh - cfh 39 256-125+39 = 170
  607. //
  608. #define SECTAB_OFFSET_1 256
  609. #define SECTAB_OFFSET_2 236
  610. #define SECTAB_OFFSET_3 227
  611. #define SECTAB_OFFSET_4 215
  612. #define SECTAB_OFFSET_5 170
  613. #define SECTAB_OFFSET_UNDEF 260
  614. /* List of ordered pairs for each instruction: */
  615. /* (pointer to string literal mnemonic, */
  616. /* instruction class index for action table) */
  617. static Tdistbl distbl[] = {
  618. dszADD, O_bModrm_Reg, /* 00 ADD mem/reg, reg (byte) */
  619. dszADD, O_Modrm_Reg, /* 01 ADD mem/reg, reg (word) */
  620. dszADD, O_bReg_Modrm, /* 02 ADD reg, mem/reg (byte) */
  621. dszADD, O_Reg_Modrm, /* 03 ADD reg, mem/reg (word) */
  622. dszADD, O_AL_Ib, /* 04 ADD AL, I */
  623. dszADD, O_AX_Iv, /* 05 ADD AX, I */
  624. dszPUSH, O_sReg2, /* 06 PUSH ES */
  625. dszPOP, O_sReg2, /* 07 POP ES */
  626. dszOR, O_bModrm_Reg, /* 08 OR mem/reg, reg (byte) */
  627. dszOR, O_Modrm_Reg, /* 09 OR mem/reg, reg (word) */
  628. dszOR, O_bReg_Modrm, /* 0A OR reg, mem/reg (byte) */
  629. dszOR, O_Reg_Modrm, /* 0B OR reg, mem/reg (word) */
  630. dszOR, O_AL_Ib, /* 0C OR AL, I */
  631. dszOR, O_AX_Iv, /* 0D OR AX, I */
  632. dszPUSH, O_sReg2, /* 0E PUSH CS */
  633. dszMULTI, O_OPC0F, /* 0F CLTS & protection ctl(286) */
  634. dszADC, O_bModrm_Reg, /* 10 ADC mem/reg, reg (byte) */
  635. dszADC, O_Modrm_Reg, /* 11 ADC mem/reg, reg (word) */
  636. dszADC, O_bReg_Modrm, /* 12 ADC reg, mem/reg (byte) */
  637. dszADC, O_Reg_Modrm, /* 13 ADC reg, mem/reg (word) */
  638. dszADC, O_AL_Ib, /* 14 ADC AL, I */
  639. dszADC, O_AX_Iv, /* 15 ADC AX, I */
  640. dszPUSH, O_sReg2, /* 16 PUSH SS */
  641. dszPOP, O_sReg2, /* 17 POP SS */
  642. dszSBB, O_bModrm_Reg, /* 18 SBB mem/reg, reg (byte) */
  643. dszSBB, O_Modrm_Reg, /* 19 SBB mem/reg, reg (word) */
  644. dszSBB, O_bReg_Modrm, /* 1A SBB reg, mem/reg (byte) */
  645. dszSBB, O_Reg_Modrm, /* 1B SBB reg, mem/reg (word) */
  646. dszSBB, O_AL_Ib, /* 1C SBB AL, I */
  647. dszSBB, O_AX_Iv, /* 1D SBB AX, I */
  648. dszPUSH, O_sReg2, /* 1E PUSH DS */
  649. dszPOP, O_sReg2, /* 1F POP DS */
  650. dszAND, O_bModrm_Reg, /* 20 AND mem/reg, reg (byte) */
  651. dszAND, O_Modrm_Reg, /* 21 AND mem/reg, reg (word) */
  652. dszAND, O_bReg_Modrm, /* 22 AND reg, mem/reg (byte) */
  653. dszAND, O_Reg_Modrm, /* 23 AND reg, mem/reg (word) */
  654. dszAND, O_AL_Ib, /* 24 AND AL, I */
  655. dszAND, O_AX_Iv, /* 25 AND AX, I */
  656. dszES_, O_SEG_OVERRIDE, /* 26 SEG ES: */
  657. dszDAA, O_NoOperands, /* 27 DAA */
  658. dszSUB, O_bModrm_Reg, /* 28 SUB mem/reg, reg (byte) */
  659. dszSUB, O_Modrm_Reg, /* 29 SUB mem/reg, reg (word) */
  660. dszSUB, O_bReg_Modrm, /* 2A SUB reg, mem/reg (byte) */
  661. dszSUB, O_Reg_Modrm, /* 2B SUB reg, mem/reg (word) */
  662. dszSUB, O_AL_Ib, /* 2C SUB AL, I */
  663. dszSUB, O_AX_Iv, /* 2D SUB AX, I */
  664. dszCS_, O_SEG_OVERRIDE, /* 2E SEG CS: */
  665. dszDAS, O_NoOperands, /* 2F DAS */
  666. dszXOR, O_bModrm_Reg, /* 30 XOR mem/reg, reg (byte) */
  667. dszXOR, O_Modrm_Reg, /* 31 XOR mem/reg, reg (word) */
  668. dszXOR, O_bReg_Modrm, /* 32 XOR reg, mem/reg (byte) */
  669. dszXOR, O_Reg_Modrm, /* 33 XOR reg, mem/reg (word) */
  670. dszXOR, O_AL_Ib, /* 34 XOR AL, I */
  671. dszXOR, O_AX_Iv, /* 35 XOR AX, I */
  672. dszSS_, O_SEG_OVERRIDE, /* 36 SEG SS: */
  673. dszAAA, O_NoOperands, /* 37 AAA */
  674. dszCMP, O_bModrm_Reg, /* 38 CMP mem/reg, reg (byte) */
  675. dszCMP, O_Modrm_Reg, /* 39 CMP mem/reg, reg (word) */
  676. dszCMP, O_bReg_Modrm, /* 3A CMP reg, mem/reg (byte) */
  677. dszCMP, O_Reg_Modrm, /* 3B CMP reg, mem/reg (word) */
  678. dszCMP, O_AL_Ib, /* 3C CMP AL, I */
  679. dszCMP, O_AX_Iv, /* 3D CMP AX, I */
  680. dszDS_, O_SEG_OVERRIDE, /* 3E SEG DS: */
  681. dszAAS, O_NoOperands, /* 3F AAS */
  682. dszINC, O_oReg, /* 40 INC AX */
  683. dszINC, O_oReg, /* 41 INC CX */
  684. dszINC, O_oReg, /* 42 INC DX */
  685. dszINC, O_oReg, /* 43 INC BX */
  686. dszINC, O_oReg, /* 44 INC SP */
  687. dszINC, O_oReg, /* 45 INC BP */
  688. dszINC, O_oReg, /* 46 INC SI */
  689. dszINC, O_oReg, /* 47 INC DI */
  690. dszDEC, O_oReg, /* 48 DEC AX */
  691. dszDEC, O_oReg, /* 49 DEC CX */
  692. dszDEC, O_oReg, /* 4A DEC DX */
  693. dszDEC, O_oReg, /* 4B DEC BX */
  694. dszDEC, O_oReg, /* 4C DEC SP */
  695. dszDEC, O_oReg, /* 4D DEC BP */
  696. dszDEC, O_oReg, /* 4E DEC SI */
  697. dszDEC, O_oReg, /* 4F DEC DI */
  698. dszPUSH, O_oReg, /* 50 PUSH AX */
  699. dszPUSH, O_oReg, /* 51 PUSH CX */
  700. dszPUSH, O_oReg, /* 52 PUSH DX */
  701. dszPUSH, O_oReg, /* 53 PUSH BX */
  702. dszPUSH, O_oReg, /* 54 PUSH SP */
  703. dszPUSH, O_oReg, /* 55 PUSH BP */
  704. dszPUSH, O_oReg, /* 56 PUSH SI */
  705. dszPUSH, O_oReg, /* 57 PUSH DI */
  706. dszPOP, O_oReg, /* 58 POP AX */
  707. dszPOP, O_oReg, /* 59 POP CX */
  708. dszPOP, O_oReg, /* 5A POP DX */
  709. dszPOP, O_oReg, /* 5B POP BX */
  710. dszPOP, O_oReg, /* 5C POP SP */
  711. dszPOP, O_oReg, /* 5D POP BP */
  712. dszPOP, O_oReg, /* 5E POP SI */
  713. dszPOP, O_oReg, /* 5F POP DI */
  714. dszPUSHA, O_NoOpAlt5, /* 60 PUSHA (286) / PUSHAD (386) */
  715. dszPOPA, O_NoOpAlt4, /* 61 POPA (286) / POPAD (286) */
  716. dszBOUND, O_DoBound, /* 62 BOUND reg, Modrm (286) */
  717. dszARPL, O_Modrm_Reg, /* 63 ARPL Modrm, reg (286) */
  718. dszFS_, O_SEG_OVERRIDE, /* 64 */
  719. dszGS_, O_SEG_OVERRIDE, /* 65 */
  720. dszOPPRFX,O_OPR_OVERRIDE, /* 66 */
  721. dszADDRPRFX,O_ADR_OVERRIDE, /* 67 */
  722. dszPUSH, O_Iv, /* 68 PUSH word (286) */
  723. dszIMUL, O_Imul, /* 69 IMUL (286) */
  724. dszPUSH, O_Ib, /* 6A PUSH byte (286) */
  725. dszIMUL, O_Imulb, /* 6B IMUL (286) */
  726. dszINSB, O_NoOperands, /* 6C INSB (286) */
  727. dszINSW, O_NoOpAlt3, /* 6D INSW (286) / INSD (386) */
  728. dszOUTSB, O_NoOperands, /* 6E OUTSB (286) */
  729. dszOUTSW, O_NoOpAlt4, /* 6F OUTSW (286) / OUTSD (386) */
  730. dszJO, O_Rel8, /* 70 JO */
  731. dszJNO, O_Rel8, /* 71 JNO */
  732. dszJB, O_Rel8, /* 72 JB or JNAE or JC */
  733. dszJNB, O_Rel8, /* 73 JNB or JAE or JNC */
  734. dszJZ, O_Rel8, /* 74 JE or JZ */
  735. dszJNZ, O_Rel8, /* 75 JNE or JNZ */
  736. dszJBE, O_Rel8, /* 76 JBE or JNA */
  737. dszJA, O_Rel8, /* 77 JNBE or JA */
  738. dszJS, O_Rel8, /* 78 JS */
  739. dszJNS, O_Rel8, /* 79 JNS */
  740. dszJPE, O_Rel8, /* 7A JP or JPE */
  741. dszJPO, O_Rel8, /* 7B JNP or JPO */
  742. dszJL, O_Rel8, /* 7C JL or JNGE */
  743. dszJGE, O_Rel8, /* 7D JNL or JGE */
  744. dszJLE, O_Rel8, /* 7E JLE or JNG */
  745. dszJG, O_Rel8, /* 7F JNLE or JG */
  746. dszMULTI, O_GROUP11, /* 80 */
  747. dszMULTI, O_GROUP12, /* 81 */
  748. dszRESERVED, O_DoDB, /* 82 */
  749. dszMULTI, O_GROUP13, /* 83 */
  750. dszTEST, O_bModrm_Reg, /* 84 TEST reg, mem/reg (byte) */
  751. dszTEST, O_Modrm_Reg, /* 85 TEST reg, mem/reg (word) */
  752. dszXCHG, O_bModrm_Reg, /* 86 XCHG reg, mem/reg (byte) */
  753. dszXCHG, O_Modrm_Reg, /* 87 XCHG reg, mem/reg (word) */
  754. dszMOV, O_bModrm_Reg, /* 88 MOV mem/reg, reg (byte) */
  755. dszMOV, O_Modrm_Reg, /* 89 MOV mem/reg, reg (word) */
  756. dszMOV, O_bReg_Modrm, /* 8A MOV reg, mem/reg (byte) */
  757. dszMOV, O_Reg_Modrm, /* 8B MOV reg, mem/reg (word) */
  758. dszMOV, O_Modrm_sReg3, /* 8C MOV mem/reg, segreg */
  759. dszLEA, O_Reg_Modrm, /* 8D LEA reg, mem */
  760. dszMOV, O_sReg3_Modrm, /* 8E MOV segreg, mem/reg */
  761. dszPOP, O_Modrm, /* 8F POP mem/reg */
  762. dszNOP, O_NoOperands, /* 90 NOP */
  763. dszXCHG, O_AX_oReg, /* 91 XCHG AX,CX */
  764. dszXCHG, O_AX_oReg, /* 92 XCHG AX,DX */
  765. dszXCHG, O_AX_oReg, /* 93 XCHG AX,BX */
  766. dszXCHG, O_AX_oReg, /* 94 XCHG AX,SP */
  767. dszXCHG, O_AX_oReg, /* 95 XCHG AX,BP */
  768. dszXCHG, O_AX_oReg, /* 96 XCHG AX,SI */
  769. dszXCHG, O_AX_oReg, /* 97 XCHG AX,DI */
  770. dszCBW, O_NoOpAlt0, /* 98 CBW / CWDE (386) */
  771. dszCWD, O_NoOpAlt1, /* 99 CWD / CDQ (386) */
  772. dszCALL, O_FarPtr, /* 9A CALL seg:off */
  773. dszWAIT, O_NoOperands, /* 9B WAIT */
  774. dszPUSHF, O_NoOpAlt5, /* 9C PUSHF / PUSHFD (386) */
  775. dszPOPF, O_NoOpAlt4, /* 9D POPF / POPFD (386) */
  776. dszSAHF, O_NoOperands, /* 9E SAHF */
  777. dszLAHF, O_NoOperands, /* 9F LAHF */
  778. dszMOV, O_AL_Offs, /* A0 MOV AL, mem */
  779. dszMOV, O_AX_Offs, /* A1 MOV AX, mem */
  780. dszMOV, O_Offs_AL, /* A2 MOV mem, AL */
  781. dszMOV, O_Offs_AX, /* A3 MOV mem, AX */
  782. dszMOVSB, O_NoOpStrSIDI, /* A4 MOVSB */
  783. dszMOVSW, O_NoOpStrSIDI, /* A5 MOVSW / MOVSD (386) */
  784. dszCMPSB, O_NoOpStrSIDI, /* A6 CMPSB */
  785. dszCMPSW, O_NoOpStrSIDI, /* A7 CMPSW / CMPSD (386) */
  786. dszTEST, O_AL_Ib, /* A8 TEST AL, I */
  787. dszTEST, O_AX_Iv, /* A9 TEST AX, I */
  788. dszSTOSB, O_NoOpStrDI, /* AA STOSB */
  789. dszSTOSW, O_NoOpStrDI, /* AB STOSW / STOSD (386) */
  790. dszLODSB, O_NoOpStrSI, /* AC LODSB */
  791. dszLODSW, O_NoOpStrSI, /* AD LODSW / LODSD (386) */
  792. dszSCASB, O_NoOpStrDI, /* AE SCASB */
  793. dszSCASW, O_NoOpStrDI, /* AF SCASW / SCASD (386) */
  794. dszMOV, O_oReg_Ib, /* B0 MOV AL, I */
  795. dszMOV, O_oReg_Ib, /* B1 MOV CL, I */
  796. dszMOV, O_oReg_Ib, /* B2 MOV DL, I */
  797. dszMOV, O_oReg_Ib, /* B3 MOV BL, I */
  798. dszMOV, O_oReg_Ib, /* B4 MOV AH, I */
  799. dszMOV, O_oReg_Ib, /* B5 MOV CH, I */
  800. dszMOV, O_oReg_Ib, /* B6 MOV DH, I */
  801. dszMOV, O_oReg_Ib, /* B7 MOV BH, I */
  802. dszMOV, O_oReg_Iv, /* B8 MOV AX, I */
  803. dszMOV, O_oReg_Iv, /* B9 MOV CX, I */
  804. dszMOV, O_oReg_Iv, /* BA MOV DX, I */
  805. dszMOV, O_oReg_Iv, /* BB MOV BX, I */
  806. dszMOV, O_oReg_Iv, /* BC MOV SP, I */
  807. dszMOV, O_oReg_Iv, /* BD MOV BP, I */
  808. dszMOV, O_oReg_Iv, /* BE MOV SI, I */
  809. dszMOV, O_oReg_Iv, /* BF MOV DI, I */
  810. dszMULTI, O_GROUP21, /* C0 shifts & rotates (286) */
  811. dszMULTI, O_GROUP22, /* C1 shifts & rotates (286) */
  812. dszRET, O_Iw, /* C2 RET Rel16 */
  813. dszRET, O_NoOperands, /* C3 RET */
  814. dszLES, O_fReg_Modrm, /* C4 LES reg, mem */
  815. dszLDS, O_fReg_Modrm, /* C5 LDS reg, mem */
  816. dszMOV, O_bModrm_Ib, /* C6 MOV mem/reg, I(byte) */
  817. dszMOV, O_Modrm_Iv, /* C7 MOV mem/reg, I(word) */
  818. dszENTER, O_Enter, /* C8 ENTER (286) */
  819. dszLEAVE, O_NoOperands, /* C9 LEAVE (286) */
  820. dszRETF, O_Iw, /* CA RETF I(word) */
  821. dszRETF, O_NoOperands, /* CB RETF */
  822. dszINT, O_DoInt3, /* CC INT 3 */
  823. dszINT, O_DoInt, /* CD INT */
  824. dszINTO, O_NoOperands, /* CE INTO */
  825. dszIRET, O_NoOpAlt4, /* CF IRET / IRETD (386) */
  826. dszMULTI, O_GROUP23, /* D0 shifts & rotates,1 (byte) */
  827. dszMULTI, O_GROUP24, /* D1 shifts & rotates,1 (word) */
  828. dszMULTI, O_GROUP25, /* D2 shifts & rotates,CL (byte) */
  829. dszMULTI, O_GROUP26, /* D3 shifts & rotates,CL (word) */
  830. dszAAM, O_Ib, /* D4 AAM */
  831. dszAAD, O_Ib, /* D5 AAD */
  832. dszRESERVED, O_DoDB, /* D6 */
  833. dszXLAT, O_NoOperands, /* D7 XLAT */
  834. dszMULTI, O_x87_ESC, /* D8 ESC */
  835. dszMULTI, O_x87_ESC, /* D9 ESC */
  836. dszMULTI, O_x87_ESC, /* DA ESC */
  837. dszMULTI, O_x87_ESC, /* DB ESC */
  838. dszMULTI, O_x87_ESC, /* DC ESC */
  839. dszMULTI, O_x87_ESC, /* DD ESC */
  840. dszMULTI, O_x87_ESC, /* DE ESC */
  841. dszMULTI, O_x87_ESC, /* DF ESC */
  842. dszLOOPNE,O_Rel8, /* E0 LOOPNE or LOOPNZ */
  843. dszLOOPE, O_Rel8, /* E1 LOOPE or LOOPZ */
  844. dszLOOP, O_Rel8, /* E2 LOOP */
  845. dszJCXZ, O_Rel8, /* E3 JCXZ / JECXZ (386) */
  846. dszIN, O_AL_Ubyte, /* E4 IN AL, I */
  847. dszIN, O_AX_Ubyte, /* E5 IN AX, I */
  848. dszOUT, O_Ubyte_AL, /* E6 OUT I, AL */
  849. dszOUT, O_Ubyte_AX, /* E7 OUT I, AX */
  850. dszCALL, O_Rel16, /* E8 CALL Rel16 */
  851. dszJMP, O_Rel16, /* E9 JMP Rel16 */
  852. dszJMP, O_FarPtr, /* EA JMP seg:off */
  853. dszJMP, O_Rel8, /* EB JMP Rel8 */
  854. dszIN, O_DoInAL, /* EC IN AL, DX */
  855. dszIN, O_DoInAX, /* ED IN AX, DX */
  856. dszOUT, O_DoOutAL, /* EE OUT DX, AL */
  857. dszOUT, O_DoOutAX, /* EF OUT DX, AX */
  858. dszLOCK, O_DoRep, /* F0 LOCK */
  859. dszRESERVED, O_DoDB, /* F1 */
  860. dszREPNE, O_DoRep, /* F2 REPNE or REPNZ */
  861. dszREP, O_DoRep, /* F3 REP or REPE or REPZ */
  862. dszHLT, O_NoOperands, /* F4 HLT */
  863. dszCMC, O_NoOperands, /* F5 CMC */
  864. dszMULTI, O_GROUP31, /* F6 TEST, NOT, NEG, MUL, IMUL, */
  865. dszMULTI, O_GROUP32, /* F7 DIv, IDIv F6=Byte F7=Word */
  866. dszCLC, O_NoOperands, /* F8 CLC */
  867. dszSTC, O_NoOperands, /* F9 STC */
  868. dszCLI, O_NoOperands, /* FA CLI */
  869. dszSTI, O_NoOperands, /* FB STI */
  870. dszCLD, O_NoOperands, /* FC CLD */
  871. dszSTD, O_NoOperands, /* FD STD */
  872. dszMULTI, O_GROUP4, /* FE INC, DEC mem/reg (byte) */
  873. dszMULTI, O_GROUP5, /* FF INC, DEC, CALL, JMP, PUSH */
  874. // secondary opcode table begins. Only "filled" locations are stored
  875. // to compress the secondary table. Hence while disassembling
  876. // opcode needs to be displaced appropriately to account for the.
  877. // The displacements are defined in 86dis.c and need to be reevaluated
  878. // if new opcodes are added here.
  879. dszMULTI, O_GROUP6, /* 0 MULTI */
  880. dszMULTI, O_GROUP7, /* 1 MULTI */
  881. dszLAR, O_Reg_Modrm, /* 2 LAR */
  882. dszLSL, O_Reg_Modrm, /* 3 LSL */
  883. dszRESERVED, O_DoDB, /* 4 */
  884. dszLOADALL, O_NoOperands, /* 5 LOADALL */
  885. dszCLTS, O_NoOperands, /* 6 CLTS */
  886. dszMULTI, O_GROUP7, /* 7 MULTI */
  887. dszINVD, O_NoOperands, /* 8 INVD */
  888. dszWBINVD,O_NoOperands, /* 9 WBINVD */
  889. dszRESERVED, O_DoDB, /* A */
  890. dszUD2, O_NoOperands, /* B UD2 undefined */
  891. dszMOV, O_Modrm_CReg, /* 20 MOV Rd,Cd */
  892. dszMOV, O_Modrm_CReg, /* 21 MOV Rd,Dd */
  893. dszMOV, O_CReg_Modrm, /* 22 MOV Cd,Rd */
  894. dszMOV, O_CReg_Modrm, /* 23 MOV Dd,Rd */
  895. dszMOV, O_Modrm_CReg, /* 24 MOV Rd,Td */
  896. dszRESERVED, O_DoDB, /* 25 */
  897. dszMOV, O_CReg_Modrm, /* 26 MOV Td,Rd */
  898. dszWRMSR, O_NoOperands, /* 30 WRMSR */
  899. dszRDTSC, O_NoOperands, /* 31 RDTSC */
  900. dszRDMSR, O_NoOperands, /* 32 RDMSR */
  901. dszRDPMC, O_NoOperands, /* 33 RDPMC */
  902. dszCMOVO, O_Reg_Modrm, /* 40 CMOVO */
  903. dszCMOVNO, O_Reg_Modrm, /* 41 CMOVNO */
  904. dszCMOVB, O_Reg_Modrm, /* 42 CMOVB */
  905. dszCMOVNB, O_Reg_Modrm, /* 43 CMOVNB */
  906. dszCMOVE, O_Reg_Modrm, /* 44 CMOVE */
  907. dszCMOVNE, O_Reg_Modrm, /* 45 CMOVNE */
  908. dszCMOVBE, O_Reg_Modrm, /* 46 CMOVBE */
  909. dszCMOVA, O_Reg_Modrm, /* 47 CMOVNBE */
  910. dszCMOVS, O_Reg_Modrm, /* 48 CMOVS */
  911. dszCMOVNS, O_Reg_Modrm, /* 49 CMOVNS */
  912. dszCMOVP, O_Reg_Modrm, /* 4A CMOVP */
  913. dszCMOVNP, O_Reg_Modrm, /* 4B CMOVNP */
  914. dszCMOVL, O_Reg_Modrm, /* 4C CMOVL */
  915. dszCMOVGE, O_Reg_Modrm, /* 4D CMOVGE */
  916. dszCMOVLE, O_Reg_Modrm, /* 4E CMOVLE */
  917. dszCMOVNLE,O_Reg_Modrm, /* 4F CMOVNLE */
  918. dszSETNL, O_bModrm, /* 7D SETNL */
  919. dszRESERVED, O_DoDB, /* 7E */
  920. dszRESERVED, O_DoDB, /* 7F */
  921. dszJO, O_Rel16, /* 80 JO */
  922. dszJNO, O_Rel16, /* 81 JNO */
  923. dszJB, O_Rel16, /* 82 JB */
  924. dszJNB, O_Rel16, /* 83 JNB */
  925. dszJE, O_Rel16, /* 84 JE */
  926. dszJNE, O_Rel16, /* 85 JNE */
  927. dszJBE, O_Rel16, /* 86 JBE */
  928. dszJNBE, O_Rel16, /* 87 JNBE */
  929. dszJS, O_Rel16, /* 88 JS */
  930. dszJNS, O_Rel16, /* 89 JNS */
  931. dszJP, O_Rel16, /* 8A JP */
  932. dszJNP, O_Rel16, /* 8B JNP */
  933. dszJL, O_Rel16, /* 8C JL */
  934. dszJNL, O_Rel16, /* 8D JNL */
  935. dszJLE, O_Rel16, /* 8E JLE */
  936. dszJNLE, O_Rel16, /* 8F JNLE */
  937. dszSETO, O_bModrm, /* 90 SETO */
  938. dszSETNO, O_bModrm, /* 91 SETNO */
  939. dszSETB, O_bModrm, /* 92 SETB */
  940. dszSETNB, O_bModrm, /* 93 SETNB */
  941. dszSETE, O_bModrm, /* 94 SETE */
  942. dszSETNE, O_bModrm, /* 95 SETNE */
  943. dszSETBE, O_bModrm, /* 96 SETBE */
  944. dszSETA, O_bModrm, /* 97 SETNBE */
  945. dszSETS, O_bModrm, /* 98 SETS */
  946. dszSETNS, O_bModrm, /* 99 SETNS */
  947. dszSETP, O_bModrm, /* 9A SETP */
  948. dszSETNP, O_bModrm, /* 9B SETNP */
  949. dszSETL, O_bModrm, /* 9C SETL */
  950. dszSETGE, O_bModrm, /* 9D SETGE */
  951. dszSETLE, O_bModrm, /* 9E SETLE */
  952. dszSETNLE,O_bModrm, /* 9F SETNLE */
  953. dszPUSH, O_sReg2, /* A0 PUSH FS */
  954. dszPOP, O_sReg2, /* A1 POP FS */
  955. dszCPUID, O_NoOperands, /* A2 CPUID */
  956. dszBT, O_Modrm_Reg, /* A3 BT */
  957. dszSHLD, O_Modrm_Reg_Ib, /* A4 SHLD */
  958. dszSHLD, O_Modrm_Reg_CL, /* A5 SHLD */
  959. dszCMPXCHG,O_bModrm_Reg, /* A6 XBTS */
  960. dszCMPXCHG,O_Modrm_Reg, /* A7 IBTS */
  961. dszPUSH, O_sReg2, /* A8 PUSH GS */
  962. dszPOP, O_sReg2, /* A9 POP GS */
  963. dszRSM, O_NoOperands, /* AA RSM */
  964. dszBTS, O_vModrm_Reg, /* AB BTS */
  965. dszSHRD, O_Modrm_Reg_Ib, /* AC SHRD */
  966. dszSHRD, O_Modrm_Reg_CL, /* AD SHRD */
  967. dszRESERVED, O_DoDB, /* AE */
  968. dszIMUL, O_Reg_Modrm, /* AF IMUL */
  969. dszRESERVED, O_DoDB, /* B0 */
  970. dszRESERVED, O_DoDB, /* B1 */
  971. dszLSS, O_fReg_Modrm, /* B2 LSS */
  972. dszBTR, O_Modrm_Reg, /* B3 BTR */
  973. dszLFS, O_fReg_Modrm, /* B4 LFS */
  974. dszLGS, O_fReg_Modrm, /* B5 LGS */
  975. dszMOVZX, O_Reg_bModrm, /* B6 MOVZX */
  976. dszMOVZX, O_Reg_wModrm, /* B7 MOVZX */
  977. dszRESERVED, O_DoDB, /* B8 */
  978. dszRESERVED, O_DoDB, /* B9 */
  979. dszMULTI, O_GROUP8, /* BA MULTI */
  980. dszBTC, O_Modrm_Reg, /* BB BTC */
  981. dszBSF, O_Reg_Modrm, /* BC BSF */
  982. dszBSR, O_Reg_Modrm, /* BD BSR */
  983. dszMOVSX, O_Reg_bModrm, /* BE MOVSX */
  984. dszMOVSX, O_Reg_wModrm, /* BF MOVSX */
  985. dszXADD, O_bModrm_Reg, /* C0 XADD */
  986. dszXADD, O_Modrm_Reg, /* C1 XADD */
  987. dszRESERVED, O_DoDB, /* C2 */
  988. dszRESERVED, O_DoDB, /* C3 */
  989. dszRESERVED, O_DoDB, /* C4 */
  990. dszRESERVED, O_DoDB, /* C5 */
  991. dszRESERVED, O_DoDB, /* C6 */
  992. dszCMPXCHG8B, O_qModrm, /* C7 CMPXCHG8B */
  993. dszBSWAP, O_oReg, /* C8 BSWAP */
  994. dszBSWAP, O_oReg, /* C9 BSWAP */
  995. dszBSWAP, O_oReg, /* CA BSWAP */
  996. dszBSWAP, O_oReg, /* CB BSWAP */
  997. dszBSWAP, O_oReg, /* CC BSWAP */
  998. dszBSWAP, O_oReg, /* CD BSWAP */
  999. dszBSWAP, O_oReg, /* CE BSWAP */
  1000. dszBSWAP, O_oReg /* CF BSWAP */
  1001. };
  1002. /* Auxilary lists of mnemonics for groups of two byte instructions: */
  1003. /* All of the instructions within each of these groups are of the same */
  1004. /* class, so only the mnemonic string is needed, the index into the */
  1005. /* action table is implicit. */
  1006. static char *group[][8] = {
  1007. /* 00 */ {dszADD, dszOR, dszADC, dszSBB, /* group 1 */
  1008. dszAND, dszSUB, dszXOR, dszCMP},
  1009. /* 01 */ {dszROL, dszROR, dszRCL, dszRCR, /* group 2 */
  1010. dszSHL, dszSHR, dszRESERVED, dszSAR},
  1011. /* 02 */ {dszINC, dszDEC, dszRESERVED, dszRESERVED, /* group 4 */
  1012. dszRESERVED, dszRESERVED, dszRESERVED, dszRESERVED},
  1013. /* 03 */ {dszSLDT, dszSTR, dszLLDT, dszLTR, /* group 6 */
  1014. dszVERR, dszVERW, dszRESERVED, dszRESERVED},
  1015. /* 04 */ {dszRESERVED, dszRESERVED, dszRESERVED, dszRESERVED, /* group 8 */
  1016. dszBT, dszBTS, dszBTR, dszBTC}
  1017. };
  1018. /* Auxilary orderd pairs for groups of two byte instructions structured */
  1019. /* the same was as distbl above. */
  1020. static Tdistbl groupt[][8] = {
  1021. /* 00 00 x87-D8-1 */
  1022. { dszFADD, O_dModrm, /* D8-0 FADD */
  1023. dszFMUL, O_dModrm, /* D8-1 FMUL */
  1024. dszFCOM, O_dModrm, /* D8-2 FCOM */
  1025. dszFCOMP, O_dModrm, /* D8-3 FCOMP */
  1026. dszFSUB, O_dModrm, /* D8-4 FSUB */
  1027. dszFSUBR, O_dModrm, /* D8-5 FSUBR */
  1028. dszFDIV, O_dModrm, /* D8-6 FDIV */
  1029. dszFDIVR, O_dModrm }, /* D8-7 FDIVR */
  1030. /* 01 x87-D8-2 */
  1031. { dszFADD, O_ST_iST, /* D8-0 FADD */
  1032. dszFMUL, O_ST_iST, /* D8-1 FMUL */
  1033. dszFCOM, O_iST, /* D8-2 FCOM */
  1034. dszFCOMP, O_iST, /* D8-3 FCOMP */
  1035. dszFSUB, O_ST_iST, /* D8-4 FSUB */
  1036. dszFSUBR, O_ST_iST, /* D8-5 FSUBR */
  1037. dszFDIV, O_ST_iST, /* D8-6 FDIV */
  1038. dszFDIVR, O_ST_iST }, /* D8-7 FDIVR */
  1039. /* 02 01 x87-D9-1 */
  1040. { dszFLD, O_dModrm, /* D9-0 FLD */
  1041. dszRESERVED, O_DoDB, /* D9-1 */
  1042. dszFST, O_dModrm, /* D9-2 FST */
  1043. dszFSTP, O_dModrm, /* D9-3 FSTP */
  1044. dszFLDENV, O_Modrm, /* D9-4 FLDENV */
  1045. dszFLDCW, O_Modrm, /* D9-5 FLDCW */
  1046. dszFSTENV, O_Modrm, /* D9-6 FSTENV */
  1047. dszFSTCW, O_Modrm }, /* D9-7 FSTCW */
  1048. /* 03 01 x87-D9-2 TTT=0,1,2,3 */
  1049. { dszFLD, O_iST, /* D9-0 FLD */
  1050. dszFXCH, O_iST, /* D9-1 FXCH */
  1051. dszFNOP, O_NoOperands, /* D9-2 FNOP */
  1052. dszFSTP, O_iST, /* D9-3 FSTP */
  1053. dszRESERVED, O_DoDB, /* D9-4 */
  1054. dszRESERVED, O_DoDB, /* D9-5 */
  1055. dszRESERVED, O_DoDB, /* D9-6 */
  1056. dszRESERVED, O_DoDB }, /* D9-7 */
  1057. /* 04 02 x89-DA-1 */
  1058. { dszFIADD, O_dModrm, /* DA-0 FIADD */
  1059. dszFIMUL, O_dModrm, /* DA-1 FIMUL */
  1060. dszFICOM, O_dModrm, /* DA-2 FICOM */
  1061. dszFICOMP, O_dModrm, /* DA-3 FICOMP */
  1062. dszFISUB, O_dModrm, /* DA-4 FISUB */
  1063. dszFISUBR, O_dModrm, /* DA-5 FISUBR */
  1064. dszFIDIV, O_dModrm, /* DA-6 FIDIV */
  1065. dszFIDIVR, O_dModrm }, /* DA-7 FIDIVR */
  1066. /* 05 x87-DA-2 */
  1067. { dszFCMOVB, O_ST_iST, /* DA-0 FCMOVB */
  1068. dszFCMOVE, O_ST_iST, /* DA-1 FCMOVE */
  1069. dszFCMOVBE, O_ST_iST, /* DA-2 FCMOVBE */
  1070. dszFCMOVU, O_ST_iST, /* DA-3 FCMOVU */
  1071. dszRESERVED, O_DoDB, /* DA-4 */
  1072. dszFUCOMPP, O_NoOperands, /* DA-5 */
  1073. dszRESERVED, O_DoDB, /* DA-6 */
  1074. dszRESERVED, O_DoDB }, /* DA-7 */
  1075. /* 06 03 x87-DB-1 */
  1076. { dszFILD, O_dModrm, /* DB-0 FILD */
  1077. dszRESERVED, O_DoDB, /* DB-1 */
  1078. dszFIST, O_dModrm, /* DB-2 FIST */
  1079. dszFISTP, O_dModrm, /* DB-3 FISTP */
  1080. dszRESERVED, O_DoDB, /* DB-4 */
  1081. dszFLD, O_tModrm, /* DB-5 FLD */
  1082. dszRESERVED, O_DoDB, /* DB-6 */
  1083. dszFSTP, O_tModrm }, /* DB-7 FSTP */
  1084. /* 07 x87-DB-2 ttt=4 */
  1085. { dszFENI, O_NoOperands, /* DB-0 FENI */
  1086. dszFDISI, O_NoOperands, /* DB-1 FDISI */
  1087. dszFCLEX, O_NoOperands, /* DB-2 FCLEX */
  1088. dszFINIT, O_NoOperands, /* DB-3 FINIT */
  1089. dszFSETPM, O_DoDB, /* DB-4 FSETPM */
  1090. dszRESERVED, O_DoDB, /* DB-5 */
  1091. dszRESERVED, O_DoDB, /* DB-6 */
  1092. dszRESERVED, O_DoDB }, /* DB-7 */
  1093. /* 08 04 x87-DC-1 */
  1094. { dszFADD, O_qModrm, /* DC-0 FADD */
  1095. dszFMUL, O_qModrm, /* DC-1 FMUL */
  1096. dszFCOM, O_qModrm, /* DC-2 FCOM */
  1097. dszFCOMP, O_qModrm, /* DC-3 FCOMP */
  1098. dszFSUB, O_qModrm, /* DC-4 FSUB */
  1099. dszFSUBR, O_qModrm, /* DC-5 FSUBR */
  1100. dszFDIV, O_qModrm, /* DC-6 FDIV */
  1101. dszFDIVR, O_qModrm }, /* DC-7 FDIVR */
  1102. /* 09 x87-DC-2 */
  1103. { dszFADD, O_iST_ST, /* DC-0 FADD */
  1104. dszFMUL, O_iST_ST, /* DC-1 FMUL */
  1105. dszFCOM, O_iST, /* DC-2 FCOM */
  1106. dszFCOMP, O_iST, /* DC-3 FCOMP */
  1107. dszFSUB, O_iST_ST, /* DC-4 FSUB */
  1108. dszFSUBR, O_iST_ST, /* DC-5 FSUBR */
  1109. dszFDIV, O_iST_ST, /* DC-6 FDIVR */
  1110. dszFDIVR, O_iST_ST }, /* DC-7 FDIV */
  1111. /* 10 05 x87-DD-1 */
  1112. { dszFLD, O_qModrm, /* DD-0 FLD */
  1113. dszRESERVED, O_DoDB, /* DD-1 */
  1114. dszFST, O_qModrm, /* DD-2 FST */
  1115. dszFSTP, O_qModrm, /* DD-3 FSTP */
  1116. dszFRSTOR, O_Modrm, /* DD-4 FRSTOR */
  1117. dszRESERVED, O_DoDB, /* DD-5 */
  1118. dszFSAVE, O_Modrm, /* DD-6 FSAVE */
  1119. dszFSTSW, O_Modrm }, /* DD-7 FSTSW */
  1120. /* 11 x87-DD-2 */
  1121. { dszFFREE, O_iST, /* DD-0 FFREE */
  1122. dszFXCH, O_iST, /* DD-1 FXCH */
  1123. dszFST, O_iST, /* DD-2 FST */
  1124. dszFSTP, O_iST, /* DD-3 FSTP */
  1125. dszFUCOM, O_iST, /* DD-4 FUCOM */
  1126. dszFUCOMP, O_iST, /* DD-5 FUCOMP */
  1127. dszRESERVED, O_DoDB, /* DD-6 */
  1128. dszRESERVED, O_DoDB }, /* DD-7 */
  1129. /* 12 06 x87-DE-1 */
  1130. { dszFIADD, O_wModrm, /* DE-0 FIADD */
  1131. dszFIMUL, O_wModrm, /* DE-1 FIMUL */
  1132. dszFICOM, O_wModrm, /* DE-2 FICOM */
  1133. dszFICOMP, O_wModrm, /* DE-3 FICOMP */
  1134. dszFISUB, O_wModrm, /* DE-4 FISUB */
  1135. dszFISUBR, O_wModrm, /* DE-5 FISUBR */
  1136. dszFIDIV, O_wModrm, /* DE-6 FIDIV */
  1137. dszFIDIVR, O_wModrm }, /* DE-7 FIDIVR */
  1138. /* 13 x87-DE-2 */
  1139. { dszFADDP, O_iST_ST, /* DE-0 FADDP */
  1140. dszFMULP, O_iST_ST, /* DE-1 FMULP */
  1141. dszFCOMP, O_iST, /* DE-2 FCOMP */
  1142. dszFCOMPP, O_NoOperands, /* DE-3 FCOMPP */
  1143. dszFSUBP, O_iST_ST, /* DE-4 FSUBP */
  1144. dszFSUBRP, O_iST_ST, /* DE-5 FSUBRP */
  1145. dszFDIVP, O_iST_ST, /* DE-6 FDIVP */
  1146. dszFDIVRP, O_iST_ST }, /* DE-7 FDIVRP */
  1147. /* 14 07 x87-DF-1 */
  1148. { dszFILD, O_wModrm, /* DF-0 FILD */
  1149. dszRESERVED, O_DoDB, /* DF-1 */
  1150. dszFIST, O_wModrm, /* DF-2 FIST */
  1151. dszFISTP, O_wModrm, /* DF-3 FISTP */
  1152. dszFBLD, O_tModrm, /* DF-4 FBLD */
  1153. dszFILD, O_qModrm, /* DF-5 FILD */
  1154. dszFBSTP, O_tModrm, /* DF-6 FBSTP */
  1155. dszFISTP, O_qModrm }, /* DF-7 FISTP */
  1156. /* 15 x87-DF-2 */
  1157. { dszFFREE, O_iST, /* DF-0 FFREE */
  1158. dszFXCH, O_iST, /* DF-1 FXCH */
  1159. dszFST, O_iST, /* DF-2 FST */
  1160. dszFSTP, O_iST, /* DF-3 FSTP */
  1161. dszFSTSW, O_NoOperands, /* DF-4 FSTSW */
  1162. dszFUCOMIP, O_ST_iST, /* DF-5 FUCOMIP */
  1163. dszFCOMIP, O_ST_iST, /* DF-6 FCOMIP */
  1164. dszRESERVED, O_DoDB }, /* DF-7 */
  1165. /* 16 01 x87-D9 Mod=3 TTT=4 */
  1166. { dszFCHS, O_NoOperands, /* D9-0 FCHS */
  1167. dszFABS, O_NoOperands, /* D9-1 FABS */
  1168. dszRESERVED, O_DoDB, /* D9-2 */
  1169. dszRESERVED, O_DoDB, /* D9-3 */
  1170. dszFTST, O_NoOperands, /* D9-4 FTST */
  1171. dszFXAM, O_NoOperands, /* D9-5 FXAM */
  1172. dszRESERVED, O_DoDB, /* D9-6 */
  1173. dszRESERVED, O_DoDB }, /* D9-7 */
  1174. /* 17 01 x87-D9 Mod=3 TTT=5 */
  1175. { dszFLD1, O_NoOperands, /* D9-0 FLD1 */
  1176. dszFLDL2T, O_NoOperands, /* D9-1 FLDL2T */
  1177. dszFLDL2E, O_NoOperands, /* D9-2 FLDL2E */
  1178. dszFLDPI, O_NoOperands, /* D9-3 FLDPI */
  1179. dszFLDLG2, O_NoOperands, /* D9-4 FLDLG2 */
  1180. dszFLDLN2, O_NoOperands, /* D9-5 FLDLN2 */
  1181. dszFLDZ, O_NoOperands, /* D9-6 FLDZ */
  1182. dszRESERVED, O_DoDB }, /* D9-7 */
  1183. /* 18 01 x87-D9 Mod=3 TTT=6 */
  1184. { dszF2XM1, O_NoOperands, /* D9-0 F2XM1 */
  1185. dszFYL2X, O_NoOperands, /* D9-1 FYL2X */
  1186. dszFPTAN, O_NoOperands, /* D9-2 FPTAN */
  1187. dszFPATAN, O_NoOperands, /* D9-3 FPATAN */
  1188. dszFXTRACT, O_NoOperands, /* D9-4 FXTRACT */
  1189. dszFPREM1, O_NoOperands, /* D9-5 FPREM1 */
  1190. dszFDECSTP, O_NoOperands, /* D9-6 FDECSTP */
  1191. dszFINCSTP, O_NoOperands }, /* D9-7 FINCSTP */
  1192. /* 19 01 x87-D9 Mod=3 TTT=7 */
  1193. { dszFPREM, O_NoOperands, /* D9-0 FPREM */
  1194. dszFYL2XP1, O_NoOperands, /* D9-1 FYL2XP1 */
  1195. dszFSQRT, O_NoOperands, /* D9-2 FSQRT */
  1196. dszFSINCOS, O_NoOperands, /* D9-3 FSINCOS */
  1197. dszFRNDINT, O_NoOperands, /* D9-4 FRNDINT */
  1198. dszFSCALE, O_NoOperands, /* D9-5 FSCALE */
  1199. dszFSIN, O_NoOperands, /* D9-6 FSIN */
  1200. dszFCOS, O_NoOperands }, /* D9-7 FCOS */
  1201. /* 20 group 3 */
  1202. { dszTEST, O_bModrm_Ib, /* F6-0 TEST */
  1203. dszRESERVED, O_DoDB, /* F6-1 */
  1204. dszNOT, O_bModrm, /* F6-2 NOT */
  1205. dszNEG, O_bModrm, /* F6-3 NEG */
  1206. dszMUL, O_bModrm, /* F6-4 MUL */
  1207. dszIMUL, O_bModrm, /* F6-5 IMUL */
  1208. dszDIV, O_bModrm, /* F6-6 DIV */
  1209. dszIDIV, O_bModrm }, /* F6-7 IDIV */
  1210. /* 21 group 3 */
  1211. { dszTEST, O_vModrm_Iv, /* F7-0 TEST */
  1212. dszRESERVED, O_DoDB, /* F7-1 */
  1213. dszNOT, O_vModrm, /* F7-2 NOT */
  1214. dszNEG, O_vModrm, /* F7-3 NEG */
  1215. dszMUL, O_vModrm, /* F7-4 MUL */
  1216. dszIMUL, O_vModrm, /* F7-5 IMUL */
  1217. dszDIV, O_vModrm, /* F7-6 DIV */
  1218. dszIDIV, O_vModrm }, /* F7-7 IDIV */
  1219. /* 22 group 5 */
  1220. { dszINC, O_vModrm, /* FF-0 INC */
  1221. dszDEC, O_vModrm, /* FF-1 DEC */
  1222. dszCALL, O_vModrm, /* FF-2 CALL */
  1223. dszCALL, O_fModrm, /* FF-3 CALL */
  1224. dszJMP, O_vModrm, /* FF-4 JMP */
  1225. dszJMP, O_fModrm, /* FF-5 JMP */
  1226. dszPUSH, O_vModrm, /* FF-6 PUSH */
  1227. dszRESERVED, O_DoDB }, /* FF-7 */
  1228. /* 23 group 7 */
  1229. { dszSGDT, O_Modrm, /* 0F-0 SGDT */
  1230. dszSIDT, O_Modrm, /* 0F-1 SIDT */
  1231. dszLGDT, O_Modrm, /* 0F-2 LGDT */
  1232. dszLIDT, O_Modrm, /* 0F-3 LIDT */
  1233. dszSMSW, O_wModrm, /* 0F-4 MSW */
  1234. dszRESERVED, O_DoDB, /* 0F-5 */
  1235. dszLMSW, O_wModrm, /* 0F-6 LMSW */
  1236. dszINVLPG, O_Modrm }, /* 0F-7 INVLPG */
  1237. /* 24 x87-DB Mod=3 TTT != 4 */
  1238. { dszFCMOVNB, O_ST_iST, /* DB-0 FCMOVNB */
  1239. dszFCMOVNE, O_ST_iST, /* DB-1 FCMOVNE */
  1240. dszFCMOVNBE, O_ST_iST, /* DB-2 FCMOVNBE */
  1241. dszFCMOVNU, O_ST_iST, /* DB-3 FCMOVNU */
  1242. dszRESERVED, O_DoDB, /* DB-4 */
  1243. dszFUCOMI, O_ST_iST, /* DB-5 FUCOMI */
  1244. dszFCOMI, O_ST_iST, /* DB-6 FCOMI */
  1245. dszRESERVED, O_DoDB } /* DB-7 */
  1246. };