i386.pas 86 KB

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