i386.pas 99 KB

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