i386.pas 90 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893
  1. {
  2. $Id$
  3. Copyright (c) 1995-98 by Florian Klaempfl
  4. This unit implements an types and classes specific for the i386+
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program; if not, write to the Free Software
  15. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16. ****************************************************************************
  17. }
  18. unit i386;
  19. interface
  20. { We Don't need the intel style opcodes if we don't have a intel
  21. reader or generator (PFV) }
  22. {$ifdef NORA386INT}
  23. {$ifdef NOAG386NSM}
  24. {$ifdef NOAG386INT}
  25. {$define NOINTOP}
  26. {$endif}
  27. {$endif}
  28. {$endif}
  29. { We Don't need the it table if no assembler parser is selected }
  30. {$ifdef NORA386INT}
  31. {$ifdef NORA386ATT}
  32. {$define NOITTABLE}
  33. {$endif}
  34. {$endif}
  35. uses
  36. cobjects,aasm;
  37. const
  38. extended_size = 10;
  39. type
  40. tasmop = (
  41. A_MOV,A_MOVZX,A_MOVSX,A_LABEL,A_ADD,
  42. A_CALL,A_IDIV,A_IMUL,A_JMP,A_LEA,A_MUL,A_NEG,A_NOT,
  43. A_POP,A_POPAD,A_PUSH,A_PUSHAD,A_RET,A_SUB,A_XCHG,A_XOR,
  44. A_FILD,A_CMP,A_JZ,A_INC,A_DEC,A_SETE,A_SETNE,A_SETL,
  45. A_SETG,A_SETLE,A_SETGE,A_JE,A_JNE,A_JL,A_JG,A_JLE,A_JGE,
  46. A_OR,A_FLD,A_FADD,A_FMUL,A_FSUB,A_FDIV,A_FCHS,A_FLD1,
  47. A_FIDIV,A_JNZ,A_FSTP,A_AND,A_JNO,A_NOTH,A_NONE,
  48. A_ENTER,A_LEAVE,A_CLD,A_MOVS,A_REP,A_SHL,A_SHR,A_BOUND,
  49. A_JNS,A_JS,A_JO,A_SAR,A_TEST,
  50. A_FCOM,A_FCOMP,A_FCOMPP,A_FXCH,A_FADDP,A_FMULP,A_FSUBP,A_FDIVP,
  51. A_FNSTS,A_SAHF,A_FDIVRP,A_FSUBRP,A_SETC,A_SETNC,A_JC,A_JNC,
  52. A_JA,A_JAE,A_JB,A_JBE,A_SETA,A_SETAE,A_SETB,A_SETBE,
  53. A_AAA,A_AAD,A_AAM,A_AAS,A_CBW,A_CDQ,A_CLC,A_CLI,
  54. A_CLTS,A_CMC,A_CWD,A_CWDE,A_DAA,A_DAS,A_HLT,A_IRET,A_LAHF,
  55. A_LODS,A_LOCK,A_NOP,A_PUSHA,A_PUSHF,A_PUSHFD,
  56. A_STC,A_STD,A_STI,A_STOS,A_WAIT,A_XLAT,A_XLATB,A_MOVSB,
  57. A_MOVSBL,A_MOVSBW,A_MOVSWL,A_MOVZB,A_MOVZWL,A_POPA,A_IN,
  58. A_OUT,A_LDS,A_LCS,A_LES,A_LFS,A_LGS,A_LSS,A_POPF,A_SBB,A_ADC,
  59. A_DIV,A_ROR,A_ROL,A_RCL,A_RCR,A_SAL,A_SHLD,A_SHRD,
  60. A_LCALL,A_LJMP,A_LRET,A_JNAE,A_JNB,A_JNA,A_JNBE,A_JP,A_JNP,
  61. A_JPE,A_JPO,A_JNGE,A_JNG,A_JNL,A_JNLE,A_JCXZ,A_JECXZ,
  62. A_LOOP,A_CMPS,A_INS,A_OUTS,A_SCAS,A_BSF,A_BSR,A_BT,A_BTC,A_BTR,A_BTS,A_INT,
  63. A_INT3,A_INTO,A_BOUNDL,A_BOUNDW,
  64. A_LOOPZ,A_LOOPE,A_LOOPNZ,A_LOOPNE,A_SETO,A_SETNO,A_SETNAE,A_SETNB,
  65. A_SETZ,A_SETNZ,A_SETNA,A_SETNBE,A_SETS,A_SETNS,A_SETP,A_SETPE,A_SETNP,
  66. A_SETPO,A_SETNGE,A_SETNL,A_SETNG,A_SETNLE,A_ARPL,A_LAR,A_LGDT,A_LIDT,
  67. A_LLDT,A_LMSW,A_LSL,A_LTR,A_SGDT,A_SIDT,A_SLDT,A_SMSW,A_STR,A_VERR,A_VERW,
  68. A_FABS,A_FBLD,A_FBSTP,A_FCLEX,A_FNCLEX,
  69. A_FCOS,A_FDECSTP,A_FDISI,A_FNDISI,
  70. A_FDIVR,A_FENI,A_FNENI,A_FFREE,A_FIADD,A_FICOM,A_FICOMP,
  71. A_FIDIVR,A_FIMUL,A_FINCSTP,A_FINIT,A_FNINIT,A_FIST,A_FISTP,A_FISUB,
  72. A_FISUBR,A_FLDCW,A_FLDENV,A_FLDLG2,A_FLDLN2,A_FLDL2E,
  73. A_FLDL2T,A_FLDPI,A_FLDS,A_FLDZ,A_FNOP,A_FPATAN,
  74. A_FPREM,A_FPREM1,A_FPTAN,A_FRNDINT,A_FRSTOR,A_FSAVE,A_FNSAVE,
  75. A_FSCALE,A_FSETPM,A_FSIN,A_FSINCOS,A_FSQRT,A_FST,A_FSTCW,A_FNSTCW,
  76. A_FSTENV,A_FNSTENV,A_FSTSW,A_FNSTSW,A_FTST,A_FUCOM,A_FUCOMP,
  77. A_FUCOMPP,A_FWAIT,A_FXAM,A_FXTRACT,A_FYL2X,A_FYL2XP1,A_F2XM1,
  78. A_FILDQ,A_FILDS,A_FILDL,A_FLDL,A_FLDT,A_FISTQ,A_FISTS,A_FISTL,A_FSTL,A_FSTS,
  79. A_FSTPS,A_FISTPL,A_FSTPL,A_FISTPS,A_FISTPQ,A_FSTPT,
  80. A_FCOMPS,A_FICOMPL,A_FCOMPL,A_FICOMPS,
  81. A_FCOMS,A_FICOML,A_FCOML,A_FICOMS,A_FIADDL,A_FADDL,A_FIADDS,
  82. A_FISUBL,A_FSUBL,A_FISUBS,A_FSUBS,A_FSUBR,A_FSUBRS,A_FISUBRL,
  83. A_FSUBRL,A_FISUBRS,A_FMULS,A_FIMULL,A_FMULL,A_FIMULS,A_FDIVS,A_FIDIVL,
  84. A_FDIVL,A_FIDIVS,A_FDIVRS,A_FIDIVRL,A_FDIVRL,A_FIDIVRS,
  85. A_REPE,A_REPNE,A_CPUID,A_FADDS,A_POPFD,
  86. { MMX instructions: }
  87. A_EMMS,A_MOVD,A_MOVQ,A_PACKSSDW,A_PACKSSWB,A_PACKUSWB,
  88. A_PADDB,A_PADDD,A_PADDSB,A_PADDSW,A_PADDUSB,A_PADDUSW,
  89. A_PADDW,A_PAND,A_PANDN,A_PCMPEQB,A_PCMPEQD,A_PCMPEQW,
  90. A_PCMPGTB,A_PCMPGTD,A_PCMPGTW,A_PMADDWD,A_PMULHW,
  91. A_PMULLW,A_POR,A_PSLLD,A_PSLLQ,A_PSLLW,A_PSRAD,A_PSRAW,
  92. A_PSRLD,A_PSRLQ,A_PSRLW,A_PSUBB,A_PSUBD,A_PSUBSB,A_PSUBSW,
  93. A_PSUBUSB,A_PSUBUSW,A_PSUBW,A_PUNPCKHBW,A_PUNPCKHDQ,
  94. A_PUNPCKHWD,A_PUNPCKLBW,A_PUNPCKLDQ,A_PUNPCKLWD,A_PXOR);
  95. const
  96. firstop = A_MOV;
  97. lastop = A_PXOR;
  98. type
  99. { enumeration for registers, don't change this }
  100. { it's used by the register size converstaions }
  101. tregister = (
  102. R_NO,R_EAX,R_ECX,R_EDX,R_EBX,R_ESP,R_EBP,R_ESI,R_EDI,
  103. R_AX,R_CX,R_DX,R_BX,R_SP,R_BP,R_SI,R_DI,
  104. R_AL,R_CL,R_DL,R_BL,R_AH,R_CH,R_BH,R_DH,
  105. { for an easier assembler generation }
  106. R_DEFAULT_SEG,R_CS,R_DS,R_ES,R_FS,R_GS,R_SS,
  107. R_ST,R_ST0,R_ST1,R_ST2,R_ST3,R_ST4,R_ST5,R_ST6,R_ST7,
  108. R_MM0,R_MM1,R_MM2,R_MM3,R_MM4,R_MM5,R_MM6,R_MM7);
  109. { S_NO = No Size of operand }
  110. { S_B = Byte size operand }
  111. { S_W = Word size operand }
  112. { S_L = DWord size operand }
  113. { USED FOR conversions in x86}
  114. { S_BW = Byte to word }
  115. { S_BL = Byte to long }
  116. { S_WL = Word to long }
  117. { Floating point types }
  118. { S_FX = Extended type }
  119. { S_FL = double/64bit integer }
  120. { S_FS = single type (32 bit) }
  121. { S_IQ = integer on 64 bits }
  122. { S_IL = integer on 32 bits }
  123. { S_IS = integer on 16 bits }
  124. { S_D = integer on bits for MMX }
  125. topsize = (S_NO,S_B,S_W,S_L,S_BW,S_BL,S_WL,
  126. S_IS,S_IL,S_IQ,S_FS,S_FL,S_FX,S_D);
  127. { S_FS and S_FL added
  128. S_X renamed to S_FX
  129. S_IL added
  130. S_S and S_Q renamed to S_IQ and S_IS
  131. S_F? means a real load or store or read
  132. added to distinguish between longint l suffix like 'movl'
  133. and double l suffix 'fldl'
  134. distinction needed for intel output !! }
  135. plocation = ^tlocation;
  136. { information about the location of an operand }
  137. { LOC_FPUSTACK FPU stack }
  138. { LOC_REGISTER in a processor register }
  139. { LOC_MEM in the memory }
  140. { LOC_REFERENCE like LOC_MEM, but lvalue }
  141. { LOC_JUMP nur bool'sche Resultate, Sprung zu false- oder }
  142. { truelabel }
  143. { LOC_FLAGS nur bool'sche Rsultate, Flags sind gesetzt }
  144. { LOC_CREGISTER register which shouldn't be modified }
  145. { LOC_INVALID added for tracking problems}
  146. tloc = (LOC_INVALID,LOC_FPU,LOC_REGISTER,LOC_MEM,LOC_REFERENCE,LOC_JUMP,
  147. LOC_FLAGS,LOC_CREGISTER,LOC_MMXREGISTER,LOC_CMMXREGISTER);
  148. tresflags = (F_E,F_NE,F_G,F_L,F_GE,F_LE,F_C,F_NC,
  149. F_A,F_AE,F_B,F_BE);
  150. preference = ^treference;
  151. treference = record
  152. base,segment,index : tregister;
  153. offset : longint;
  154. symbol : pstring;
  155. { a constant is also a treference, this makes the code generator }
  156. { easier }
  157. isintvalue : boolean;
  158. scalefactor : byte;
  159. end;
  160. tlocation = record
  161. case loc : tloc of
  162. LOC_MEM,LOC_REFERENCE : (reference : treference);
  163. LOC_FPU : ();
  164. LOC_JUMP : ();
  165. LOC_FLAGS : (resflags : tresflags);
  166. LOC_INVALID : ();
  167. { it's only for better handling }
  168. LOC_MMXREGISTER : (mmxreg : tregister);
  169. { segment in reference at the same place as in loc_register }
  170. LOC_REGISTER,LOC_CREGISTER : (
  171. case longint of
  172. 1 : (register,segment,registerhigh : tregister);
  173. { overlay a registerlow }
  174. 2 : (registerlow : tregister);
  175. );
  176. end;
  177. pcsymbol = ^tcsymbol;
  178. tcsymbol = record
  179. symbol : pchar;
  180. offset : longint;
  181. end;
  182. const
  183. { arrays for boolean location conversions }
  184. flag_2_jmp : array[F_E..F_BE] of tasmop =
  185. (A_JE,A_JNE,A_JG,A_JL,A_JGE,A_JLE,A_JC,A_JNC,
  186. A_JA,A_JAE,A_JB,A_JBE);
  187. flag_2_set : array[F_E..F_BE] of tasmop = { v-- the GAS didn't know setc }
  188. (A_SETE,A_SETNE,A_SETG,A_SETL,A_SETGE,A_SETLE,A_SETB,A_SETAE,
  189. A_SETA,A_SETAE,A_SETB,A_SETBE);
  190. { operand types }
  191. top_none = 0;
  192. top_reg = 1;
  193. top_ref = 2;
  194. { a constant can be also written as treference }
  195. top_const = 3;
  196. { this is for calls }
  197. top_symbol = 4;
  198. stack_pointer = R_ESP;
  199. frame_pointer = R_EBP;
  200. {This constant is an alias for the accumulator, as it's name may
  201. differ from processor to processor.}
  202. accumulator = R_EAX;
  203. firstregister = R_EAX;
  204. lastregister = R_MM7;
  205. general_registers = [R_EAX,R_EBX,R_ECX,R_EDX];
  206. registers_saved_on_cdecl = [R_ESI,R_EDI,R_EBX];
  207. type
  208. pai_labeled = ^tai_labeled;
  209. tai_labeled = object(tai)
  210. _operator : tasmop;
  211. lab : plabel;
  212. constructor init(op : tasmop; l : plabel);
  213. destructor done;virtual;
  214. end;
  215. pairegalloc = ^tairegalloc;
  216. tairegalloc = object(tai)
  217. reg : tregister;
  218. constructor init(r : tregister);
  219. end;
  220. pairegdealloc = ^tairegdealloc;
  221. tairegdealloc = object(tai)
  222. reg : tregister;
  223. constructor init(r : tregister);
  224. end;
  225. pai386 = ^tai386;
  226. tai386 = object(tai)
  227. { this isn't a proper style, but not very memory expensive }
  228. op1,op2: pointer;
  229. _operator : tasmop;
  230. opxt:word;
  231. size:topsize;
  232. constructor op_none(op : tasmop;_size : topsize);
  233. constructor op_reg(op : tasmop;_size : topsize;_op1 : tregister);
  234. constructor op_const(op : tasmop;_size : topsize;_op1 : longint);
  235. constructor op_ref(op : tasmop;_size : topsize;_op1 : preference);
  236. constructor op_loc(op : tasmop;_size : topsize;_op1 : tlocation);
  237. constructor op_reg_reg(op : tasmop;_size : topsize;_op1,_op2 : tregister);
  238. constructor op_reg_reg_reg(op : tasmop;_size : topsize;_op1,_op2,_op3 : tregister);
  239. constructor op_reg_ref(op : tasmop;_size : topsize;_op1 : tregister;_op2 : preference);
  240. constructor op_reg_loc(op : tasmop;_size : topsize;_op1 : tregister;_op2 : tlocation);
  241. constructor op_loc_reg(op : tasmop;_size : topsize;_op1 : tlocation;_op2 : tregister);
  242. constructor op_const_reg(op : tasmop;_size : topsize;_op1 : longint;_op2 : tregister);
  243. { this combination is needed by ENTER }
  244. constructor op_const_const(op : tasmop;_size : topsize;_op1,_op2 : longint);
  245. constructor op_const_ref(op : tasmop;_size : topsize;_op1 : longint;_op2 : preference);
  246. constructor op_const_loc(op : tasmop;_size : topsize;_op1 : longint;_op2 : tlocation);
  247. constructor op_ref_reg(op : tasmop;_size : topsize;_op1 : preference;_op2 : tregister);
  248. { this is only allowed if _op1 is an int value (_op1^.isintvalue=true) }
  249. constructor op_ref_ref(op : tasmop;_size : topsize;_op1,_op2 : preference);
  250. {
  251. constructor op_ref_loc(op : tasmop;_size : topsize;_op1 : preference;_op2 : tlcation);}
  252. constructor op_const_reg_reg(op : tasmop;_size : topsize;_op1 : longint;_op2 : tregister;_op3 : tregister);
  253. { this is for CALL etc. }
  254. { symbol is replaced by the address of symbol }
  255. { so op_csymbol(A_PUSH,S_L,strnew('P')); generates }
  256. { an instruction which pushes the address of P }
  257. { to the stack }
  258. constructor op_csymbol(op : tasmop;_size : topsize;_op1 : pcsymbol);
  259. constructor op_csymbol_reg(op : tasmop;_size : topsize;_op1 : pcsymbol;_op2 : tregister);
  260. constructor op_csymbol_ref(op : tasmop;_size : topsize;_op1 : pcsymbol;_op2 : preference);
  261. constructor op_csymbol_loc(op : tasmop;_size : topsize;_op1 : pcsymbol;_op2 : tlocation);
  262. { OUT immediate8 }
  263. constructor op_reg_const(op:tasmop; _size: topsize; _op1: tregister; _op2: longint);
  264. function op1t:byte;
  265. function op2t:byte;
  266. function op3t:byte;
  267. destructor done;virtual;
  268. end;
  269. const
  270. maxvarregs = 4;
  271. varregs : array[1..maxvarregs] of tregister =
  272. (R_EBX,R_EDX,R_ECX,R_EAX);
  273. { the following functions allow to convert registers }
  274. { for example reg8toreg32(R_AL) returns R_EAX }
  275. { for example reg16toreg32(R_AL) gives an undefined }
  276. { result }
  277. { these functions expects that the turn of }
  278. { tregister isn't changed }
  279. function reg8toreg16(reg : tregister) : tregister;
  280. function reg8toreg32(reg : tregister) : tregister;
  281. function reg16toreg8(reg : tregister) : tregister;
  282. function reg32toreg8(reg : tregister) : tregister;
  283. function reg32toreg16(reg : tregister) : tregister;
  284. function reg16toreg32(reg : tregister) : tregister;
  285. { resets all values of ref to defaults }
  286. procedure reset_reference(var ref : treference);
  287. { set mostly used values of a new reference }
  288. function new_reference(base : tregister;offset : longint) : preference;
  289. { same as reset_reference, but symbol is disposed }
  290. { use this only for already used references }
  291. procedure clear_reference(var ref : treference);
  292. function newreference(const r : treference) : preference;
  293. procedure disposereference(var r : preference);
  294. function reg2str(r : tregister) : string;
  295. { generates an help record for constants }
  296. function newcsymbol(const s : string;l : longint) : pcsymbol;
  297. const
  298. ao_unknown = $0;
  299. { 8 bit reg }
  300. ao_reg8 = $1;
  301. { 16 bit reg }
  302. ao_reg16 = $2;
  303. { 32 bit reg }
  304. ao_reg32 = $4;
  305. ao_reg = (ao_reg8 or ao_reg16 or ao_reg32);
  306. { for push/pop operands }
  307. ao_wordreg = (ao_reg16 or ao_reg32);
  308. ao_imm8 = $8; { 8 bit immediate }
  309. ao_imm8S = $10; { 8 bit immediate sign extended }
  310. ao_imm16 = $20; { 16 bit immediate }
  311. ao_imm32 = $40; { 32 bit immediate }
  312. ao_imm1 = $80; { 1 bit immediate }
  313. { for unknown expressions }
  314. ao_immunknown = ao_imm32;
  315. { gen'l immediate }
  316. ao_imm = (ao_imm8 or ao_imm8S or ao_imm16 or ao_imm32);
  317. ao_disp8 = $200; { 8 bit displacement (for jumps) }
  318. ao_disp16 = $400; { 16 bit displacement }
  319. ao_disp32 = $800; { 32 bit displacement }
  320. { general displacement }
  321. ao_disp = (ao_disp8 or ao_disp16 or ao_disp32);
  322. { for unknown size displacements }
  323. ao_dispunknown = ao_disp32;
  324. ao_mem8 = $1000;
  325. ao_mem16 = $2000;
  326. ao_mem32 = $4000;
  327. ao_baseindex = $8000;
  328. { general mem }
  329. ao_mem = (ao_disp or ao_mem8 or ao_mem16 or ao_mem32 or ao_baseindex);
  330. ao_wordmem = (ao_mem16 or ao_mem32 or ao_disp or ao_baseindex);
  331. ao_bytemem = (ao_mem8 or ao_disp or ao_baseindex);
  332. { register to hold in/out port addr = dx }
  333. ao_inoutportreg = $10000;
  334. { register to hold shift cound = cl }
  335. ao_shiftcount = $20000;
  336. ao_control = $40000; { Control register }
  337. ao_debug = $80000; { Debug register }
  338. ao_test = $100000; { Test register }
  339. { suggestion from PM }
  340. { st0 is also a float reg }
  341. {ao_floatreg = $200000; }{ Float register }
  342. ao_otherfloatreg = $200000; { Float register different from st0 }
  343. ao_floatacc = $400000; { Float stack top %st(0) }
  344. ao_floatreg = ao_otherfloatreg or ao_floatacc; { all float regs }
  345. { Florian correct this if it is wrong
  346. but it seems necessary for ratti386 to accept the code
  347. in i386/math.inc !! }
  348. { 2 bit segment register }
  349. ao_sreg2 = $800000;
  350. { 3 bit segment register }
  351. ao_sreg3 = $1000000;
  352. { Accumulat or %al or %ax or %eax }
  353. ao_acc = $2000000;
  354. ao_implicitregister = (ao_inoutportreg or ao_shiftcount or ao_acc or ao_floatacc);
  355. ao_jumpabsolute = $4000000;
  356. ao_abs8 = $08000000;
  357. ao_abs16 = $10000000;
  358. ao_abs32 = $20000000;
  359. ao_abs = (ao_abs8 or ao_abs16 or ao_abs32);
  360. ao_none = $ff;
  361. { this is for the code generator }
  362. { set if operands are words or dwords }
  363. af_w = $1;
  364. { D = 0 if Reg --> Regmem; D = 1 if Regmem --> Reg }
  365. af_d = $2;
  366. { direction flag for floating insns: MUST BE = $400 }
  367. af_floatd = $400;
  368. { shorthand }
  369. af_dw = (af_d or af_w);
  370. { register is in low 3 bits of opcode }
  371. shortform = $10;
  372. { shortform and w-bit is=$8 }
  373. Shortformw = $20;
  374. seg2shortform = $40; { encoding of load segment reg insns }
  375. seg3shortform = $80; { fs/gs segment register insns. }
  376. jump = $100; { special case for jump insns. }
  377. jumpintersegment = $200; { special case for intersegment leaps/calls }
  378. dont_use = $400;
  379. noModrm = $800;
  380. modrm = $1000;
  381. imulkludge = $2000;
  382. Jumpbyte = $4000;
  383. Jumpdword = $8000;
  384. af_ReverseRegRegmem = $10000;
  385. type
  386. ttemplate = packed record
  387. i : tasmop;
  388. ops : byte;
  389. oc : longint;
  390. eb : byte;
  391. m : longint;
  392. o1,o2,o3 : longint;
  393. end;
  394. const
  395. last_instruction_in_cache = A_EMMS;
  396. type
  397. tins_cache = array[A_MOV..last_instruction_in_cache] of longint;
  398. var
  399. ins_cache : tins_cache;
  400. {$ifndef NOITTABLE}
  401. const
  402. it : array[0..442] of ttemplate = (
  403. (i : A_MOV;ops : 2;oc : $a0;eb : ao_none;m : af_dw or NoModrm;o1 : ao_disp32;o2 : ao_acc;o3 : 0 ),
  404. (i : A_MOV;ops : 2;oc : $88;eb : ao_none;m : af_dw or Modrm;o1 : ao_reg;o2 : ao_reg or ao_mem;o3 : 0 ),
  405. (i : A_MOV;ops : 2;oc : $b0;eb : ao_none;m : ShortFormW;o1 : ao_imm;o2 : ao_reg;o3 : 0 ),
  406. (i : A_MOV;ops : 2;oc : $c6;eb : ao_none;m : af_w or Modrm;o1 : ao_imm;o2 : ao_reg or ao_mem;o3 : 0 ),
  407. (i : A_MOV;ops : 2;oc : $8c;eb : ao_none;m : af_d or Modrm;o1 : ao_sreg3 or ao_sreg2;o2 : ao_reg16 or
  408. ao_mem16;o3 : 0 ),
  409. (i : A_MOV;ops : 2;oc : $0f20;eb : ao_none;m : af_d or Modrm;o1 : ao_control;o2 : ao_reg32;o3 : 0),
  410. (i : A_MOV;ops : 2;oc : $0f21;eb : ao_none;m : af_d or Modrm;o1 : ao_debug;o2 : ao_reg32;o3 : 0),
  411. (i : A_MOV;ops : 2;oc : $0f24;eb : ao_none;m : af_d or Modrm;o1 : ao_test;o2 : ao_reg32;o3 : 0),
  412. (i : A_MOVSB;ops : 2;oc : $0fbe;eb : ao_none;m : af_reverseregregmem or Modrm;o1 : ao_reg8 or ao_mem;o2 : ao_reg16
  413. or ao_reg32;o3 : 0),
  414. (i : A_MOVSBL;ops : 2;oc : $0fbe;eb : ao_none;m : af_reverseregregmem or Modrm;o1 : ao_reg8 or ao_mem;
  415. o2 : ao_reg32;o3 : 0),
  416. (i : A_MOVSBW;ops : 2;oc : $660fbe;eb : ao_none;m : af_reverseregregmem or Modrm;o1 : ao_reg8 or ao_mem;
  417. o2 : ao_reg16;o3 : 0),
  418. (i : A_MOVSWL;ops : 2;oc : $0fbf;eb : ao_none;m : af_reverseregregmem or Modrm;o1 : ao_reg16 or ao_mem;
  419. o2 : ao_reg32;o3 : 0),
  420. (i : A_MOVZB;ops : 2;oc : $0fb6;eb : ao_none;m : af_reverseregregmem or Modrm;o1 : ao_reg8 or ao_mem;
  421. o2 : ao_reg16 or ao_reg32;o3 : 0),
  422. (i : A_MOVZWL;ops : 2;oc : $0fb7;eb : ao_none;m : af_reverseregregmem or Modrm;o1 : ao_reg16 or ao_mem;
  423. o2 : ao_reg32;o3 : 0),
  424. (i : A_PUSH;ops : 1;oc : $50;eb : ao_none;m : ShortForm;o1 : ao_wordreg;o2 : 0;o3 : 0 ),
  425. (i : A_PUSH;ops : 1;oc : $ff;eb : $6;m : Modrm;o1 : ao_wordreg or ao_wordMem;o2 : 0;o3 : 0 ),
  426. (i : A_PUSH;ops : 1;oc : $6a;eb : ao_none;m : NoModrm;o1 : ao_imm8S;o2 : 0;o3 : 0),
  427. (i : A_PUSH;ops : 1;oc : $68;eb : ao_none;m : NoModrm;o1 : ao_imm32 or ao_imm16;o2 : 0;o3 : 0),
  428. (i : A_PUSH;ops : 1;oc : $06;eb : ao_none;m : Seg2ShortForm;o1 : ao_sreg2;o2 : 0;o3 : 0 ),
  429. (i : A_PUSH;ops : 1;oc : $0fa0;eb : ao_none;m : Seg3ShortForm;o1 : ao_sreg3;o2 : 0;o3 : 0 ),
  430. (i : A_PUSHA;ops : 0;oc : $60;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0 ),
  431. (i : A_PUSHAD; ops: 0; oc: $6660;eb: ao_none;m: NoModRm;o1: 0;o2: 0;o3: 0 ),
  432. (i : A_POP;ops : 1;oc : $58;eb : ao_none;m : ShortForm;o1 : ao_wordreg;o2 : 0;o3 : 0 ),
  433. (i : A_POP;ops : 1;oc : $8f;eb : $0;m : Modrm;o1 : ao_wordreg or ao_wordmem;o2 : 0;o3 : 0 ),
  434. (i : A_POP;ops : 1;oc : $07;eb : ao_none;m : Seg2ShortForm;o1 : ao_sreg2;o2 : 0;o3 : 0 ),
  435. (i : A_POP;ops : 1;oc : $0fa1;eb : ao_none;m : Seg3ShortForm;o1 : ao_sreg3;o2 : 0;o3 : 0 ),
  436. (i : A_POPA;ops : 0;oc : $61;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0 ),
  437. (i : A_POPAD; ops: 0; oc: $6661;eb: ao_none;m : NoModRm;o1 : 0;o2 : 0;o3: 0),
  438. (i : A_XCHG;ops : 2;oc : $90;eb : ao_none;m : ShortForm;o1 : ao_wordreg;o2 : ao_acc;o3 : 0 ),
  439. (i : A_XCHG;ops : 2;oc : $90;eb : ao_none;m : ShortForm;o1 : ao_acc;o2 : ao_wordreg;o3 : 0 ),
  440. (i : A_XCHG;ops : 2;oc : $86;eb : ao_none;m : af_w or Modrm;o1 : ao_reg;o2 : ao_reg or ao_mem;o3 : 0 ),
  441. (i : A_XCHG;ops : 2;oc : $86;eb : ao_none;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : ao_reg;o3 : 0 ),
  442. (i : A_IN;ops : 2;oc : $e4;eb : ao_none;m : af_w or NoModrm;o1 : ao_imm8;o2 : ao_acc;o3 : 0 ),
  443. (i : A_IN;ops : 2;oc : $ec;eb : ao_none;m : af_w or NoModrm;o1 : ao_inoutportreg;o2 : ao_acc;o3 : 0 ),
  444. (i : A_OUT;ops : 2;oc : $e6;eb : ao_none;m : af_w or NoModrm;o1 : ao_acc;o2 : ao_imm8;o3 : 0 ),
  445. (i : A_OUT;ops : 2;oc : $ee;eb : ao_none;m : af_w or NoModrm;o1 : ao_acc;o2 : ao_inoutportreg;o3 : 0 ),
  446. (i : A_LEA;ops : 2;oc : $8d;eb : ao_none;m : Modrm;o1 : ao_wordmem or ao_jumpabsolute;o2 : ao_wordreg;o3 : 0 ),
  447. (i : A_LDS;ops : 2;oc : $c5;eb : ao_none;m : Modrm;o1 : ao_mem;o2 : ao_reg32;o3 : 0),
  448. (i : A_LES;ops : 2;oc : $c4;eb : ao_none;m : Modrm;o1 : ao_mem;o2 : ao_reg32;o3 : 0),
  449. (i : A_LFS;ops : 2;oc : $0fb4;eb : ao_none;m : Modrm;o1 : ao_mem;o2 : ao_reg32;o3 : 0),
  450. (i : A_LGS;ops : 2;oc : $0fb5;eb : ao_none;m : Modrm;o1 : ao_mem;o2 : ao_reg32;o3 : 0),
  451. (i : A_LSS;ops : 2;oc : $0fb2;eb : ao_none;m : Modrm;o1 : ao_mem;o2 : ao_reg32;o3 : 0),
  452. (i : A_CLC;ops : 0;oc : $f8;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  453. (i : A_CLD;ops : 0;oc : $fc;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  454. (i : A_CLI;ops : 0;oc : $fa;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  455. (i : A_CLTS;ops : 0;oc : $0f06;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  456. (i : A_CMC;ops : 0;oc : $f5;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  457. (i : A_LAHF;ops : 0;oc : $9f;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  458. (i : A_SAHF;ops : 0;oc : $9e;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  459. (i : A_PUSHF;ops : 0;oc : $9c;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  460. (i : A_PUSHFD; ops: 0; oc: $669c; eb: ao_none; m: NoModRm; o1: 0;o2: 0;o3: 0),
  461. (i : A_POPF;ops : 0;oc : $9d;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  462. (i : A_POPFD;ops: 0;oc: $669d;eb : ao_none;m : NoModRm;o1: 0;o2 : 0;o3 : 0),
  463. (i : A_STC;ops : 0;oc : $f9;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  464. (i : A_STD;ops : 0;oc : $fd;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  465. (i : A_STI;ops : 0;oc : $fb;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  466. (i : A_ADD;ops : 2;oc : $0;eb : ao_none;m : af_dw or Modrm;o1 : ao_reg;o2 : ao_reg or ao_mem;o3 : 0),
  467. (i : A_ADD;ops : 2;oc : $83;eb : 0;m : Modrm;o1 : ao_imm8s;o2 : ao_wordreg or ao_wordmem;o3 : 0),
  468. (i : A_ADD;ops : 2;oc : $4;eb : ao_none;m : af_w or NoModrm;o1 : ao_imm;o2 : ao_acc;o3 : 0),
  469. (i : A_ADD;ops : 2;oc : $80;eb : 0;m : af_w or Modrm;o1 : ao_imm;o2 : ao_reg or ao_mem;o3 : 0),
  470. (i : A_INC;ops : 1;oc : $40;eb : ao_none;m : ShortForm;o1 : ao_wordreg;o2 : 0;o3 : 0),
  471. (i : A_INC;ops : 1;oc : $fe;eb : 0;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : 0;o3 : 0),
  472. (i : A_SUB;ops : 2;oc : $28;eb : ao_none;m : af_dw or Modrm;o1 : ao_reg;o2 : ao_reg or ao_mem;o3 : 0),
  473. (i : A_SUB;ops : 2;oc : $83;eb : 5;m : Modrm;o1 : ao_imm8s;o2 : ao_wordreg or ao_wordmem;o3 : 0),
  474. (i : A_SUB;ops : 2;oc : $2c;eb : ao_none;m : af_w or NoModrm;o1 : ao_imm;o2 : ao_acc;o3 : 0),
  475. (i : A_SUB;ops : 2;oc : $80;eb : 5;m : af_w or Modrm;o1 : ao_imm;o2 : ao_reg or ao_mem;o3 : 0),
  476. (i : A_DEC;ops : 1;oc : $48;eb : ao_none;m : ShortForm;o1 : ao_wordreg;o2 : 0;o3 : 0),
  477. (i : A_DEC;ops : 1;oc : $fe;eb : 1;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : 0;o3 : 0),
  478. (i : A_SBB;ops : 2;oc : $18;eb : ao_none;m : af_dw or Modrm;o1 : ao_reg;o2 : ao_reg or ao_mem;o3 : 0),
  479. (i : A_SBB;ops : 2;oc : $83;eb : 3;m : Modrm;o1 : ao_imm8s;o2 : ao_wordreg or ao_wordmem;o3 : 0),
  480. (i : A_SBB;ops : 2;oc : $1c;eb : ao_none;m : af_w or NoModrm;o1 : ao_imm;o2 : ao_acc;o3 : 0),
  481. (i : A_SBB;ops : 2;oc : $80;eb : 3;m : af_w or Modrm;o1 : ao_imm;o2 : ao_reg or ao_mem;o3 : 0),
  482. (i : A_CMP;ops : 2;oc : $38;eb : ao_none;m : af_dw or Modrm;o1 : ao_reg;o2 : ao_reg or ao_mem;o3 : 0),
  483. (i : A_CMP;ops : 2;oc : $83;eb : 7;m : Modrm;o1 : ao_imm8s;o2 : ao_wordreg or ao_wordmem;o3 : 0),
  484. (i : A_CMP;ops : 2;oc : $3c;eb : ao_none;m : af_w or NoModrm;o1 : ao_imm;o2 : ao_acc;o3 : 0),
  485. (i : A_CMP;ops : 2;oc : $80;eb : 7;m : af_w or Modrm;o1 : ao_imm;o2 : ao_reg or ao_mem;o3 : 0),
  486. (i : A_TEST;ops : 2;oc : $84;eb : ao_none;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : ao_reg;o3 : 0),
  487. (i : A_TEST;ops : 2;oc : $84;eb : ao_none;m : af_w or Modrm;o1 : ao_reg;o2 : ao_reg or ao_mem;o3 : 0),
  488. (i : A_TEST;ops : 2;oc : $a8;eb : ao_none;m : af_w or NoModrm;o1 : ao_imm;o2 : ao_acc;o3 : 0),
  489. (i : A_TEST;ops : 2;oc : $f6;eb : 0;m : af_w or Modrm;o1 : ao_imm;o2 : ao_reg or ao_mem;o3 : 0),
  490. (i : A_AND;ops : 2;oc : $20;eb : ao_none;m : af_dw or Modrm;o1 : ao_reg;o2 : ao_reg or ao_mem;o3 : 0),
  491. (i : A_AND;ops : 2;oc : $83;eb : 4;m : Modrm;o1 : ao_imm8s;o2 : ao_wordreg or ao_wordmem;o3 : 0),
  492. (i : A_AND;ops : 2;oc : $24;eb : ao_none;m : af_w or NoModrm;o1 : ao_imm;o2 : ao_acc;o3 : 0),
  493. (i : A_AND;ops : 2;oc : $80;eb : 4;m : af_w or Modrm;o1 : ao_imm;o2 : ao_reg or ao_mem;o3 : 0),
  494. (i : A_OR;ops : 2;oc : $08;eb : ao_none;m : af_dw or Modrm;o1 : ao_reg;o2 : ao_reg or ao_mem;o3 : 0),
  495. (i : A_OR;ops : 2;oc : $83;eb : 1;m : Modrm;o1 : ao_imm8s;o2 : ao_wordreg or ao_wordmem;o3 : 0),
  496. (i : A_OR;ops : 2;oc : $0c;eb : ao_none;m : af_w or NoModrm;o1 : ao_imm;o2 : ao_acc;o3 : 0),
  497. (i : A_OR;ops : 2;oc : $80;eb : 1;m : af_w or Modrm;o1 : ao_imm;o2 : ao_reg or ao_mem;o3 : 0),
  498. (i : A_XOR;ops : 2;oc : $30;eb : ao_none;m : af_dw or Modrm;o1 : ao_reg;o2 : ao_reg or ao_mem;o3 : 0),
  499. (i : A_XOR;ops : 2;oc : $83;eb : 6;m : Modrm;o1 : ao_imm8s;o2 : ao_wordreg or ao_wordmem;o3 : 0),
  500. (i : A_XOR;ops : 2;oc : $34;eb : ao_none;m : af_w or NoModrm;o1 : ao_imm;o2 : ao_acc;o3 : 0),
  501. (i : A_XOR;ops : 2;oc : $80;eb : 6;m : af_w or Modrm;o1 : ao_imm;o2 : ao_reg or ao_mem;o3 : 0),
  502. (i : A_ADC;ops : 2;oc : $10;eb : ao_none;m : af_dw or Modrm;o1 : ao_reg;o2 : ao_reg or ao_mem;o3 : 0),
  503. (i : A_ADC;ops : 2;oc : $83;eb : 2;m : Modrm;o1 : ao_imm8s;o2 : ao_wordreg or ao_wordmem;o3 : 0),
  504. (i : A_ADC;ops : 2;oc : $14;eb : ao_none;m : af_w or NoModrm;o1 : ao_imm;o2 : ao_acc;o3 : 0),
  505. (i : A_ADC;ops : 2;oc : $80;eb : 2;m : af_w or Modrm;o1 : ao_imm;o2 : ao_reg or ao_mem;o3 : 0),
  506. (i : A_NEG;ops : 1;oc : $f6;eb : 3;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : 0;o3 : 0),
  507. (i : A_NOT;ops : 1;oc : $f6;eb : 2;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : 0;o3 : 0),
  508. (i : A_AAA;ops : 0;oc : $37;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  509. (i : A_AAS;ops : 0;oc : $3f;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  510. (i : A_DAA;ops : 0;oc : $27;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  511. (i : A_DAS;ops : 0;oc : $2f;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  512. (i : A_AAD;ops : 0;oc : $d50a;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  513. (i : A_AAM;ops : 0;oc : $d40a;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  514. (i : A_CBW;ops : 0;oc : $6698;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  515. (i : A_CWD;ops : 0;oc : $6699;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  516. (i : A_CWDE;ops : 0;oc : $98;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  517. (i : A_CDQ;ops : 0;oc : $99;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  518. (i : A_MUL;ops : 1;oc : $f6;eb : 4;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : 0;o3 : 0),
  519. (i : A_IMUL;ops : 1;oc : $f6;eb : 5;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : 0;o3 : 0),
  520. (i : A_IMUL;ops : 2;oc : $0faf;eb : ao_none;m : Modrm or af_reverseregregmem;o1 : ao_wordreg or ao_mem;
  521. o2 : ao_wordreg;o3 : 0),
  522. (i : A_IMUL;ops : 3;oc : $6b;eb : ao_none;m : Modrm or af_reverseregregmem;o1 : ao_imm8s;
  523. o2 : ao_wordreg or ao_mem;o3 : ao_wordreg),
  524. (i : A_IMUL;ops : 3;oc : $69;eb : ao_none;m : Modrm or af_reverseregregmem;o1 : ao_imm16 or ao_imm32;
  525. o2 : ao_wordreg or ao_mem;o3 : ao_wordreg),
  526. (i : A_IMUL;ops : 2;oc : $6b;eb : ao_none;m : Modrm or imulKludge;o1 : ao_imm8s;o2 : ao_wordreg;o3 : 0),
  527. (i : A_IMUL;ops : 2;oc : $69;eb : ao_none;m : Modrm or imulKludge;o1 : ao_imm8 or ao_imm16 or ao_imm32;
  528. o2 : ao_wordreg;o3 : 0),
  529. (i : A_DIV;ops : 1;oc : $f6;eb : 6;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : 0;o3 : 0),
  530. (i : A_DIV;ops : 2;oc : $f6;eb : 6;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : ao_acc;o3 : 0),
  531. (i : A_IDIV;ops : 1;oc : $f6;eb : 7;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : 0;o3 : 0),
  532. (i : A_IDIV;ops : 2;oc : $f6;eb : 7;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : ao_acc;o3 : 0),
  533. (i : A_ROL;ops : 2;oc : $d0;eb : 0;m : af_w or Modrm;o1 : ao_imm1;o2 : ao_reg or ao_mem;o3 : 0),
  534. (i : A_ROL;ops : 2;oc : $c0;eb : 0;m : af_w or Modrm;o1 : ao_imm8;o2 : ao_reg or ao_mem;o3 : 0),
  535. (i : A_ROL;ops : 2;oc : $d2;eb : 0;m : af_w or Modrm;o1 : ao_shiftcount;o2 : ao_reg or ao_mem;o3 : 0),
  536. (i : A_ROL;ops : 1;oc : $d0;eb : 0;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : 0;o3 : 0),
  537. (i : A_ROR;ops : 2;oc : $d0;eb : 1;m : af_w or Modrm;o1 : ao_imm1;o2 : ao_reg or ao_mem;o3 : 0),
  538. (i : A_ROR;ops : 2;oc : $c0;eb : 1;m : af_w or Modrm;o1 : ao_imm8;o2 : ao_reg or ao_mem;o3 : 0),
  539. (i : A_ROR;ops : 2;oc : $d2;eb : 1;m : af_w or Modrm;o1 : ao_shiftcount;o2 : ao_reg or ao_mem;o3 : 0),
  540. (i : A_ROR;ops : 1;oc : $d0;eb : 1;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : 0;o3 : 0),
  541. (i : A_RCL;ops : 2;oc : $d0;eb : 2;m : af_w or Modrm;o1 : ao_imm1;o2 : ao_reg or ao_mem;o3 : 0),
  542. (i : A_RCL;ops : 2;oc : $c0;eb : 2;m : af_w or Modrm;o1 : ao_imm8;o2 : ao_reg or ao_mem;o3 : 0),
  543. (i : A_RCL;ops : 2;oc : $d2;eb : 2;m : af_w or Modrm;o1 : ao_shiftcount;o2 : ao_reg or ao_mem;o3 : 0),
  544. (i : A_RCL;ops : 1;oc : $d0;eb : 2;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : 0;o3 : 0),
  545. (i : A_RCR;ops : 2;oc : $d0;eb : 3;m : af_w or Modrm;o1 : ao_imm1;o2 : ao_reg or ao_mem;o3 : 0),
  546. (i : A_RCR;ops : 2;oc : $c0;eb : 3;m : af_w or Modrm;o1 : ao_imm8;o2 : ao_reg or ao_mem;o3 : 0),
  547. (i : A_RCR;ops : 2;oc : $d2;eb : 3;m : af_w or Modrm;o1 : ao_shiftcount;o2 : ao_reg or ao_mem;o3 : 0),
  548. (i : A_RCR;ops : 1;oc : $d0;eb : 3;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : 0;o3 : 0),
  549. (i : A_SAL;ops : 2;oc : $d0;eb : 4;m : af_w or Modrm;o1 : ao_imm1;o2 : ao_reg or ao_mem;o3 : 0),
  550. (i : A_SAL;ops : 2;oc : $c0;eb : 4;m : af_w or Modrm;o1 : ao_imm8;o2 : ao_reg or ao_mem;o3 : 0),
  551. (i : A_SAL;ops : 2;oc : $d2;eb : 4;m : af_w or Modrm;o1 : ao_shiftcount;o2 : ao_reg or ao_mem;o3 : 0),
  552. (i : A_SAL;ops : 1;oc : $d0;eb : 4;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : 0;o3 : 0),
  553. (i : A_SHL;ops : 2;oc : $d0;eb : 4;m : af_w or Modrm;o1 : ao_imm1;o2 : ao_reg or ao_mem;o3 : 0),
  554. (i : A_SHL;ops : 2;oc : $c0;eb : 4;m : af_w or Modrm;o1 : ao_imm8;o2 : ao_reg or ao_mem;o3 : 0),
  555. (i : A_SHL;ops : 2;oc : $d2;eb : 4;m : af_w or Modrm;o1 : ao_shiftcount;o2 : ao_reg or ao_mem;o3 : 0),
  556. (i : A_SHL;ops : 1;oc : $d0;eb : 4;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : 0;o3 : 0),
  557. (i : A_SHLD;ops : 3;oc : $0fa4;eb : ao_none;m : Modrm;o1 : ao_imm8;o2 : ao_wordreg;o3 : ao_wordreg or ao_mem),
  558. (i : A_SHLD;ops : 3;oc : $0fa5;eb : ao_none;m : Modrm;o1 : ao_shiftcount;o2 : ao_wordreg;o3 : ao_wordreg or ao_mem),
  559. (i : A_SHR;ops : 2;oc : $d0;eb : 5;m : af_w or Modrm;o1 : ao_imm1;o2 : ao_reg or ao_mem;o3 : 0),
  560. (i : A_SHR;ops : 2;oc : $c0;eb : 5;m : af_w or Modrm;o1 : ao_imm8;o2 : ao_reg or ao_mem;o3 : 0),
  561. (i : A_SHR;ops : 2;oc : $d2;eb : 5;m : af_w or Modrm;o1 : ao_shiftcount;o2 : ao_reg or ao_mem;o3 : 0),
  562. (i : A_SHR;ops : 1;oc : $d0;eb : 5;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : 0;o3 : 0),
  563. (i : A_SHRD;ops : 3;oc : $0fac;eb : ao_none;m : Modrm;o1 : ao_imm8;o2 : ao_wordreg;o3 : ao_wordreg or ao_mem),
  564. (i : A_SHRD;ops : 3;oc : $0fad;eb : ao_none;m : Modrm;o1 : ao_shiftcount;o2 : ao_wordreg;o3 : ao_wordreg or ao_mem),
  565. (i : A_SAR;ops : 2;oc : $d0;eb : 7;m : af_w or Modrm;o1 : ao_imm1;o2 : ao_reg or ao_mem;o3 : 0),
  566. (i : A_SAR;ops : 2;oc : $c0;eb : 7;m : af_w or Modrm;o1 : ao_imm8;o2 : ao_reg or ao_mem;o3 : 0),
  567. (i : A_SAR;ops : 2;oc : $d2;eb : 7;m : af_w or Modrm;o1 : ao_shiftcount;o2 : ao_reg or ao_mem;o3 : 0),
  568. (i : A_SAR;ops : 1;oc : $d0;eb : 7;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : 0;o3 : 0),
  569. (i : A_CALL;ops : 1;oc : $e8;eb : ao_none;m : jumpdword;o1 : ao_disp32;o2 : 0;o3 : 0),
  570. (i : A_CALL;ops : 1;oc : $ff;eb : 2;m : Modrm;o1 : ao_reg or ao_mem or ao_jumpabsolute;o2 : 0;o3 : 0),
  571. (i : A_LCALL;ops : 2;oc : $9a;eb : ao_none;m : JumpInterSegment;o1 : ao_imm16;o2 : ao_abs32;o3 : 0),
  572. (i : A_LCALL;ops : 1;oc : $ff;eb : 3;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  573. (i : A_JMP;ops : 1;oc : $eb;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  574. (i : A_JMP;ops : 1;oc : $ff;eb : 4;m : Modrm;o1 : ao_reg32 or ao_mem or ao_jumpabsolute;o2 : 0;o3 : 0),
  575. (i : A_LJMP;ops : 2;oc : $ea;eb : ao_none;m : JumpInterSegment;o1 : ao_imm16;o2 : ao_imm32;o3 : 0),
  576. (i : A_LJMP;ops : 1;oc : $ff;eb : 5;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  577. (i : A_RET;ops : 0;oc : $c3;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  578. (i : A_RET;ops : 1;oc : $c2;eb : ao_none;m : NoModrm;o1 : ao_imm16;o2 : 0;o3 : 0),
  579. (i : A_LRET;ops : 0;oc : $cb;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  580. (i : A_LRET;ops : 1;oc : $ca;eb : ao_none;m : NoModrm;o1 : ao_imm16;o2 : 0;o3 : 0),
  581. (i : A_ENTER;ops : 2;oc : $c8;eb : ao_none;m : NoModrm;o1 : ao_imm16;o2 : ao_imm8;o3 : 0),
  582. (i : A_LEAVE;ops : 0;oc : $c9;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  583. (i : A_JO;ops : 1;oc : $70;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  584. (i : A_JNO;ops : 1;oc : $71;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  585. (i : A_JB;ops : 1;oc : $72;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  586. (i : A_JC;ops : 1;oc : $72;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  587. (i : A_JNAE;ops : 1;oc : $72;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  588. (i : A_JNB;ops : 1;oc : $73;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  589. (i : A_JNC;ops : 1;oc : $73;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  590. (i : A_JAE;ops : 1;oc : $73;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  591. (i : A_JE;ops : 1;oc : $74;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  592. (i : A_JZ;ops : 1;oc : $74;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  593. (i : A_JNE;ops : 1;oc : $75;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  594. (i : A_JNZ;ops : 1;oc : $75;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  595. (i : A_JBE;ops : 1;oc : $76;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  596. (i : A_JNA;ops : 1;oc : $76;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  597. (i : A_JNBE;ops : 1;oc : $77;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  598. (i : A_JA;ops : 1;oc : $77;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  599. (i : A_JS;ops : 1;oc : $78;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  600. (i : A_JNS;ops : 1;oc : $79;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  601. (i : A_JP;ops : 1;oc : $7a;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  602. (i : A_JPE;ops : 1;oc : $7a;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  603. (i : A_JNP;ops : 1;oc : $7b;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  604. (i : A_JPO;ops : 1;oc : $7b;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  605. (i : A_JL;ops : 1;oc : $7c;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  606. (i : A_JNGE;ops : 1;oc : $7c;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  607. (i : A_JNL;ops : 1;oc : $7d;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  608. (i : A_JGE;ops : 1;oc : $7d;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  609. (i : A_JLE;ops : 1;oc : $7e;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  610. (i : A_JNG;ops : 1;oc : $7e;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  611. (i : A_JNLE;ops : 1;oc : $7f;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  612. (i : A_JG;ops : 1;oc : $7f;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  613. (i : A_JCXZ;ops : 1;oc : $67e3;eb : ao_none;m : JumpByte;o1 : ao_disp;o2 : 0;o3 : 0),
  614. (i : A_JECXZ;ops : 1;oc : $e3;eb : ao_none;m : JumpByte;o1 : ao_disp;o2 : 0;o3 : 0),
  615. (i : A_LOOP;ops : 1;oc : $e2;eb : ao_none;m : JumpByte;o1 : ao_disp;o2 : 0;o3 : 0),
  616. (i : A_LOOPZ;ops : 1;oc : $e1;eb : ao_none;m : JumpByte;o1 : ao_disp;o2 : 0;o3 : 0),
  617. (i : A_LOOPE;ops : 1;oc : $e1;eb : ao_none;m : JumpByte;o1 : ao_disp;o2 : 0;o3 : 0),
  618. (i : A_LOOPNZ;ops : 1;oc : $e0;eb : ao_none;m : JumpByte;o1 : ao_disp;o2 : 0;o3 : 0),
  619. (i : A_LOOPNE;ops : 1;oc : $e0;eb : ao_none;m : JumpByte;o1 : ao_disp;o2 : 0;o3 : 0),
  620. (i : A_SETO;ops : 1;oc : $0f90;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  621. (i : A_SETNO;ops : 1;oc : $0f91;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  622. (i : A_SETB;ops : 1;oc : $0f92;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  623. (i : A_SETNAE;ops : 1;oc : $0f92;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  624. (i : A_SETNB;ops : 1;oc : $0f93;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  625. (i : A_SETAE;ops : 1;oc : $0f93;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  626. (i : A_SETE;ops : 1;oc : $0f94;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  627. (i : A_SETZ;ops : 1;oc : $0f94;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  628. (i : A_SETNE;ops : 1;oc : $0f95;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  629. (i : A_SETNZ;ops : 1;oc : $0f95;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  630. (i : A_SETBE;ops : 1;oc : $0f96;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  631. (i : A_SETNA;ops : 1;oc : $0f96;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  632. (i : A_SETNBE;ops : 1;oc : $0f97;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  633. (i : A_SETA;ops : 1;oc : $0f97;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  634. (i : A_SETS;ops : 1;oc : $0f98;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  635. (i : A_SETNS;ops : 1;oc : $0f99;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  636. (i : A_SETP;ops : 1;oc : $0f9a;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  637. (i : A_SETC;ops : 1; oc: $0f92;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  638. (i : A_SETNC;ops : 1;oc: $0f93;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  639. (i : A_SETPE;ops : 1;oc : $0f9a;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  640. (i : A_SETNP;ops : 1;oc : $0f9b;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  641. (i : A_SETPO;ops : 1;oc : $0f9b;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  642. (i : A_SETL;ops : 1;oc : $0f9c;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  643. (i : A_SETNGE;ops : 1;oc : $0f9c;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  644. (i : A_SETNL;ops : 1;oc : $0f9d;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  645. (i : A_SETGE;ops : 1;oc : $0f9d;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  646. (i : A_SETLE;ops : 1;oc : $0f9e;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  647. (i : A_SETNG;ops : 1;oc : $0f9e;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  648. (i : A_SETNLE;ops : 1;oc : $0f9f;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  649. (i : A_SETG;ops : 1;oc : $0f9f;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  650. (i : A_CMPS;ops : 0;oc : $a6;eb : ao_none;m : af_w or NoModrm;o1 : 0;o2 : 0;o3 : 0),
  651. (i : A_INS;ops : 0;oc : $6c;eb : ao_none;m : af_w or NoModrm;o1 : 0;o2 : 0;o3 : 0),
  652. (i : A_OUTS;ops : 0;oc : $6e;eb : ao_none;m : af_w or NoModrm;o1 : 0;o2 : 0;o3 : 0),
  653. (i : A_LODS;ops : 0;oc : $ac;eb : ao_none;m : af_w or NoModrm;o1 : 0;o2 : 0;o3 : 0),
  654. (i : A_MOVS;ops : 0;oc : $a4;eb : ao_none;m : af_w or NoModrm;o1 : 0;o2 : 0;o3 : 0),
  655. (i : A_SCAS;ops : 0;oc : $ae;eb : ao_none;m : af_w or NoModrm;o1 : 0;o2 : 0;o3 : 0),
  656. (i : A_STOS;ops : 0;oc : $aa;eb : ao_none;m : af_w or NoModrm;o1 : 0;o2 : 0;o3 : 0),
  657. (i : A_XLAT;ops : 0;oc : $d7;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  658. (i : A_BSF;ops : 2;oc : $0fbc;eb : ao_none;m : Modrm or af_reverseregregmem;o1 : ao_reg or ao_mem;o2 : ao_reg;o3 : 0),
  659. (i : A_BSR;ops : 2;oc : $0fbd;eb : ao_none;m : Modrm or af_reverseregregmem;o1 : ao_reg or ao_mem;o2 : ao_reg;o3 : 0),
  660. (i : A_BT;ops : 2;oc : $0fa3;eb : ao_none;m : Modrm;o1 : ao_reg;o2 : ao_reg or ao_mem;o3 : 0),
  661. (i : A_BT;ops : 2;oc : $0fba;eb : 4;m : Modrm;o1 : ao_imm8;o2 : ao_reg or ao_mem;o3 : 0),
  662. (i : A_BTC;ops : 2;oc : $0fbb;eb : ao_none;m : Modrm;o1 : ao_reg;o2 : ao_reg or ao_mem;o3 : 0),
  663. (i : A_BTC;ops : 2;oc : $0fba;eb : 7;m : Modrm;o1 : ao_imm8;o2 : ao_reg or ao_mem;o3 : 0),
  664. (i : A_BTR;ops : 2;oc : $0fb3;eb : ao_none;m : Modrm;o1 : ao_reg;o2 : ao_reg or ao_mem;o3 : 0),
  665. (i : A_BTR;ops : 2;oc : $0fba;eb : 6;m : Modrm;o1 : ao_imm8;o2 : ao_reg or ao_mem;o3 : 0),
  666. (i : A_BTS;ops : 2;oc : $0fab;eb : ao_none;m : Modrm;o1 : ao_reg;o2 : ao_reg or ao_mem;o3 : 0),
  667. (i : A_BTS;ops : 2;oc : $0fba;eb : 5;m : Modrm;o1 : ao_imm8;o2 : ao_reg or ao_mem;o3 : 0),
  668. (i : A_INT;ops : 1;oc : $cd;eb : ao_none;m : NoModrm;o1 : ao_imm8;o2 : 0;o3 : 0),
  669. (i : A_INT3;ops : 0;oc : $cc;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  670. (i : A_INTO;ops : 0;oc : $ce;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  671. (i : A_IRET;ops : 0;oc : $cf;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  672. (i : A_BOUNDL;ops : 2;oc : $62;eb : ao_none;m : Modrm;o1 : ao_reg32;o2 : ao_mem;o3 : 0),
  673. (i : A_BOUNDW;ops : 2;oc : $6662;eb : ao_none;m : Modrm;o1 : ao_reg16;o2 : ao_mem;o3 : 0),
  674. (i : A_HLT;ops : 0;oc : $f4;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  675. (i : A_wAIT;ops : 0;oc : $9b;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  676. (i : A_NOP;ops : 0;oc : $90;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  677. (i : A_ARPL;ops : 2;oc : $63;eb : ao_none;m : Modrm;o1 : ao_reg16;o2 : ao_reg16 or ao_mem;o3 : 0),
  678. (i : A_LAR;ops : 2;oc : $0f02;eb : ao_none;m : Modrm or af_reverseregregmem;o1 : ao_wordreg or ao_mem;
  679. o2 : ao_wordreg;o3 : 0),
  680. (i : A_LGDT;ops : 1;oc : $0f01;eb : 2;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  681. (i : A_LIDT;ops : 1;oc : $0f01;eb : 3;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  682. (i : A_LLDT;ops : 1;oc : $0f00;eb : 2;m : Modrm;o1 : ao_wordreg or ao_mem;o2 : 0;o3 : 0),
  683. (i : A_LMSW;ops : 1;oc : $0f01;eb : 6;m : Modrm;o1 : ao_wordreg or ao_mem;o2 : 0;o3 : 0),
  684. (i : A_LSL;ops : 2;oc : $0f03;eb : ao_none;m : Modrm or af_reverseregregmem;o1 : ao_wordreg or ao_mem;
  685. o2 : ao_wordreg;o3 : 0),
  686. (i : A_LTR;ops : 1;oc : $0f00;eb : 3;m : Modrm;o1 : ao_wordreg or ao_mem;o2 : 0;o3 : 0),
  687. (i : A_SGDT;ops : 1;oc : $0f01;eb : 0;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  688. (i : A_SIDT;ops : 1;oc : $0f01;eb : 1;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  689. (i : A_SLDT;ops : 1;oc : $0f00;eb : 0;m : Modrm;o1 : ao_wordreg or ao_mem;o2 : 0;o3 : 0),
  690. (i : A_SMSW;ops : 1;oc : $0f01;eb : 4;m : Modrm;o1 : ao_wordreg or ao_mem;o2 : 0;o3 : 0),
  691. (i : A_STR;ops : 1;oc : $0f00;eb : 1;m : Modrm;o1 : ao_reg16 or ao_mem;o2 : 0;o3 : 0),
  692. (i : A_VERR;ops : 1;oc : $0f00;eb : 4;m : Modrm;o1 : ao_wordreg or ao_mem;o2 : 0;o3 : 0),
  693. (i : A_VERW;ops : 1;oc : $0f00;eb : 5;m : Modrm;o1 : ao_wordreg or ao_mem;o2 : 0;o3 : 0),
  694. (i : A_FLD;ops : 1;oc : $d9c0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  695. (i : A_FLDS;ops : 1;oc : $d9;eb : 0;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  696. (i : A_FILDL;ops : 1;oc : $db;eb : 0;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  697. (i : A_FLDL;ops : 1;oc : $dd;eb : 0;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  698. (i : A_FLDL;ops : 1;oc : $d9c0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  699. (i : A_FILDS;ops : 1;oc : $df;eb : 0;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  700. (i : A_FILDQ;ops : 1;oc : $df;eb : 5;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  701. (i : A_FLDT;ops : 1;oc : $db;eb : 5;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  702. (i : A_FBLD;ops : 1;oc : $df;eb : 4;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  703. (i : A_FST;ops : 1;oc : $ddd0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  704. (i : A_FSTS;ops : 1;oc : $d9;eb : 2;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  705. (i : A_FISTL;ops : 1;oc : $db;eb : 2;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  706. (i : A_FSTL;ops : 1;oc : $dd;eb : 2;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  707. (i : A_FSTL;ops : 1;oc : $ddd0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  708. (i : A_FISTS;ops : 1;oc : $df;eb : 2;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  709. (i : A_FSTP;ops : 1;oc : $ddd8;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  710. (i : A_FSTPS;ops : 1;oc : $d9;eb : 3;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  711. (i : A_FISTPL;ops : 1;oc : $db;eb : 3;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  712. (i : A_FSTPL;ops : 1;oc : $dd;eb : 3;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  713. (i : A_FSTPL;ops : 1;oc : $ddd8;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  714. (i : A_FISTPS;ops : 1;oc : $df;eb : 3;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  715. (i : A_FISTPQ;ops : 1;oc : $df;eb : 7;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  716. (i : A_FSTPT;ops : 1;oc : $db;eb : 7;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  717. (i : A_FBSTP;ops : 1;oc : $df;eb : 6;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  718. (i : A_FXCH;ops : 1;oc : $d9c8;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  719. (i : A_FCOM;ops : 1;oc : $d8d0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  720. (i : A_FCOMS;ops : 1;oc : $d8;eb : 2;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  721. (i : A_FICOML;ops : 1;oc : $da;eb : 2;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  722. (i : A_FCOML;ops : 1;oc : $dc;eb : 2;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  723. (i : A_FCOML;ops : 1;oc : $d8d0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  724. (i : A_FICOMS;ops : 1;oc : $de;eb : 2;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  725. (i : A_FCOMP;ops : 1;oc : $d8d8;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  726. (i : A_FCOMPS;ops : 1;oc : $d8;eb : 3;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  727. (i : A_FICOMPL;ops : 1;oc : $da;eb : 3;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  728. (i : A_FCOMPL;ops : 1;oc : $dc;eb : 3;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  729. (i : A_FCOMPL;ops : 1;oc : $d8d8;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  730. (i : A_FICOMPS;ops : 1;oc : $de;eb : 3;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  731. (i : A_FCOMPP;ops : 0;oc : $ded9;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  732. (i : A_FUCOM;ops : 1;oc : $dde0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  733. (i : A_FUCOMP;ops : 1;oc : $dde8;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  734. (i : A_FUCOMPP;ops : 0;oc : $dae9;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  735. (i : A_FTST;ops : 0;oc : $d9e4;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  736. (i : A_FXAM;ops : 0;oc : $d9e5;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  737. (i : A_FLD1;ops : 0;oc : $d9e8;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  738. (i : A_FLDL2T;ops : 0;oc : $d9e9;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  739. (i : A_FLDL2E;ops : 0;oc : $d9ea;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  740. (i : A_FLDPI;ops : 0;oc : $d9eb;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  741. (i : A_FLDLG2;ops : 0;oc : $d9ec;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  742. (i : A_FLDLN2;ops : 0;oc : $d9ed;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  743. (i : A_FLDZ;ops : 0;oc : $d9ee;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  744. (i : A_FADD;ops : 1;oc : $d8c0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  745. (i : A_FADD;ops : 2;oc : $d8c0;eb : ao_none;m : ShortForm or af_floatd;o1 : ao_floatreg;o2 : ao_floatacc;o3 : 0),
  746. (i : A_FADD;ops : 0;oc : $dcc1;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  747. (i : A_FADDP;ops : 1;oc : $dac0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  748. (i : A_FADDP;ops : 2;oc : $dac0;eb : ao_none;m : ShortForm or af_floatd;o1 : ao_floatreg;o2 : ao_floatacc;o3 : 0),
  749. (i : A_FADDP;ops : 0;oc : $dec1;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  750. (i : A_FADDS;ops : 1;oc : $d8;eb : 0;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  751. (i : A_FIADDL;ops : 1;oc : $da;eb : 0;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  752. (i : A_FADDL;ops : 1;oc : $dc;eb : 0;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  753. (i : A_FIADDS;ops : 1;oc : $de;eb : 0;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  754. (i : A_FSUB;ops : 1;oc : $d8e0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  755. (i : A_FSUB;ops : 2;oc : $d8e0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : ao_floatacc;o3 : 0),
  756. (i : A_FSUB;ops : 2;oc : $dce8;eb : ao_none;m : ShortForm;o1 : ao_floatacc;o2 : ao_floatreg;o3 : 0),
  757. (i : A_FSUB;ops : 0;oc : $dce1;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  758. (i : A_FSUBP;ops : 1;oc : $dae0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  759. (i : A_FSUBP;ops : 2;oc : $dae0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : ao_floatacc;o3 : 0),
  760. (i : A_FSUBP;ops : 2;oc : $dee0;eb : ao_none;m : ShortForm;o1 : ao_floatacc;o2 : ao_floatreg;o3 : 0),
  761. (i : A_FSUBP;ops : 0;oc : $dee1;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  762. (i : A_FSUBS;ops : 1;oc : $d8;eb : 4;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  763. (i : A_FISUBL;ops : 1;oc : $da;eb : 4;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  764. (i : A_FSUBL;ops : 1;oc : $dc;eb : 4;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  765. (i : A_FISUBS;ops : 1;oc : $de;eb : 4;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  766. (i : A_FSUBR;ops : 1;oc : $d8e8;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  767. (i : A_FSUBR;ops : 2;oc : $d8e8;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : ao_floatacc;o3 : 0),
  768. (i : A_FSUBR;ops : 2;oc : $dce8;eb : ao_none;m : ShortForm;o1 : ao_floatacc;o2 : ao_floatreg;o3 : 0),
  769. (i : A_FSUBR;ops : 0;oc : $dce9;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  770. (i : A_FSUBRP;ops : 1;oc : $dae8;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  771. (i : A_FSUBRP;ops : 2;oc : $dae8;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : ao_floatacc;o3 : 0),
  772. (i : A_FSUBRP;ops : 2;oc : $dee8;eb : ao_none;m : ShortForm;o1 : ao_floatacc;o2 : ao_floatreg;o3 : 0),
  773. (i : A_FSUBRP;ops : 0;oc : $dee9;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  774. (i : A_FSUBRS;ops : 1;oc : $d8;eb : 5;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  775. (i : A_FISUBRL;ops : 1;oc : $da;eb : 5;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  776. (i : A_FSUBRL;ops : 1;oc : $dc;eb : 5;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  777. (i : A_FISUBRS;ops : 1;oc : $de;eb : 5;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  778. (i : A_FMUL;ops : 1;oc : $d8c8;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  779. (i : A_FMUL;ops : 2;oc : $d8c8;eb : ao_none;m : ShortForm or af_floatd;o1 : ao_floatreg;o2 : ao_floatacc;o3 : 0),
  780. (i : A_FMUL;ops : 0;oc : $dcc9;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  781. (i : A_FMULP;ops : 1;oc : $dac8;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  782. (i : A_FMULP;ops : 2;oc : $dac8;eb : ao_none;m : ShortForm or af_floatd;o1 : ao_floatreg;o2 : ao_floatacc;o3 : 0),
  783. (i : A_FMULP;ops : 0;oc : $dec9;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  784. (i : A_FMULS;ops : 1;oc : $d8;eb : 1;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  785. (i : A_FIMULL;ops : 1;oc : $da;eb : 1;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  786. (i : A_FMULL;ops : 1;oc : $dc;eb : 1;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  787. (i : A_FIMULS;ops : 1;oc : $de;eb : 1;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  788. (i : A_FDIV;ops : 1;oc : $d8f0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  789. (i : A_FDIV;ops : 2;oc : $d8f0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : ao_floatacc;o3 : 0),
  790. (i : A_FDIV;ops : 2;oc : $dcf0;eb : ao_none;m : ShortForm;o1 : ao_floatacc;o2 : ao_floatreg;o3 : 0),
  791. (i : A_FDIV;ops : 0;oc : $dcf1;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  792. (i : A_FDIVP;ops : 1;oc : $daf0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  793. (i : A_FDIVP;ops : 2;oc : $daf0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : ao_floatacc;o3 : 0),
  794. (i : A_FDIVP;ops : 2;oc : $def0;eb : ao_none;m : ShortForm;o1 : ao_floatacc;o2 : ao_floatreg;o3 : 0),
  795. (i : A_FDIVP;ops : 0;oc : $def1;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  796. (i : A_FDIVS;ops : 1;oc : $d8;eb : 6;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  797. (i : A_FIDIVL;ops : 1;oc : $da;eb : 6;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  798. (i : A_FDIVL;ops : 1;oc : $dc;eb : 6;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  799. (i : A_FIDIVS;ops : 1;oc : $de;eb : 6;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  800. (i : A_FDIVR;ops : 1;oc : $d8f8;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  801. (i : A_FDIVR;ops : 2;oc : $d8f8;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : ao_floatacc;o3 : 0),
  802. (i : A_FDIVR;ops : 2;oc : $dcf8;eb : ao_none;m : ShortForm;o1 : ao_floatacc;o2 : ao_floatreg;o3 : 0),
  803. (i : A_FDIVR;ops : 0;oc : $dcf9;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  804. (i : A_FDIVRP;ops : 1;oc : $daf8;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  805. (i : A_FDIVRP;ops : 2;oc : $daf8;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : ao_floatacc;o3 : 0),
  806. (i : A_FDIVRP;ops : 2;oc : $def8;eb : ao_none;m : ShortForm;o1 : ao_floatacc;o2 : ao_floatreg;o3 : 0),
  807. (i : A_FDIVRP;ops : 0;oc : $def9;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  808. (i : A_FDIVRS;ops : 1;oc : $d8;eb : 7;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  809. (i : A_FIDIVRL;ops : 1;oc : $da;eb : 7;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  810. (i : A_FDIVRL;ops : 1;oc : $dc;eb : 7;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  811. (i : A_FIDIVRS;ops : 1;oc : $de;eb : 7;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  812. (i : A_F2XM1;ops : 0;oc : $d9f0;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  813. (i : A_FYL2X;ops : 0;oc : $d9f1;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  814. (i : A_FPTAN;ops : 0;oc : $d9f2;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  815. (i : A_FPATAN;ops : 0;oc : $d9f3;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  816. (i : A_FXTRACT;ops : 0;oc : $d9f4;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  817. (i : A_FPREM1;ops : 0;oc : $d9f5;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  818. (i : A_FDECSTP;ops : 0;oc : $d9f6;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  819. (i : A_FINCSTP;ops : 0;oc : $d9f7;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  820. (i : A_FPREM;ops : 0;oc : $d9f8;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  821. (i : A_FYL2XP1;ops : 0;oc : $d9f9;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  822. (i : A_FSQRT;ops : 0;oc : $d9fa;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  823. (i : A_FSINCOS;ops : 0;oc : $d9fb;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  824. (i : A_FRNDINT;ops : 0;oc : $d9fc;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  825. (i : A_FSCALE;ops : 0;oc : $d9fd;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  826. (i : A_FSIN;ops : 0;oc : $d9fe;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  827. (i : A_FCOS;ops : 0;oc : $d9ff;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  828. (i : A_FCHS;ops : 0;oc : $d9e0;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  829. (i : A_FABS;ops : 0;oc : $d9e1;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  830. (i : A_FNINIT;ops : 0;oc : $dbe3;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  831. (i : A_FINIT;ops : 0;oc : $dbe3;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  832. (i : A_FLDCW;ops : 1;oc : $d9;eb : 5;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  833. (i : A_FNSTCW;ops : 1;oc : $d9;eb : 7;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  834. (i : A_FSTCW;ops : 1;oc : $d9;eb : 7;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  835. (i : A_FNSTSW;ops : 1;oc : $dfe0;eb : ao_none;m : NoModrm;o1 : ao_acc;o2 : 0;o3 : 0),
  836. (i : A_FNSTSW;ops : 1;oc : $dd;eb : 7;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  837. (i : A_FNSTSW;ops : 0;oc : $dfe0;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  838. (i : A_FSTSW;ops : 1;oc : $dfe0;eb : ao_none;m : NoModrm;o1 : ao_acc;o2 : 0;o3 : 0),
  839. (i : A_FSTSW;ops : 1;oc : $dd;eb : 7;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  840. (i : A_FSTSW;ops : 0;oc : $dfe0;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  841. (i : A_FNCLEX;ops : 0;oc : $dbe2;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  842. (i : A_FCLEX;ops : 0;oc : $dbe2;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  843. (i : A_FNSTENV;ops : 1;oc : $d9;eb : 6;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  844. (i : A_FSTENV;ops : 1;oc : $d9;eb : 6;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  845. (i : A_FLDENV;ops : 1;oc : $d9;eb : 4;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  846. (i : A_FNSAVE;ops : 1;oc : $dd;eb : 6;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  847. (i : A_FSAVE;ops : 1;oc : $dd;eb : 6;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  848. (i : A_FRSTOR;ops : 1;oc : $dd;eb : 4;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  849. (i : A_FFREE;ops : 1;oc : $ddc0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  850. (i : A_FNOP;ops : 0;oc : $d9d0;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  851. (i : A_FWAIT;ops : 0;oc : $9b;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  852. { (i : A_ADDRaf_wORD;ops : 0;oc : $67;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0), }
  853. { (i : A_WORD;ops : 0;oc : $66;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0), }
  854. (i : A_LOCK;ops : 0;oc : $f0;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  855. { (i : A_CS;ops : 0;oc : $2e;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  856. (i : A_DS;ops : 0;oc : $3e;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  857. (i : A_ES;ops : 0;oc : $26;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  858. (i : A_FS;ops : 0;oc : $64;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  859. (i : A_GS;ops : 0;oc : $65;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  860. (i : A_SS;ops : 0;oc : $36;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0), }
  861. (i : A_REP;ops : 0;oc : $f3;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  862. (i : A_REPE;ops : 0;oc : $f3;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  863. (i : A_REPNE;ops : 0;oc : $f2;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  864. (i : A_CPUID;ops : 0;oc : $0fa2;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  865. (i : A_EMMS;ops : 0;oc : $0f77;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  866. (i : A_NONE));
  867. {$endif NOITTABLE}
  868. {****************************************************************************
  869. Assembler Mnemoics
  870. ****************************************************************************}
  871. const
  872. att_op2str : array[firstop..lastop] of string[7] =
  873. ('mov','movz','movs','','add',
  874. 'call','idiv','imul','jmp','lea','mul','neg','not',
  875. 'pop','popal','push','pushal','ret','sub','xchg','xor',
  876. 'fild','cmp','jz','inc','dec','sete','setne','setl',
  877. 'setg','setle','setge','je','jne','jl','jg','jle','jge',
  878. 'or','fld','fadd','fmul','fsub','fdiv','fchs','fld1',
  879. 'fidiv','jnz','fstp','and','jno','','',
  880. 'enter','leave','cld','movs','rep','shl','shr','bound',
  881. 'jns','js','jo','sar','test',
  882. 'fcom','fcomp','fcompp','fxch','faddp','fmulp','fsubp','fdivp',
  883. 'fnsts','sahf','fdivrp','fsubrp','setc','setnc','jc','jnc',
  884. 'ja','jae','jb','jbe','seta','setae','setb','setbe',
  885. 'aaa','aad','aam','aas','cbtw','cltd','clc','cli',
  886. 'clts','cmc','cwtd','cwtl','daa','das','hlt','iret','lahf',
  887. 'lods','lock','nop','pusha','pushf','pushfl',
  888. 'stc','std','sti','stos','wait','xlat','xlatb','movsb',
  889. 'movsbl','movsbw','movswl','movsb','movzwl','popa','in',
  890. 'out','lds','lcs','les','lfs','lgs','lss','popf','sbb','adc',
  891. 'div','ror','rol','rcl','rcr','sal','shld','shrd',
  892. 'lcall','ljmp','lret','jnae','jnb','jna','jnbe','jb','jnp',
  893. 'jpe','jpo','jnge','jng','jnl','jnle','jcxz','jecxz',
  894. 'loop','cmps','ins','outs','scas','bsf','bsr','bt','btc',
  895. 'btr','bts','int','int3','into','boundl','boundw',
  896. 'loopz','loope','loopnz','loopne','seto','setno','setnae',
  897. 'setnb','setz','setnz','setna','setnbe','sets','setns','setp',
  898. 'setpe','setnp','setpo','setnge','setnl','setng','setnle',
  899. 'arpl','lar','lgdt','lidt','lldt','lmsw','lsl','ltr','sgdt',
  900. 'sidt','sldt','smsw','str','verr','verw','fabs','fbld','fbstp',
  901. 'fclex','fnclex','fcos','fdecstp','fdisi','fndisi','fdivr',
  902. 'feni','fneni','ffree','fiadd','ficom','ficomp','fidivr',
  903. 'fimul','fincstp','finit','fninit','fist','fistp','fisub',
  904. 'fisubr','fldcw','fldenv','fldlg2','fldln2','fldl2e','fldl2t',
  905. 'fldpi','flds','fldz','fnop','fpatan','fprem','fprem1','fptan',
  906. 'frndint','frstor','fsave','fnsave','fscale','fsetpm','fsin',
  907. 'fsincos','fsqrt','fst','fstcw','fnstcw','fstenv','fnstenv',
  908. 'fstsw','fnstsw','ftst','fucom','fucomp','fucompp','fwait',
  909. 'fxam','fxtract','fyl2x','fyl2xp1','f2xm1','fildq','filds',
  910. 'fildl','fldl','fldt','fistq','fists','fistl','fstl','fsts',
  911. 'fstps','fistpl','fstpl','fistps','fistpq','fstpt','fcomps',
  912. 'ficompl','fcompl','ficomps','fcoms','ficoml','fcoml','ficoms',
  913. 'fiaddl','faddl','fiadds','fisubl','fsubl','fisubs','fsubs',
  914. 'fsubr','fsubrs','fisubrl','fsubrl','fisubrs','fmuls','fimull',
  915. 'fmull','fimuls','fdivs','fidivl','fdivl','fidivs','fdivrs',
  916. 'fidivrl','fdivrl','fidivrs','repe','repne','cpuid','fadds','popfl',
  917. { mmx instructions supported by GNU AS v281 }
  918. 'emms','movd','movq','packssdw','packsswb','packuswb',
  919. 'paddb','paddd','paddsb','paddsw','paddusb','paddusw',
  920. 'paddw','pand','pandn','pcmpeqb','pcmpeqd','pcmpeqw',
  921. 'pcmpgtb','pcmpgtd','pcmpgtw','pmaddwd','pmulhw',
  922. 'pmullw','por','pslld','psllq','psllw','psrad','psraw',
  923. 'psrld','psrlq','psrlw','psubb','psubd','psubsb','psubsw',
  924. 'psubusb','psubusw','psubw','punpckhbw','punpckhdq',
  925. 'punpckhwd','punpcklbw','punpckldq','punpcklwd','pxor');
  926. { topsize = (S_NO,S_B,S_W,S_L,S_BW,S_BL,S_WL,
  927. S_IS,S_IL,S_IQ,S_FS,S_FL,S_FX,S_D); }
  928. att_opsize2str : array[topsize] of string[2] =
  929. ('','b','w','l','bw','bl','wl',
  930. 's','l','q','s','l','t','d');
  931. att_reg2str : array[tregister] of string[6] =
  932. ('','%eax','%ecx','%edx','%ebx','%esp','%ebp','%esi','%edi',
  933. '%ax','%cx','%dx','%bx','%sp','%bp','%si','%di',
  934. '%al','%cl','%dl','%bl','%ah','%ch','%bh','%dh',
  935. '','%cs','%ds','%es','%fs','%gs','%ss',
  936. '%st','%st(0)','%st(1)','%st(2)','%st(3)','%st(4)',
  937. '%st(5)','%st(6)','%st(7)',
  938. '%mm0','%mm1','%mm2','%mm3',
  939. '%mm4','%mm5','%mm6','%mm7');
  940. {$ifndef NOINTOP}
  941. int_op2str : array[firstop..lastop] of string[9] =
  942. ('mov','movzx','movsx','','add',
  943. 'call','idiv','imul','jmp','lea','mul','neg','not',
  944. 'pop','popad','push','pushad','ret','sub','xchg','xor',
  945. 'fild','cmp','jz','inc','dec','sete','setne','setl',
  946. 'setg','setle','setge','je','jne','jl','jg','jle','jge',
  947. 'or','fld','fadd','fmul','fsub','fdiv','fchs','fld1',
  948. 'fidiv','jnz','fstp','and','jno','','',
  949. 'enter','leave','cld','movs','rep','shl','shr','bound',
  950. 'jns','js','jo','sar','test',
  951. 'fcom','fcomp','fcompp','fxch','faddp','fmulp','fsubrp','fdivp',
  952. 'fnsts','sahf','fdivp','fsubp','setc','setnc','jc','jnc',
  953. 'ja','jae','jb','jbe','seta','setae','setb','setbe',
  954. 'aaa','aad','aam','aas','cbw','cdq','clc','cli',
  955. 'clts','cmc','cwd','cwde','daa','das','hlt','iret','lahf',
  956. 'lods','lock','nop','pusha','pushf','pushfd',
  957. 'stc','std','sti','stos','wait','xlat','xlatb','movsx',
  958. 'movsx','movsx','movsx','movsx','movzx','popa','in',
  959. 'out','lds','lcs','les','lfs','lgs','lss','popf','sbb','adc',
  960. 'div','ror','rol','rcl','rcr','sal','shld','shrd',
  961. 'call','jmp','ret','jnae','jnb','jna','jnbe','jb','jnp',
  962. 'jpe','jpo','jnge','jng','jnl','jnle','jcxz','jecxz',
  963. 'loop','cmps','ins','outs','scas','bsf','bsr','bt','btc',
  964. 'btr','bts','int','int3','into','bound','bound',
  965. 'loopz','loope','loopnz','loopne','seto','setno','setnae',
  966. 'setnb','setz','setnz','setna','setnbe','sets','setns','setp',
  967. 'setpe','setnp','setpo','setnge','setnl','setng','setnle',
  968. 'arpl','lar','lgdt','lidt','lldt','lmsw','lsl','ltr','sgdt',
  969. 'sidt','sldt','smsw','str','verr','verw','fabs','fbld','fbstp',
  970. 'fclex','fnclex','fcos','fdecstp','fdisi','fndisi','fdivr',
  971. 'feni','fneni','ffree','fiadd','ficom','ficomp','fidivr',
  972. 'fimul','fincstp','finit','fninit','fist','fistp','fisub',
  973. 'fisubr','fldcw','fldenv','fldlg2','fldln2','fldl2e','fldl2t',
  974. 'fldpi','flds','fldz','fnop','fpatan','fprem','fprem1','fptan',
  975. 'frndint','frstor','fsave','fnsave','fscale','fsetpm','fsin',
  976. 'fsincos','fsqrt','fst','fstcw','fnstcw','fstenv','fnstenv',
  977. 'fstsw','fnstsw','ftst','fucom','fucomp','fucompp','fwait',
  978. 'fxam','fxtract','fyl2x','fyl2xp1','f2xm1','fildq','filds',
  979. 'fildl','fldl','fldt','fistq','fists','fistl','fstl','fsts',
  980. 'fstps','fistpl','fstpl','fistps','fistpq','fstpt','fcomps',
  981. 'ficompl','fcompl','ficomps','fcoms','ficoml','fcoml','ficoms',
  982. 'fiadd','fadd','fiadd','fisub','fsub','fisub','fsub',
  983. 'fsubr','fsubr','fisubr','fsubr','fisubr','fmul','fimul',
  984. 'fmul','fimul','fdiv','fidiv','fdiv','fidiv','fdivr',
  985. 'fidivr','fdivr','fidivr','repe','repne','cpuid','fadd','popfd',
  986. { mmx instructions }
  987. 'emms','movd','movq','packssdw','packsswb','packuswb',
  988. 'paddb','paddd','paddsb','paddsw','paddusb','paddusw',
  989. 'paddw','pand','pandn','pcmpeqb','pcmpeqd','pcmpeqw',
  990. 'pcmpgtb','pcmpgtd','pcmpgtw','pmaddwd','pmulhw',
  991. 'pmullw','por','pslld','psllq','psllw','psrad','psraw',
  992. 'psrld','psrlq','psrlw','psubb','psubd','psubsb','psubsw',
  993. 'psubusb','psubusw','psubw','punpckhbw','punpckhdq',
  994. 'punpckhwd','punpcklbw','punpckldq','punpcklwd','pxor');
  995. int_reg2str : array[tregister] of string[5] =
  996. ('','eax','ecx','edx','ebx','esp','ebp','esi','edi',
  997. 'ax','cx','dx','bx','sp','bp','si','di',
  998. 'al','cl','dl','bl','ah','ch','bh','dh',
  999. '','cs','ds','es','fs','gs','ss',
  1000. 'st','st(0)','st(1)','st(2)','st(3)','st(4)','st(5)','st(6)','st(7)',
  1001. 'mm0','mm1','mm2','mm3','mm4','mm5','mm6','mm7');
  1002. int_nasmreg2str : array[tregister] of string[5] =
  1003. ('','eax','ecx','edx','ebx','esp','ebp','esi','edi',
  1004. 'ax','cx','dx','bx','sp','bp','si','di',
  1005. 'al','cl','dl','bl','ah','ch','bh','dh',
  1006. '','cs','ds','es','fs','gs','ss',
  1007. 'st0','st0','st1','st2','st3','st4','st5','st6','st7',
  1008. 'mm0','mm1','mm2','mm3','mm4','mm5','mm6','mm7');
  1009. {$endif}
  1010. implementation
  1011. uses
  1012. strings,globals,verbose;
  1013. function reg2str(r : tregister) : string;
  1014. const
  1015. a : array[R_NO..R_BL] of string[3] =
  1016. ('','EAX','ECX','EDX','EBX','ESP','EBP','ESI','EDI',
  1017. 'AX','CX','DX','BX','SP','BP','SI','DI',
  1018. 'AL','CL','DL','BL');
  1019. begin
  1020. reg2str:=a[r];
  1021. end;
  1022. procedure disposereference(var r : preference);
  1023. begin
  1024. if assigned(r^.symbol) then
  1025. stringdispose(r^.symbol);
  1026. dispose(r);
  1027. r:=nil;
  1028. end;
  1029. function newreference(const r : treference) : preference;
  1030. var
  1031. p : preference;
  1032. begin
  1033. new(p);
  1034. p^:=r;
  1035. if assigned(r.symbol) then
  1036. p^.symbol:=stringdup(r.symbol^);
  1037. newreference:=p;
  1038. end;
  1039. function reg8toreg16(reg : tregister) : tregister;
  1040. begin
  1041. reg8toreg16:=reg32toreg16(reg8toreg32(reg));
  1042. end;
  1043. function reg16toreg8(reg : tregister) : tregister;
  1044. begin
  1045. reg16toreg8:=reg32toreg8(reg16toreg32(reg));
  1046. end;
  1047. function reg16toreg32(reg : tregister) : tregister;
  1048. begin
  1049. reg16toreg32:=tregister(byte(reg)-byte(R_EDI));
  1050. end;
  1051. function reg32toreg16(reg : tregister) : tregister;
  1052. begin
  1053. reg32toreg16:=tregister(byte(reg)+byte(R_EDI));
  1054. end;
  1055. function reg32toreg8(reg : tregister) : tregister;
  1056. begin
  1057. reg32toreg8:=tregister(byte(reg)+byte(R_DI));
  1058. end;
  1059. function reg8toreg32(reg : tregister) : tregister;
  1060. begin
  1061. reg8toreg32:=tregister(byte(reg)-byte(R_DI));
  1062. end;
  1063. procedure reset_reference(var ref : treference);
  1064. begin
  1065. {$ifdef ver0_6}
  1066. ref.index:=R_NO;
  1067. ref.base:=R_NO;
  1068. ref.segment:=R_DEFAULT_SEG;
  1069. ref.offset:=0;
  1070. ref.scalefactor:=1;
  1071. ref.isintvalue:=false;
  1072. ref.symbol:=nil;
  1073. {$else}
  1074. with ref do
  1075. begin
  1076. index:=R_NO;
  1077. base:=R_NO;
  1078. segment:=R_DEFAULT_SEG;
  1079. offset:=0;
  1080. scalefactor:=1;
  1081. isintvalue:=false;
  1082. symbol:=nil;
  1083. end;
  1084. {$endif}
  1085. end;
  1086. function new_reference(base : tregister;offset : longint) : preference;
  1087. var
  1088. r : preference;
  1089. begin
  1090. new(r);
  1091. reset_reference(r^);
  1092. r^.base:=base;
  1093. r^.offset:=offset;
  1094. new_reference:=r;
  1095. end;
  1096. procedure clear_reference(var ref : treference);
  1097. begin
  1098. stringdispose(ref.symbol);
  1099. reset_reference(ref);
  1100. end;
  1101. function newcsymbol(const s : string;l : longint) : pcsymbol;
  1102. var
  1103. p : pcsymbol;
  1104. begin
  1105. new(p);
  1106. p^.symbol:=strpnew(s);
  1107. p^.offset:=l;
  1108. newcsymbol:=p;
  1109. end;
  1110. procedure disposecsymbol(p : pcsymbol);
  1111. begin
  1112. strdispose(p^.symbol);
  1113. dispose(p);
  1114. end;
  1115. {****************************************************************************
  1116. objects for register de/allocation
  1117. ****************************************************************************}
  1118. constructor tairegalloc.init(r : tregister);
  1119. begin
  1120. inherited init;
  1121. typ:=ait_regalloc;
  1122. reg:=r;
  1123. end;
  1124. constructor tairegdealloc.init(r : tregister);
  1125. begin
  1126. inherited init;
  1127. typ:=ait_regdealloc;
  1128. reg:=r;
  1129. end;
  1130. {****************************************************************************
  1131. TAI386
  1132. ****************************************************************************}
  1133. constructor tai386.op_none(op : tasmop;_size : topsize);
  1134. begin
  1135. inherited init;
  1136. typ:=ait_instruction;
  1137. _operator:=op;
  1138. opxt:=0;
  1139. size:=_size;
  1140. { the following isn't required ! }
  1141. op1:=nil;
  1142. op2:=nil;
  1143. end;
  1144. constructor tai386.op_reg(op : tasmop;_size : topsize;_op1 : tregister);
  1145. begin
  1146. inherited init;
  1147. typ:=ait_instruction;
  1148. _operator:=op;
  1149. opxt:=Top_reg;
  1150. size:=_size;
  1151. op1:=pointer(_op1);
  1152. op2:=nil;
  1153. end;
  1154. constructor tai386.op_const(op : tasmop;_size : topsize;_op1 : longint);
  1155. begin
  1156. inherited init;
  1157. typ:=ait_instruction;
  1158. _operator:=op;
  1159. opxt:=Top_const;
  1160. size:=_size;
  1161. op1:=pointer(_op1);
  1162. op2:=nil;
  1163. end;
  1164. constructor tai386.op_ref(op : tasmop;_size : topsize;_op1 : preference);
  1165. begin
  1166. inherited init;
  1167. typ:=ait_instruction;
  1168. _operator:=op;
  1169. size:=_size;
  1170. if _op1^.isintvalue then
  1171. begin
  1172. opxt:=top_const;
  1173. op1:=pointer(_op1^.offset);
  1174. disposereference(_op1);
  1175. end
  1176. else
  1177. begin
  1178. opxt:=top_ref;
  1179. op1:=pointer(_op1);
  1180. end;
  1181. op2:=nil;
  1182. end;
  1183. constructor tai386.op_loc(op : tasmop;_size : topsize;_op1 : tlocation);
  1184. begin
  1185. inherited init;
  1186. typ:=ait_instruction;
  1187. _operator:=op;
  1188. size:=_size;
  1189. if (_op1.loc=loc_register) or (_op1.loc=loc_cregister) then
  1190. begin
  1191. opxt:=top_reg;
  1192. op1:=pointer(_op1.register);
  1193. end
  1194. else
  1195. if _op1.reference.isintvalue then
  1196. begin
  1197. opxt:=top_const;
  1198. op1:=pointer(_op1.reference.offset);
  1199. end
  1200. else
  1201. begin
  1202. opxt:=top_ref;
  1203. op1:=pointer(newreference(_op1.reference));
  1204. end;
  1205. op2:=nil;
  1206. end;
  1207. constructor tai386.op_reg_reg(op : tasmop;_size : topsize;_op1,_op2 : tregister);
  1208. begin
  1209. inherited init;
  1210. typ:=ait_instruction;
  1211. _operator:=op;
  1212. opxt:=Top_reg shl 4+Top_reg;
  1213. size:=_size;
  1214. op1:=pointer(_op1);
  1215. op2:=pointer(_op2);
  1216. end;
  1217. type
  1218. twowords=record
  1219. word1,word2:word;
  1220. end;
  1221. constructor tai386.op_reg_reg_reg(op : tasmop;_size : topsize;_op1,_op2,_op3 : tregister);
  1222. begin
  1223. inherited init;
  1224. typ:=ait_instruction;
  1225. _operator:=op;
  1226. opxt:=Top_reg shl 8+Top_reg shl 4+Top_reg;
  1227. size:=_size;
  1228. op1:=pointer(_op1);
  1229. twowords(op2).word1:=word(_op2);
  1230. twowords(op2).word2:=word(_op3);
  1231. end;
  1232. constructor tai386.op_reg_ref(op : tasmop;_size : topsize;_op1 : tregister;_op2 : preference);
  1233. begin
  1234. inherited init;
  1235. typ:=ait_instruction;
  1236. _operator:=op;
  1237. opxt:=top_reg;
  1238. size:=_size;
  1239. op1:=pointer(_op1);
  1240. if _op2^.isintvalue then
  1241. begin
  1242. opxt:=opxt+top_const shl 4;
  1243. op2:=pointer(_op2^.offset);
  1244. disposereference(_op2);
  1245. end
  1246. else
  1247. begin
  1248. opxt:=opxt+top_ref shl 4;
  1249. op2:=pointer(_op2);
  1250. end;
  1251. end;
  1252. constructor tai386.op_reg_loc(op : tasmop;_size : topsize;_op1 : tregister;_op2 : tlocation);
  1253. begin
  1254. inherited init;
  1255. typ:=ait_instruction;
  1256. _operator:=op;
  1257. opxt:=top_reg;
  1258. size:=_size;
  1259. op1:=pointer(_op1);
  1260. if (_op2.loc=loc_register) or (_op2.loc=loc_cregister) then
  1261. begin
  1262. opxt:=opxt+top_reg shl 4;
  1263. op2:=pointer(_op2.register);
  1264. end
  1265. else
  1266. if _op2.reference.isintvalue then
  1267. begin
  1268. opxt:=opxt+top_const shl 4;
  1269. op2:=pointer(_op2.reference.offset);
  1270. end
  1271. else
  1272. begin
  1273. opxt:=opxt+Top_ref shl 4;
  1274. op2:=pointer(newreference(_op2.reference));
  1275. end;
  1276. end;
  1277. constructor tai386.op_loc_reg(op : tasmop;_size : topsize;_op1 : tlocation;_op2 : tregister);
  1278. begin
  1279. inherited init;
  1280. typ:=ait_instruction;
  1281. _operator:=op;
  1282. opxt:=top_reg shl 4;
  1283. size:=_size;
  1284. op2:=pointer(_op2);
  1285. if (_op1.loc=loc_register) or (_op1.loc=loc_cregister) then
  1286. begin
  1287. opxt:=opxt+top_reg;
  1288. op1:=pointer(_op1.register);
  1289. end
  1290. else
  1291. if _op1.reference.isintvalue then
  1292. begin
  1293. opxt:=opxt+top_const;
  1294. op1:=pointer(_op1.reference.offset);
  1295. end
  1296. else
  1297. begin
  1298. opxt:=opxt+top_ref;
  1299. op1:=pointer(newreference(_op1.reference));
  1300. end;
  1301. end;
  1302. constructor tai386.op_const_reg_reg(op : tasmop;_size : topsize;_op1 : longint;_op2 : tregister;_op3 : tregister);
  1303. begin
  1304. inherited init;
  1305. typ:=ait_instruction;
  1306. _operator:=op;
  1307. opxt:=Top_const+Top_reg shl 4+Top_reg shl 8;
  1308. size:=_size;
  1309. op1:=pointer(_op1);
  1310. twowords(op2).word1:=word(_op2);
  1311. twowords(op2).word2:=word(_op3);
  1312. end;
  1313. constructor tai386.op_const_reg(op : tasmop;_size : topsize;_op1 : longint;_op2 : tregister);
  1314. begin
  1315. inherited init;
  1316. typ:=ait_instruction;
  1317. _operator:=op;
  1318. if ((op=A_CMP) or (op=A_AND) or (op=A_ADD) or
  1319. (op=A_ADC) or (op=A_SUB) or (op=A_SBB)) and
  1320. ((_size=S_B) or (_size=S_BW) or (_size=S_BL)) and
  1321. ((_op2<R_AL) or (_op2>R_DH)) and
  1322. (_op1>127) then
  1323. begin
  1324. {$ifdef extdebug}
  1325. comment(v_warning,'wrong size for instruction due to implicit size extension !!');
  1326. {$endif extdebug}
  1327. if _size=S_BW then
  1328. _size:=S_W
  1329. else
  1330. _size:=S_L;
  1331. end;
  1332. opxt:=Top_const+Top_reg shl 4;
  1333. size:=_size;
  1334. op1:=pointer(_op1);
  1335. op2:=pointer(_op2);
  1336. end;
  1337. constructor tai386.op_const_const(op : tasmop;_size : topsize;_op1,_op2 : longint);
  1338. begin
  1339. inherited init;
  1340. typ:=ait_instruction;
  1341. _operator:=op;
  1342. opxt:=Top_const+Top_const shl 4;
  1343. size:=_size;
  1344. op1:=pointer(_op1);
  1345. op2:=pointer(_op2);
  1346. end;
  1347. constructor tai386.op_const_ref(op : tasmop;_size : topsize;_op1 : longint;_op2 : preference);
  1348. begin
  1349. inherited init;
  1350. typ:=ait_instruction;
  1351. _operator:=op;
  1352. opxt:=top_const;
  1353. size:=_size;
  1354. op1:=pointer(_op1);
  1355. if _op2^.isintvalue then
  1356. begin
  1357. opxt:=opxt+top_const shl 4;
  1358. op2:=pointer(_op2^.offset);
  1359. disposereference(_op2);
  1360. end
  1361. else
  1362. begin
  1363. opxt:=opxt+top_ref shl 4;
  1364. op2:=pointer(_op2);
  1365. end;
  1366. end;
  1367. constructor tai386.op_const_loc(op : tasmop;_size : topsize;_op1 : longint;_op2 : tlocation);
  1368. begin
  1369. inherited init;
  1370. typ:=ait_instruction;
  1371. _operator:=op;
  1372. opxt:=top_const;
  1373. size:=_size;
  1374. op1:=pointer(_op1);
  1375. if (_op2.loc=loc_register) or (_op2.loc=loc_cregister) then
  1376. begin
  1377. opxt:=opxt+Top_reg shl 4;
  1378. op2:=pointer(_op2.register);
  1379. end
  1380. else
  1381. if _op2.reference.isintvalue then
  1382. begin
  1383. opxt:=opxt+top_const shl 4;
  1384. op2:=pointer(_op2.reference.offset);
  1385. end
  1386. else
  1387. begin
  1388. opxt:=opxt+top_ref shl 4;
  1389. op2:=pointer(newreference(_op2.reference));
  1390. end;
  1391. end;
  1392. constructor tai386.op_ref_reg(op : tasmop;_size : topsize;_op1 : preference;_op2 : tregister);
  1393. begin
  1394. inherited init;
  1395. typ:=ait_instruction;
  1396. _operator:=op;
  1397. opxt:=top_reg shl 4;
  1398. size:=_size;
  1399. op2:=pointer(_op2);
  1400. if _op1^.isintvalue then
  1401. begin
  1402. opxt:=opxt+top_const;
  1403. op1:=pointer(_op1^.offset);
  1404. disposereference(_op1);
  1405. end
  1406. else
  1407. begin
  1408. opxt:=opxt+top_ref;
  1409. op1:=pointer(_op1);
  1410. end;
  1411. end;
  1412. constructor tai386.op_ref_ref(op : tasmop;_size : topsize;_op1,_op2 : preference);
  1413. begin
  1414. inherited init;
  1415. typ:=ait_instruction;
  1416. _operator:=op;
  1417. size:=_size;
  1418. if _op1^.isintvalue then
  1419. begin
  1420. opxt:=top_const;
  1421. op1:=pointer(_op1^.offset);
  1422. disposereference(_op1);
  1423. end
  1424. else
  1425. begin
  1426. opxt:=top_ref;
  1427. op1:=pointer(_op1);
  1428. end;
  1429. if _op2^.isintvalue then
  1430. begin
  1431. opxt:=opxt+top_const shl 4;
  1432. op2:=pointer(_op2^.offset);
  1433. disposereference(_op2);
  1434. end
  1435. else
  1436. begin
  1437. opxt:=opxt+top_ref shl 4;
  1438. op2:=pointer(_op2);
  1439. end;
  1440. end;
  1441. constructor tai386.op_csymbol(op : tasmop;_size : topsize;_op1 : pcsymbol);
  1442. begin
  1443. inherited init;
  1444. typ:=ait_instruction;
  1445. _operator:=op;
  1446. if (op=A_CALL) and (use_esp_stackframe) then
  1447. Message(cg_e_stackframe_with_esp);
  1448. opxt:=top_symbol;
  1449. size:=_size;
  1450. op1:=pointer(_op1);
  1451. op2:=nil;
  1452. end;
  1453. constructor tai386.op_csymbol_reg(op : tasmop;_size : topsize;_op1 : pcsymbol;_op2 : tregister);
  1454. begin
  1455. inherited init;
  1456. typ:=ait_instruction;
  1457. _operator:=op;
  1458. opxt:=Top_symbol+Top_reg shl 4;
  1459. size:=_size;
  1460. op1:=pointer(_op1);
  1461. op2:=pointer(_op2);
  1462. end;
  1463. constructor tai386.op_csymbol_ref(op : tasmop;_size : topsize;_op1 : pcsymbol;_op2 : preference);
  1464. begin
  1465. inherited init;
  1466. typ:=ait_instruction;
  1467. _operator:=op;
  1468. opxt:=top_symbol;
  1469. size:=_size;
  1470. op1:=pointer(_op1);
  1471. if _op2^.isintvalue then
  1472. begin
  1473. opxt:=opxt+top_const shl 4;
  1474. op2:=pointer(_op2^.offset);
  1475. disposereference(_op2);
  1476. end
  1477. else
  1478. begin
  1479. opxt:=opxt+top_ref shl 4;
  1480. op2:=pointer(_op2);
  1481. end;
  1482. end;
  1483. constructor tai386.op_csymbol_loc(op : tasmop;_size : topsize;_op1 : pcsymbol;_op2 : tlocation);
  1484. begin
  1485. inherited init;
  1486. typ:=ait_instruction;
  1487. _operator:=op;
  1488. opxt:=top_symbol;
  1489. size:=_size;
  1490. op1:=pointer(_op1);
  1491. if (_op2.loc=loc_register) or (_op2.loc=loc_cregister) then
  1492. begin
  1493. opxt:=top_reg shl 4;
  1494. op2:=pointer(_op2.register);
  1495. end
  1496. else
  1497. if _op2.reference.isintvalue then
  1498. begin
  1499. opxt:=opxt+top_const shl 4;
  1500. op2:=pointer(_op2.reference.offset);
  1501. end
  1502. else
  1503. begin
  1504. opxt:=opxt+top_ref shl 4;
  1505. op2:=pointer(newreference(_op2.reference));
  1506. end;
  1507. end;
  1508. constructor tai386.op_reg_const(op:tasmop; _size: topsize; _op1: tregister; _op2: longint);
  1509. begin
  1510. inherited init;
  1511. typ:=ait_instruction;
  1512. _operator:=op;
  1513. opxt:=top_reg+top_const shl 4;
  1514. size:=_size;
  1515. op1:=pointer(_op1);
  1516. op2:=pointer(_op2);
  1517. end;
  1518. function Tai386.op1t:byte;
  1519. begin
  1520. op1t:=opxt and 15;
  1521. end;
  1522. function Tai386.op2t:byte;
  1523. begin
  1524. op2t:=(opxt shr 4) and 15;
  1525. end;
  1526. function Tai386.op3t:byte;
  1527. begin
  1528. op3t:=(opxt shr 8) and 15;
  1529. end;
  1530. destructor tai386.done;
  1531. begin
  1532. if op1t=top_symbol then
  1533. disposecsymbol(pcsymbol(op1))
  1534. else if op1t=top_ref then
  1535. begin
  1536. clear_reference(preference(op1)^);
  1537. dispose(preference(op1));
  1538. end;
  1539. if op2t=top_symbol then
  1540. disposecsymbol(pcsymbol(op2))
  1541. else if op2t=top_ref then
  1542. begin
  1543. clear_reference(preference(op2)^);
  1544. dispose(preference(op2));
  1545. end;
  1546. inherited done;
  1547. end;
  1548. {****************************************************************************
  1549. TAI_LABELED
  1550. ****************************************************************************}
  1551. constructor tai_labeled.init(op : tasmop; l : plabel);
  1552. begin
  1553. inherited init;
  1554. typ:=ait_labeled_instruction;
  1555. _operator:=op;
  1556. lab:=l;
  1557. lab^.is_used:=true;
  1558. inc(lab^.refcount);
  1559. end;
  1560. destructor tai_labeled.done;
  1561. begin
  1562. dec(lab^.refcount);
  1563. if lab^.refcount=0 then
  1564. Begin
  1565. lab^.is_used := False;
  1566. If Not(lab^.is_set) Then
  1567. Dispose(lab);
  1568. End;
  1569. inherited done;
  1570. end;
  1571. end.
  1572. {
  1573. $Log$
  1574. Revision 1.25 1998-12-28 15:49:03 peter
  1575. * no it table necessary if no asm parser is used
  1576. Revision 1.24 1998/12/20 16:21:24 peter
  1577. * smartlinking doesn't crash anymore
  1578. Revision 1.23 1998/12/19 00:23:49 florian
  1579. * ansistring memory leaks fixed
  1580. Revision 1.22 1998/12/18 17:24:51 peter
  1581. * don't include intel list if not necessary
  1582. Revision 1.20 1998/12/11 16:10:09 florian
  1583. + shifting for 64 bit ints added
  1584. * bug in getexplicitregister32 fixed: usableregs wasn't decremented !!
  1585. Revision 1.19 1998/12/10 09:47:22 florian
  1586. + basic operations with int64/qord (compiler with -dint64)
  1587. + rtti of enumerations extended: names are now written
  1588. Revision 1.18 1998/11/26 21:45:30 jonas
  1589. - removed A_CLTD opcode (use A_CDQ instead)
  1590. * changed cbw, cwde and cwd to cbtw, cwtl and cwtd in att_op2str array
  1591. * in daopt386: adapted AsmInstr array to reflect changes + fixed line too long
  1592. Revision 1.17 1998/11/13 15:40:19 pierre
  1593. + added -Se in Makefile cvstest target
  1594. + lexlevel cleanup
  1595. normal_function_level main_program_level and unit_init_level defined
  1596. * tins_cache grown to A_EMMS (gave range check error in asm readers)
  1597. (test added in code !)
  1598. * -Un option was wrong
  1599. * _FAIL and _SELF only keyword inside
  1600. constructors and methods respectively
  1601. Revision 1.16 1998/11/13 10:13:46 peter
  1602. + cpuid,emms support for asm readers
  1603. Revision 1.15 1998/11/05 23:48:20 peter
  1604. * recordtype.field support in constant expressions
  1605. * fixed imul for oa_imm8 which was not allowed
  1606. * fixed reading of local typed constants
  1607. * fixed comment reading which is not any longer a separator
  1608. Revision 1.14 1998/10/28 00:08:47 peter
  1609. + leal procsym,eax is now allowed
  1610. + constants are now handled also when starting an expression
  1611. + call *pointer is now allowed
  1612. Revision 1.13 1998/10/14 08:47:17 pierre
  1613. * bugs in secondfuncret for result in subprocedures removed
  1614. Revision 1.12 1998/10/08 17:17:20 pierre
  1615. * current_module old scanner tagged as invalid if unit is recompiled
  1616. + added ppheap for better info on tracegetmem of heaptrc
  1617. (adds line column and file index)
  1618. * several memory leaks removed ith help of heaptrc !!
  1619. Revision 1.11 1998/09/20 17:11:23 jonas
  1620. * released REGALLOC
  1621. Revision 1.10 1998/09/14 21:30:45 peter
  1622. * added inherited done
  1623. Revision 1.9 1998/06/04 23:51:41 peter
  1624. * m68k compiles
  1625. + .def file creation moved to gendef.pas so it could also be used
  1626. for win32
  1627. Revision 1.8 1998/05/23 01:21:09 peter
  1628. + aktasmmode, aktoptprocessor, aktoutputformat
  1629. + smartlink per module $SMARTLINK-/+ (like MMX) and moved to aktswitches
  1630. + $LIBNAME to set the library name where the unit will be put in
  1631. * splitted cgi386 a bit (codeseg to large for bp7)
  1632. * nasm, tasm works again. nasm moved to ag386nsm.pas
  1633. Revision 1.7 1998/05/20 09:42:34 pierre
  1634. + UseTokenInfo now default
  1635. * unit in interface uses and implementation uses gives error now
  1636. * only one error for unknown symbol (uses lastsymknown boolean)
  1637. the problem came from the label code !
  1638. + first inlined procedures and function work
  1639. (warning there might be allowed cases were the result is still wrong !!)
  1640. * UseBrower updated gives a global list of all position of all used symbols
  1641. with switch -gb
  1642. Revision 1.6 1998/05/04 17:54:25 peter
  1643. + smartlinking works (only case jumptable left todo)
  1644. * redesign of systems.pas to support assemblers and linkers
  1645. + Unitname is now also in the PPU-file, increased version to 14
  1646. Revision 1.5 1998/04/29 10:33:53 pierre
  1647. + added some code for ansistring (not complete nor working yet)
  1648. * corrected operator overloading
  1649. * corrected nasm output
  1650. + started inline procedures
  1651. + added starstarn : use ** for exponentiation (^ gave problems)
  1652. + started UseTokenInfo cond to get accurate positions
  1653. Revision 1.4 1998/04/09 15:46:38 florian
  1654. + register allocation tracing stuff added
  1655. Revision 1.3 1998/04/08 16:58:02 pierre
  1656. * several bugfixes
  1657. ADD ADC and AND are also sign extended
  1658. nasm output OK (program still crashes at end
  1659. and creates wrong assembler files !!)
  1660. procsym types sym in tdef removed !!
  1661. Revision 1.2 1998/04/04 05:29:57 carl
  1662. * bugfix of crash with ins_cache and popfd
  1663. * bugfix of pushfd typo mistake in att output
  1664. + added setc, and setnc
  1665. }