i386.pas 104 KB

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