i386.pas 87 KB

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