i386.pas 89 KB

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