m68k.pas 59 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723
  1. {
  2. $Id$
  3. Copyright (c) 1995-98 by Florian Klaempfl, Carl Eric Codere
  4. This unit implements an types and classes specific for the
  5. MC68000/MC68020
  6. This program is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 2 of the License, or
  9. (at your option) any later version.
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. GNU General Public License for more details.
  14. You should have received a copy of the GNU General Public License
  15. along with this program; if not, write to the Free Software
  16. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. ****************************************************************************
  18. }
  19. unit m68k;
  20. interface
  21. uses
  22. strings,systems,cobjects,globals,aasm,verbose;
  23. const
  24. { if real fpu is used }
  25. { otherwise maps to }
  26. { s32real. }
  27. extended_size = 12;
  28. type
  29. { warning: CPU32 opcodes are not fully compatible with the MC68020. }
  30. { 68000 only opcodes }
  31. tasmop = (A_ABCD,
  32. A_ADD,A_ADDA,A_ADDI,A_ADDQ,A_ADDX,A_AND,A_ANDI,
  33. A_ASL,A_ASR,A_BCC,A_BCS,A_BEQ,A_BGE,A_BGT,A_BHI,
  34. A_BLE,A_BLS,A_BLT,A_BMI,A_BNE,A_BPL,A_BVC,A_BVS,
  35. A_BCHG,A_BCLR,A_BRA,A_BSET,A_BSR,A_BTST,A_CHK,
  36. A_CLR,A_CMP,A_CMPA,A_CMPI,A_CMPM,A_DBCC,A_DBCS,A_DBEQ,A_DBGE,
  37. A_DBGT,A_DBHI,A_DBLE,A_DBLS,A_DBLT,A_DBMI,A_DBNE,A_DBRA,
  38. A_DBPL,A_DBT,A_DBVC,A_DBVS,A_DBF,A_DIVS,A_DIVU,
  39. A_EOR,A_EORI,A_EXG,A_ILLEGAL,A_EXT,A_JMP,A_JSR,
  40. A_LEA,A_LINK,A_LSL,A_LSR,A_MOVE,A_MOVEA,A_MOVEI,A_MOVEQ,
  41. A_MOVEM,A_MOVEP,A_MULS,A_MULU,A_NBCD,A_NEG,A_NEGX,
  42. A_NOP,A_NOT,A_OR,A_ORI,A_PEA,A_ROL,A_ROR,A_ROXL,
  43. A_ROXR,A_RTR,A_RTS,A_SBCD,A_SCC,A_SCS,A_SEQ,A_SGE,
  44. A_SGT,A_SHI,A_SLE,A_SLS,A_SLT,A_SMI,A_SNE,
  45. A_SPL,A_ST,A_SVC,A_SVS,A_SF,A_SUB,A_SUBA,A_SUBI,A_SUBQ,
  46. A_SUBX,A_SWAP,A_TAS,A_TRAP,A_TRAPV,A_TST,A_UNLK,
  47. A_RTE,A_RESET,A_STOP,
  48. { MC68010 instructions }
  49. A_BKPT,A_MOVEC,A_MOVES,A_RTD,
  50. { MC68020 instructions }
  51. A_BFCHG,A_BFCLR,A_BFEXTS,A_BFEXTU,A_BFFFO,
  52. A_BFINS,A_BFSET,A_BFTST,A_CALLM,A_CAS,A_CAS2,
  53. A_CHK2,A_CMP2,A_DIVSL,A_DIVUL,A_EXTB,A_PACK,A_RTM,
  54. A_TRAPCC,A_TRACS,A_TRAPEQ,A_TRAPF,A_TRAPGE,A_TRAPGT,
  55. A_TRAPHI,A_TRAPLE,A_TRAPLS,A_TRAPLT,A_TRAPMI,A_TRAPNE,
  56. A_TRAPPL,A_TRAPT,A_TRAPVC,A_TRAPVS,A_UNPK,
  57. { FPU Processor instructions - directly supported only. }
  58. { IEEE aware and misc. condition codes not supported }
  59. A_FABS,A_FADD,
  60. A_FBEQ,A_FBNE,A_FBNGT,A_FBGT,A_FBGE,A_FBNGE,
  61. A_FBLT,A_FBNLT,A_FBLE,A_FBGL,A_FBNGL,A_FBGLE,A_FBNGLE,
  62. A_FDBEQ,A_FDBNE,A_FDBGT,A_FDBNGT,A_FDBGE,A_FDBNGE,
  63. A_FDBLT,A_FDBNLT,A_FDBLE,A_FDBGL,A_FDBNGL,A_FDBGLE,A_FBDNGLE,
  64. A_FSEQ,A_FSNE,A_FSGT,A_FSNGT,A_FSGE,A_FSNGE,
  65. A_FSLT,A_FSNLT,A_FSLE,A_FSGL,A_FSNGL,A_FSGLE,A_FSNGLE,
  66. A_FCMP,A_FDIV,A_FMOVE,A_FMOVEM,
  67. A_FMUL,A_FNEG,A_FNOP,A_FSQRT,A_FSUB,A_FSGLDIV,
  68. A_FSFLMUL,A_FTST,
  69. A_FTRAPEQ,A_FTRAPNE,A_FTRAPGT,A_FTRAPNGT,A_FTRAPGE,A_FTRAPNGE,
  70. A_FTRAPLT,A_FTRAPNLT,A_FTRAPLE,A_FTRAPGL,A_FTRAPNGL,A_FTRAPGLE,A_FTRAPNGLE,
  71. { Protected instructions }
  72. A_CPRESTORE,A_CPSAVE,
  73. { FPU Unit protected instructions }
  74. { and 68030/68851 common MMU instructions }
  75. { (this may include 68040 MMU instructions) }
  76. A_FRESTORE,A_FSAVE,A_PFLUSH,A_PFLUSHA,A_PLOAD,A_PMOVE,A_PTEST,
  77. { Useful for assembly langage output }
  78. A_LABEL,A_NONE);
  79. { enumeration for registers, don't change the }
  80. { order of this table }
  81. { Registers which can and will be used by the compiler }
  82. tregister = (
  83. R_NO,R_D0,R_D1,R_D2,R_D3,R_D4,R_D5,R_D6,R_D7,
  84. R_A0,R_A1,R_A2,R_A3,R_A4,R_A5,R_A6,R_SP,
  85. { PUSH/PULL- quick and dirty hack }
  86. R_SPPUSH,R_SPPULL,
  87. { misc. }
  88. R_CCR,R_FP0,R_FP1,R_FP2,R_FP3,R_FP4,R_FP5,R_FP6,
  89. R_FP7,R_FPCR,R_SR,R_SSP,R_DFC,R_SFC,R_VBR,R_FPSR,
  90. { other - not used in reg2str }
  91. R_DEFAULT_SEG);
  92. { S_NO = No Size of operand }
  93. { S_B = Byte size operand }
  94. { S_W = Word size operand }
  95. { S_L = DWord size operand }
  96. { USED FOR conversions in x86}
  97. { S_BW = Byte to word }
  98. { S_BL = Byte to long }
  99. { S_WL = Word to long }
  100. { Floating point types }
  101. { S_X = Extended type }
  102. { S_Q = double/64bit integer }
  103. { S_S = single type (32 bit) }
  104. topsize = (S_NO,S_B,S_W,S_L,S_BW,S_BL,S_WL,S_Q,S_S,S_X);
  105. plocation = ^tlocation;
  106. { information about the location of an operand }
  107. { LOC_FPU FPU registers = Dn if emulation }
  108. { LOC_REGISTER in a processor register }
  109. { LOC_MEM in the memory }
  110. { LOC_REFERENCE like LOC_MEM, but lvalue }
  111. { LOC_JUMP nur bool'sche Resultate, Sprung zu false- oder }
  112. { truelabel }
  113. { LOC_FLAGS nur bool'sche Rsultate, Flags sind gesetzt }
  114. { LOC_CREGISTER register which shouldn't be modified }
  115. { LOC_INVALID added for tracking problems}
  116. tloc = (LOC_INVALID,LOC_FPU,LOC_REGISTER,LOC_MEM,LOC_REFERENCE,LOC_JUMP,
  117. LOC_FLAGS,LOC_CREGISTER);
  118. tregisterlist = set of tregister;
  119. { F_E = Equal
  120. F_NE = Not Equal
  121. F_G = Greater then
  122. F_L = Less then
  123. F_GE = Greater or equal then
  124. F_LE = Less or equal then
  125. F_C = Carry
  126. F_NC = Not Carry
  127. F_A = Above
  128. F_AE = Above or Equal
  129. F_B = Below
  130. F_BE = Below or Equal
  131. other flags:
  132. FL_xxx = floating type flags .
  133. }
  134. tresflags = (F_E,F_NE,F_G,F_L,F_GE,F_LE,F_C,F_NC,
  135. F_A,F_AE,F_B,F_BE);
  136. { floating type flags used by FBCC are auotmatically converted }
  137. { to standard condition codes }
  138. { FL_E,FL_NE,FL_A,FL_AE,FL_B,FL_BE);}
  139. preference = ^treference;
  140. { direction of address register : }
  141. { (An) (An)+ -(An) }
  142. tdirection = (dir_none,dir_inc,dir_dec);
  143. treference = record
  144. base,segment,index : tregister;
  145. offset : longint;
  146. symbol : pstring;
  147. { indexed increment and decrement mode }
  148. { (An)+ and -(An) }
  149. direction : tdirection;
  150. { a constant is also a treference, this makes the code generator }
  151. { easier }
  152. isintvalue : boolean;
  153. scalefactor : byte;
  154. end;
  155. tlocation = record
  156. case loc : tloc of
  157. { segment in reference at the same place as in loc_register }
  158. LOC_REGISTER,LOC_CREGISTER : (register,segment : tregister);
  159. LOC_MEM,LOC_REFERENCE : (reference : treference);
  160. LOC_FPU : (fpureg:tregister);
  161. LOC_JUMP : ();
  162. LOC_FLAGS : (resflags : tresflags);
  163. LOC_INVALID : ();
  164. end;
  165. pcsymbol = ^tcsymbol;
  166. tcsymbol = record
  167. symbol : pchar;
  168. offset : longint;
  169. end;
  170. const
  171. {----------------------------------------------------------------------}
  172. { F_E = Equal }
  173. { F_NE = Not Equal }
  174. { F_G = Greater then }
  175. { F_L = Less then }
  176. { F_GE = Greater or equal then }
  177. { F_LE = Less or equal then }
  178. { F_C = Carry = C }
  179. { F_NC = Not Carry = not C }
  180. { F_A = Above = not C and not Z }
  181. { F_AE = Above or Equal = not C }
  182. { F_B = Below = C }
  183. { F_BE = Below or Equal = C or Z }
  184. { FL_E = Floating point equal = Z }
  185. { FL_NE = Floating point Not equal = not Z }
  186. { FL_A = Floating point above = }
  187. { FL_AE = Floating point above or equal = }
  188. { FL_B = Floating point below = }
  189. { FL_BE = Floating point below or equal = }
  190. { THE ORDER OF THIS TABLE SHOULD NOT BE CHANGED! }
  191. flag_2_jmp: array[F_E..F_BE] of tasmop =
  192. (A_BEQ,A_BNE,A_BGT,A_BLT,A_BGE,A_BLE,A_BCS,A_BCC,
  193. A_BHI,A_BCC,A_BCS,A_BLS);
  194. { floating point jumps - CURRENTLY NOT USED }
  195. { A_FBEQ,A_FBNE,A_FBGT,A_FBGE,A_FBLT,A_FBLE); }
  196. { don't change the order of this table, it is related to }
  197. { the flags table. }
  198. flag_2_set: array[F_E..F_BE] of tasmop =
  199. (A_SEQ,A_SNE,A_SGT,A_SLT,A_SGE,A_SLE,A_SCS,A_SCC,
  200. A_SHI,A_SCC,A_SCS,A_SLS);
  201. { operand types }
  202. top_none = 0;
  203. top_reg = 1;
  204. top_ref = 2;
  205. top_reglist = 5;
  206. { a constant can be also written as treference }
  207. top_const = 3;
  208. { this is for calls }
  209. top_symbol = 4;
  210. {This constant is an alias for the stack pointer, as it's name may
  211. differ from processor to processor.}
  212. stack_pointer = R_SP;
  213. frame_pointer = R_A6;
  214. {This constant is an alias for the accumulator, as it's name may
  215. differ from processor to processor.}
  216. accumulator = R_D0;
  217. type
  218. pai_extended = ^tai_extended;
  219. { generates an extended - processor specific }
  220. tai_extended = object(tai)
  221. value : bestreal;
  222. constructor init(_value : bestreal);
  223. end;
  224. pai_comp = ^tai_comp;
  225. { generates a comp - processor specific }
  226. tai_comp = object(tai)
  227. value : bestreal;
  228. constructor init(_value : bestreal);
  229. end;
  230. pai_labeled = ^tai_labeled;
  231. tai_labeled = object(tai)
  232. _operator : tasmop;
  233. _op1: tregister;
  234. lab : plabel;
  235. constructor init(op : tasmop; l : plabel);
  236. constructor init_reg(op: tasmop; l : plabel; reg: tregister);
  237. destructor done;virtual;
  238. end;
  239. pai68k = ^tai68k;
  240. tai68k = object(tai)
  241. { this isn't a proper style, but not very memory expensive }
  242. op1,op2,op3 : pointer;
  243. _operator : tasmop;
  244. op1t,op2t,op3t : byte;
  245. size : topsize;
  246. reglist: set of tregister;
  247. constructor op_none(op : tasmop;_size : topsize);
  248. constructor op_reg(op : tasmop;_size : topsize;_op1 : tregister);
  249. constructor op_const(op : tasmop;_size : topsize;_op1 : longint);
  250. constructor op_ref(op : tasmop;_size : topsize;_op1 : preference);
  251. constructor op_loc(op : tasmop;_size : topsize;_op1 : tlocation);
  252. constructor op_reg_reg(op : tasmop;_size : topsize;_op1,_op2 : tregister);
  253. constructor op_reg_ref(op : tasmop;_size : topsize;_op1 : tregister;_op2 : preference);
  254. constructor op_reg_loc(op : tasmop;_size : topsize;_op1 : tregister;_op2 : tlocation);
  255. constructor op_loc_reg(op : tasmop;_size : topsize;_op1 : tlocation;_op2 : tregister);
  256. constructor op_const_reg(op : tasmop;_size : topsize;_op1 : longint;_op2 : tregister);
  257. { this combination is needed by ENTER }
  258. constructor op_const_const(op : tasmop;_size : topsize;_op1,_op2 : longint);
  259. constructor op_const_ref(op : tasmop;_size : topsize;_op1 : longint;_op2 : preference);
  260. constructor op_const_loc(op : tasmop;_size : topsize;_op1 : longint;_op2 : tlocation);
  261. constructor op_ref_reg(op : tasmop;_size : topsize;_op1 : preference;_op2 : tregister);
  262. { this is only allowed if _op1 is an int value (_op1^.isintvalue=true) }
  263. constructor op_ref_ref(op : tasmop;_size : topsize;_op1,_op2 : preference);
  264. {
  265. constructor op_ref_loc(op : tasmop;_size : topsize;_op1 : preference;_op2 : tlcation);}
  266. constructor op_const_reg_reg(op : tasmop;_size : topsize;_op1 : longint;_op2 : tregister;_op3 : tregister);
  267. { used by MC68020 mul/div }
  268. constructor op_reg_reg_Reg(op: tasmop;_size: topsize;_op1: tregister; _op2: tregister; _op3: tregister);
  269. { used by link }
  270. constructor op_reg_const(op: tasmop; _size: topsize; _op1: tregister; _op2: longint);
  271. { this is for CALL etc. }
  272. { symbol is replaced by the address of symbol }
  273. { so op_csymbol(A_PUSH,S_L,strnew('P')); generates }
  274. { an instruction which pushes the address of P }
  275. { to the stack }
  276. constructor op_csymbol(op : tasmop;_size : topsize;_op1 : pcsymbol);
  277. constructor op_csymbol_reg(op : tasmop;_size : topsize;_op1 : pcsymbol;_op2 : tregister);
  278. constructor op_csymbol_ref(op : tasmop;_size : topsize;_op1 : pcsymbol;_op2 : preference);
  279. constructor op_csymbol_loc(op : tasmop;_size : topsize;_op1 : pcsymbol;_op2 : tlocation);
  280. constructor op_ref_reglist(op: tasmop; _size : topsize; _op1: preference;_op2: tregisterlist);
  281. constructor op_reglist_ref(op: tasmop; _size : topsize; _op1: tregisterlist; _op2: preference);
  282. destructor done;virtual;
  283. end;
  284. const
  285. ait_bestreal = ait_real_64bit;
  286. type
  287. pai_bestreal = pai_double;
  288. tai_bestreal = tai_double;
  289. const
  290. maxvarregs = 5;
  291. varregs : array[1..maxvarregs] of tregister =
  292. (R_D2,R_D3,R_D4,R_D5,R_D7);
  293. nextlabelnr : longint = 1;
  294. { resets all values of ref to defaults }
  295. procedure reset_reference(var ref : treference);
  296. { same as reset_reference, but symbol is disposed }
  297. { use this only for already used references }
  298. procedure clear_reference(var ref : treference);
  299. { make l as a new label }
  300. procedure getlabel(var l : plabel);
  301. { frees the label if unused }
  302. procedure freelabel(var l : plabel);
  303. { make a new zero label }
  304. procedure getzerolabel(var l : plabel);
  305. { reset a label to a zero label }
  306. procedure setzerolabel(var l : plabel);
  307. {just get a label number }
  308. procedure getlabelnr(var l : longint);
  309. function newreference(const r : treference) : preference;
  310. function reg2str(r : tregister) : string;
  311. { generates an help record for constants }
  312. function newcsymbol(const s : string;l : longint) : pcsymbol;
  313. function lab2str(l : plabel) : string;
  314. const
  315. ao_unknown = $0;
  316. { 8 bit reg }
  317. ao_reg8 = $1;
  318. { 16 bit reg }
  319. ao_reg16 = $2;
  320. { 32 bit reg }
  321. ao_reg32 = $4;
  322. ao_reg = (ao_reg8 or ao_reg16 or ao_reg32);
  323. { for push/pop operands }
  324. ao_wordreg = (ao_reg16 or ao_reg32);
  325. ao_imm8 = $8; { 8 bit immediate }
  326. ao_imm8S = $10; { 8 bit immediate sign extended }
  327. ao_imm16 = $20; { 16 bit immediate }
  328. ao_imm32 = $40; { 32 bit immediate }
  329. ao_imm1 = $80; { 1 bit immediate }
  330. { for unknown expressions }
  331. ao_immunknown = ao_imm32;
  332. { gen'l immediate }
  333. ao_imm = (ao_imm8 or ao_imm8S or ao_imm16 or ao_imm32);
  334. ao_disp8 = $200; { 8 bit displacement (for jumps) }
  335. ao_disp16 = $400; { 16 bit displacement }
  336. ao_disp32 = $800; { 32 bit displacement }
  337. { general displacement }
  338. ao_disp = (ao_disp8 or ao_disp16 or ao_disp32);
  339. { for unknown size displacements }
  340. ao_dispunknown = ao_disp32;
  341. ao_mem8 = $1000;
  342. ao_mem16 = $2000;
  343. ao_mem32 = $4000;
  344. ao_baseindex = $8000;
  345. { general mem }
  346. ao_mem = (ao_disp or ao_mem8 or ao_mem16 or ao_mem32 or ao_baseindex);
  347. ao_wordmem = (ao_mem16 or ao_mem32 or ao_disp or ao_baseindex);
  348. ao_bytemem = (ao_mem8 or ao_disp or ao_baseindex);
  349. ao_control = $40000; { Control register }
  350. ao_debug = $80000; { Debug register }
  351. ao_test = $100000; { Test register }
  352. ao_floatreg = $200000; { Float register }
  353. ao_jumpabsolute = $4000000;
  354. ao_abs8 = $08000000;
  355. ao_abs16 = $10000000;
  356. ao_abs32 = $20000000;
  357. ao_abs = (ao_abs8 or ao_abs16 or ao_abs32);
  358. ao_none = $ff;
  359. const
  360. AB_DN = 1;
  361. AB_AN = 2;
  362. AB_INDAN = 3;
  363. AB_INDPP = 4;
  364. AB_MMIND = 5;
  365. AB_OFFAN = 6;
  366. AB_OFFIDX = 7;
  367. AB_ABSW = 8;
  368. AB_ABSL = 9;
  369. AB_OFFPC = 10;
  370. AB_OFFIDXPC =11;
  371. AB_IMM =12;
  372. AB_REGS =13; {* movem *}
  373. AB_BBRANCH =14;
  374. AB_WBRANCH =15;
  375. AB_CCR =16;
  376. AB_SR =17;
  377. AB_USP =18;
  378. AB_MULDREGS =19;
  379. AB_MULDREGU =20;
  380. AF_DN =(1 SHL AB_DN);
  381. AF_AN =(1 SHL AB_AN);
  382. AF_INDAN = (1 SHL AB_INDAN);
  383. AF_INDPP = (1 SHL AB_INDPP);
  384. AF_MMIND = (1 SHL AB_MMIND);
  385. AF_OFFAN = (1 SHL AB_OFFAN);
  386. AF_OFFIDX = (1 SHL AB_OFFIDX);
  387. AF_ABSW = (1 SHL AB_ABSW);
  388. AF_ABSL = (1 SHL AB_ABSL);
  389. AF_OFFPC = (1 SHL AB_OFFPC);
  390. AF_OFFIDXPC= (1 SHL AB_OFFIDXPC);
  391. AF_IMM =(1 SHL AB_IMM);
  392. AF_REGS = (1 SHL AB_REGS);
  393. AF_BBRANCH = (1 SHL AB_BBRANCH);
  394. AF_WBRANCH = (1 SHL AB_WBRANCH);
  395. AF_CCR =(1 SHL AB_CCR);
  396. AF_SR =(1 SHL AB_SR);
  397. AF_USP =(1 SHL AB_USP);
  398. AF_MULDREGS= (1 SHL AB_MULDREGS);
  399. AF_MULDREGU= (1 SHL AB_MULDREGU);
  400. AF_ALL = AF_DN OR AF_AN OR AF_INDAN OR AF_INDPP OR AF_MMIND OR AF_OFFAN OR AF_OFFIDX OR AF_ABSW OR
  401. AF_ABSL OR AF_OFFPC OR AF_OFFIDXPC OR AF_IMM;
  402. AF_ALLNA = AF_DN OR AF_INDAN OR AF_INDPP OR AF_MMIND OR AF_OFFAN OR AF_OFFIDX OR AF_ABSW OR AF_ABSL
  403. OR AF_OFFPC OR AF_OFFIDXPC OR AF_IMM;
  404. AF_ALT = AF_DN OR AF_AN OR AF_INDAN OR AF_INDPP OR AF_MMIND OR AF_OFFAN OR
  405. AF_OFFIDX OR AF_ABSW OR AF_ABSL;
  406. AF_ALTNA = AF_DN OR AF_INDAN OR AF_INDPP OR AF_MMIND OR AF_OFFAN OR AF_OFFIDX OR AF_ABSW OR AF_ABSL;
  407. AF_ALTM = AF_INDAN OR AF_INDPP OR AF_MMIND OR AF_OFFAN OR AF_OFFIDX OR AF_ABSW OR AF_ABSL;
  408. AF_CTL = AF_INDAN OR AF_OFFAN OR AF_OFFIDX OR AF_ABSW OR AF_ABSL OR AF_OFFPC OR AF_OFFIDXPC;
  409. AF_CTLNPC = AF_INDAN OR AF_OFFAN OR AF_OFFIDX OR AF_ABSW OR AF_ABSL OR AF_OFFIDXPC;
  410. { S_WL (S_W|S_L)
  411. S_BW (S_B|S_W)}
  412. const
  413. S_ALL = [S_B] + [S_W] + [S_L];
  414. {#define S_ALL (S_B|S_W|S_L)}
  415. type
  416. ttemplate = record
  417. i : tasmop;
  418. oc : longint;
  419. ops : byte;
  420. size: set of topsize;
  421. o1,o2: longint;
  422. end;
  423. tins_cache = array[A_ABCD..A_UNLK] of longint;
  424. var
  425. ins_cache : tins_cache;
  426. exprasmlist : paasmoutput;
  427. const
  428. it : array[0..188] of ttemplate = (
  429. ( i:A_ABCD; oc: $C100; ops:2;size: [S_B]; o1:AF_DN; o2:AF_DN ),
  430. ( i:A_ABCD; oc: $C108; ops:2;size: [S_B]; o1:AF_MMIND; o2:AF_MMIND ),
  431. ( i:A_ADD; oc: $D000; ops:2;size: S_ALL; o1:AF_ALL; o2:AF_DN ),
  432. ( i:A_ADD; oc: $D100; ops:2;size: S_ALL; o1:AF_DN; o2:AF_ALTM ),
  433. ( i:A_ADD; oc: $D0C0; ops:2;size: [S_W]; o1:AF_ALL; o2:AF_AN ),
  434. ( i:A_ADD; oc: $D1C0; ops:2;size: [S_L]; o1:AF_ALL; o2:AF_AN ),
  435. ( i:A_ADD; oc: $0600; ops:2;size: S_ALL; o1:AF_IMM; o2:AF_ALTNA ),
  436. ( i:A_ADDQ; oc: $5000; ops:2;size: S_ALL; o1:AF_IMM; o2:AF_ALT ),
  437. ( i:A_ADDX; oc: $D100; ops:2;size: S_ALL; o1:AF_DN; o2:AF_DN ),
  438. ( i:A_ADDX; oc: $D108; ops:2;size: S_ALL; o1:AF_MMIND; o2:AF_MMIND ),
  439. ( i:A_AND; oc: $C000; ops:2;size: S_ALL; o1:AF_ALLNA; o2:AF_DN ),
  440. ( i:A_AND; oc: $C100; ops:2;size: S_ALL; o1:AF_DN; o2:AF_ALTM ),
  441. ( i:A_AND; oc: $0200; ops:2;size: S_ALL; o1:AF_IMM; o2:AF_ALTNA ),
  442. ( i:A_AND; oc: $023C; ops:2;size: [S_B]; o1:AF_IMM; o2:AF_CCR ),
  443. ( i:A_AND; oc: $027C; ops:2;size: [S_W]; o1:AF_IMM; o2:AF_SR ),
  444. ( i:A_ASL; oc: $E120; ops:2;size: S_ALL; o1:AF_DN; o2:AF_DN ),
  445. ( i:A_ASL; oc: $E100; ops:2;size: S_ALL; o1:AF_IMM; o2:AF_DN ),
  446. ( i:A_ASL; oc: $E1C0; ops:1;size: [S_W]; o1:0; o2:AF_ALTM ),
  447. ( i:A_ASR; oc: $E020; ops:2;size: S_ALL; o1:AF_DN; o2:AF_DN ),
  448. ( i:A_ASR; oc: $E000; ops:2;size: S_ALL; o1:AF_IMM; o2:AF_DN ),
  449. ( i:A_ASR; oc: $E0C0; ops:1;size: [S_W]; o1:0; o2:AF_ALTM ),
  450. ( i:A_BCC; oc: $6400; ops:1;size: [S_NO]; o1:AF_WBRANCH; o2:0 ),
  451. ( i:A_BCS; oc: $6500; ops:1;size: [S_NO]; o1:AF_WBRANCH; o2:0 ),
  452. ( i:A_BEQ; oc: $6700; ops:1;size: [S_NO]; o1:AF_WBRANCH; o2:0 ),
  453. ( i:A_BGE; oc: $6C00; ops:1;size: [S_NO]; o1:AF_WBRANCH; o2:0 ),
  454. ( i:A_BGT; oc: $6E00; ops:1;size: [S_NO]; o1:AF_WBRANCH; o2:0 ),
  455. ( i:A_BHI; oc: $6200; ops:1;size: [S_NO]; o1:AF_WBRANCH; o2:0 ),
  456. ( i:A_BLE; oc: $6F00; ops:1;size: [S_NO]; o1:AF_WBRANCH; o2:0 ),
  457. ( i:A_BLS; oc: $6300; ops:1;size: [S_NO]; o1:AF_WBRANCH; o2:0 ),
  458. ( i:A_BLT; oc: $6D00; ops:1;size: [S_NO]; o1:AF_WBRANCH; o2:0 ),
  459. ( i:A_BMI; oc: $6B00; ops:1;size: [S_NO]; o1:AF_WBRANCH; o2:0 ),
  460. ( i:A_BNE; oc: $6600; ops:1;size: [S_NO]; o1:AF_WBRANCH; o2:0 ),
  461. ( i:A_BPL; oc: $6A00; ops:1;size: [S_NO]; o1:AF_WBRANCH; o2:0 ),
  462. ( i:A_BVC; oc: $6800; ops:1;size: [S_NO]; o1:AF_WBRANCH; o2:0 ),
  463. ( i:A_BVS; oc: $6900; ops:1;size: [S_NO]; o1:AF_WBRANCH; o2:0 ),
  464. {* opcode Temp Rs EAs Rd EAd Siz Sizes SModes DModes Spec# *}
  465. ( i:A_BCHG; oc: $0140; ops:2;size: [S_B]; o1:AF_DN; o2:AF_ALTM ),
  466. ( i:A_BCHG; oc: $0140; ops:2;size: [S_L]; o1:AF_DN; o2:AF_DN ),
  467. ( i:A_BCHG; oc: $0840; ops:2;size: [S_B]; o1:AF_IMM; o2:AF_ALTM ),
  468. ( i:A_BCHG; oc: $0840; ops:2;size: [S_L]; o1:AF_IMM; o2:AF_DN ),
  469. ( i:A_BCLR; oc: $0180; ops:2;size: [S_B]; o1:AF_DN; o2:AF_ALTM ),
  470. ( i:A_BCLR; oc: $0180; ops:2;size: [S_L]; o1:AF_DN; o2:AF_DN ),
  471. ( i:A_BCLR; oc: $0880; ops:2;size: [S_B]; o1:AF_IMM; o2:AF_ALTM ),
  472. ( i:A_BCLR; oc: $0880; ops:2;size: [S_L]; o1:AF_IMM; o2:AF_DN ),
  473. ( i:A_BRA; oc: $6000; ops:1;size: [S_NO]; o1:AF_WBRANCH;o2:0 ),
  474. ( i:A_BSET; oc: $01C0; ops:2;size: [S_B]; o1:AF_DN; o2:AF_ALTM ),
  475. ( i:A_BSET; oc: $01C0; ops:2;size: [S_L]; o1:AF_DN; o2:AF_DN ),
  476. ( i:A_BSET; oc: $08C0; ops:2;size: [S_B]; o1:AF_IMM; o2:AF_ALTM ),
  477. ( i:A_BSET; oc: $08C0; ops:2;size: [S_L]; o1:AF_IMM; o2:AF_DN ),
  478. ( i:A_BTST; oc: $0100; ops:2;size: [S_B]; o1:AF_DN; o2:AF_ALTM ),
  479. ( i:A_BTST; oc: $0100; ops:2;size: [S_L]; o1:AF_DN; o2:AF_DN ),
  480. ( i:A_BTST; oc: $0800; ops:2;size: [S_B]; o1:AF_IMM; o2:AF_ALTM ),
  481. ( i:A_BTST; oc: $0800; ops:2;size: [S_L]; o1:AF_IMM; o2:AF_DN ),
  482. {* opcode Temp Rs EAs Rd EAd Siz Sizes SModes DModes Spec# *}
  483. ( i:A_CHK; oc: $4180; ops:2;size: [S_W]; o1:AF_ALLNA; o2:AF_DN ),
  484. ( i:A_CLR; oc: $4200; ops:1;size: S_ALL; o1:AF_ALTNA; o2:0 ),
  485. ( i:A_CMP; oc: $B000; ops:2;size: S_ALL; o1:AF_ALLNA; o2:AF_DN ),
  486. ( i:A_CMP; oc: $B000; ops:2;size: [S_WL]; o1:AF_AN; o2:AF_DN ),
  487. ( i:A_CMP; oc: $B0C0; ops:2;size: [S_W]; o1:AF_ALL; o2:AF_AN ),
  488. ( i:A_CMP; oc: $B1C0; ops:2;size: [S_L]; o1:AF_ALL; o2:AF_AN ),
  489. ( i:A_CMP; oc: $0C00; ops:2;size: S_ALL; o1:AF_IMM; o2:AF_ALTNA ),
  490. ( i:A_CMP; oc: $B108; ops:2;size: S_ALL; o1:AF_INDPP; o2:AF_INDPP ),
  491. ( i:A_DBCC; oc: $54C8; ops:2;size: [S_NO]; o1:AF_DN; o2:AF_WBRANCH ),
  492. ( i:A_DBCS; oc: $55C8; ops:2;size: [S_NO]; o1:AF_DN; o2:AF_WBRANCH ),
  493. ( i:A_DBEQ; oc: $57C8; ops:2;size: [S_NO]; o1:AF_DN; o2:AF_WBRANCH ),
  494. ( i:A_DBF; oc: $51C8; ops:2;size: [S_NO]; o1:AF_DN; o2:AF_WBRANCH ),
  495. ( i:A_DBGE; oc: $5CC8; ops:2;size: [S_NO]; o1:AF_DN; o2:AF_WBRANCH ),
  496. ( i:A_DBGT; oc: $5EC8; ops:2;size: [S_NO]; o1:AF_DN; o2:AF_WBRANCH ),
  497. ( i:A_DBHI; oc: $52C8; ops:2;size: [S_NO]; o1:AF_DN; o2:AF_WBRANCH ),
  498. ( i:A_DBLE; oc: $5FC8; ops:2;size: [S_NO]; o1:AF_DN; o2:AF_WBRANCH ),
  499. ( i:A_DBLS; oc: $53C8; ops:2;size: [S_NO]; o1:AF_DN; o2:AF_WBRANCH ),
  500. ( i:A_DBLT; oc: $5DC8; ops:2;size: [S_NO]; o1:AF_DN; o2:AF_WBRANCH ),
  501. ( i:A_DBMI; oc: $5BC8; ops:2;size: [S_NO]; o1:AF_DN; o2:AF_WBRANCH ),
  502. ( i:A_DBNE; oc: $56C8; ops:2;size: [S_NO]; o1:AF_DN; o2:AF_WBRANCH ),
  503. ( i:A_DBPL; oc: $5AC8; ops:2;size: [S_NO]; o1:AF_DN; o2:AF_WBRANCH ),
  504. ( i:A_DBT; oc: $50C8; ops:2;size: [S_NO]; o1:AF_DN; o2:AF_WBRANCH ),
  505. ( i:A_DBVC; oc: $58C8; ops:2;size: [S_NO]; o1:AF_DN; o2:AF_WBRANCH ),
  506. ( i:A_DBVS; oc: $59C8; ops:2;size: [S_NO]; o1:AF_DN; o2:AF_WBRANCH ),
  507. {* opcode Temp Rs EAs Rd EAd Siz Sizes SModes DModes Spec# *}
  508. ( i:A_DIVS; oc: $81C0; ops:2;size: [S_W]; o1:AF_ALLNA; o2:AF_DN ),
  509. ( i:A_DIVS; oc: $4C40; ops:2;size: [S_L]; o1:AF_ALLNA; o2:AF_DN OR AF_MULDREGS), {* 020 *}
  510. ( i:A_DIVU; oc: $80C0; ops:2;size: [S_W]; o1:AF_ALLNA; o2:AF_DN ),
  511. ( i:A_DIVU; oc: $4C40; ops:2;size: [S_L]; o1:AF_ALLNA; o2:AF_DN OR AF_MULDREGU), {* 020 *}
  512. ( i:A_EOR; oc: $B100; ops:2;size: S_ALL; o1:AF_DN; o2:AF_ALTNA ),
  513. ( i:A_EOR; oc: $0A00; ops:2;size: S_ALL; o1:AF_IMM; o2:AF_ALTNA ),
  514. ( i:A_EOR; oc: $0A3C; ops:2;size: [S_B]; o1:AF_IMM; o2:AF_CCR ),
  515. ( i:A_EOR; oc: $0A7C; ops:2;size: [S_W]; o1:AF_IMM; o2:AF_SR ),
  516. ( i:A_EXG; oc: $C140; ops:2;size: [S_L]; o1:AF_DN; o2:AF_DN ),
  517. ( i:A_EXG; oc: $C148; ops:2;size: [S_L]; o1:AF_AN; o2:AF_AN ),
  518. ( i:A_EXG; oc: $C188; ops:2;size: [S_L]; o1:AF_DN; o2:AF_AN ),
  519. ( i:A_EXG; oc: $C188; ops:2;size: [S_L]; o1:AF_AN; o2:AF_DN ),
  520. ( i:A_EXT; oc: $4880; ops:1;size: [S_W]; o1:AF_DN; o2:0 ),
  521. ( i:A_EXT; oc: $48C0; ops:1;size: [S_L]; o1:AF_DN; o2:0 ),
  522. { MC68020 }
  523. ( i:A_EXTB; oc: $49C0; ops:1;size: [S_L]; o1:AF_DN; o2:0 ),
  524. ( i:A_ILLEGAL;oc: $4AFC;ops:0;size: [S_NO]; o1:0; o2:0 ),
  525. {*
  526. * note: BSR/BSR/JSR ordering must remain as it is (passc.c optimizations)
  527. *}
  528. ( i:A_JMP; oc: $4EC0; ops:1;size: [S_NO]; o1:AF_CTL; o2:0 ),
  529. ( i:A_BSR; oc: $6100; ops:1;size: [S_NO]; o1:AF_WBRANCH; o2: 0 ),
  530. ( i:A_JSR; oc: $4E80; ops:1;size: [S_NO]; o1:AF_CTL; o2:0 ),
  531. ( i:A_LEA; oc: $41C0; ops:2;size: [S_L]; o1:AF_CTL; o2:AF_AN ),
  532. ( i:A_LINK; oc: $4E50; ops:2;size: [S_W]; o1:AF_AN; o2:AF_IMM ),
  533. {* opcode Temp Rs EAs Rd EAd Siz Sizes SModes DModes Spec# *}
  534. ( i:A_LSL; oc: $E128; ops:2;size: S_ALL; o1:AF_DN; o2:AF_DN ),
  535. ( i:A_LSL; oc: $E108; ops:2;size: S_ALL; o1:AF_IMM; o2:AF_DN ),
  536. ( i:A_LSL; oc: $E3C0; ops:1;size: [S_W]; o1:0; o2:AF_ALTM ),
  537. ( i:A_LSR; oc: $E028; ops:2;size: S_ALL; o1:AF_DN; o2:AF_DN ),
  538. ( i:A_LSR; oc: $E008; ops:2;size: S_ALL; o1:AF_IMM; o2:AF_DN ),
  539. ( i:A_LSR; oc: $E2C0; ops:1;size: [S_W]; o1:0; o2:AF_ALTM ),
  540. ( i:A_MOVE; oc: $2000; ops:2;size: [S_L]; o1:AF_ALLNA; o2:AF_ALTNA ),
  541. ( i:A_MOVE; oc: $3000; ops:2;size: [S_W]; o1:AF_ALLNA; o2:AF_ALTNA ),
  542. ( i:A_MOVE; oc: $1000; ops:2;size: [S_B]; o1:AF_ALLNA; o2:AF_ALTNA ),
  543. ( i:A_MOVE; oc: $2000; ops:2;size: [S_L]; o1:AF_AN; o2:AF_ALTNA ),
  544. ( i:A_MOVE; oc: $3000; ops:2;size: [S_W]; o1:AF_AN; o2:AF_ALTNA ),
  545. {* 68010
  546. *( 'MOVE'; i:A_MOVE; oc: $42C0; -1; -1; 0; 3; -1; size: [S_W]; o1:AF_CCR; o1:AF_ALTNA ),
  547. *}
  548. ( i:A_MOVE; oc: $44C0; ops:2;size: [S_W]; o1:AF_ALLNA; o2:AF_CCR ),
  549. ( i:A_MOVE; oc: $46C0; ops:2;size: [S_W]; o1:AF_ALLNA; o2:AF_SR ),
  550. ( i:A_MOVE; oc: $40C0; ops:2;size: [S_W]; o1:AF_SR; o2:AF_ALTNA ),
  551. ( i:A_MOVE; oc: $3040; ops:2;size: [S_W]; o1:AF_ALL; o2:AF_AN ),
  552. ( i:A_MOVE; oc: $2040; ops:2;size: [S_L]; o1:AF_ALL; o2:AF_AN ),
  553. ( i:A_MOVE; oc: $4E68; ops:2;size: [S_L]; o1:AF_USP; o2:AF_AN ),
  554. ( i:A_MOVE; oc: $4E60; ops:2;size: [S_L]; o1:AF_AN; o2:AF_USP ),
  555. {* MOVEC 68010 *}
  556. ( i:A_MOVEM;oc: $48C0; ops:8;size: [S_L]; o1:AF_REGS; o2:AF_CTL OR AF_MMIND ),
  557. ( i:A_MOVEM;oc: $4880; ops:8;size: [S_W]; o1:AF_REGS; o2:AF_CTL OR AF_MMIND ),
  558. ( i:A_MOVEM;oc: $4CC0; ops:8;size: [S_L]; o1:AF_CTL OR AF_INDPP; o2:AF_REGS ),
  559. ( i:A_MOVEM;oc: $4C80; ops:8;size: [S_W]; o1:AF_CTL OR AF_INDPP; o2:AF_REGS ),
  560. ( i:A_MOVEP;oc: $0188; ops:2;size: [S_W]; o1:AF_DN; o2:AF_OFFAN ),
  561. ( i:A_MOVEP;oc: $01C8; ops:2;size: [S_L]; o1:AF_DN; o2:AF_OFFAN ),
  562. ( i:A_MOVEP;oc: $0108; ops:2;size: [S_W]; o1:AF_OFFAN; o2:AF_DN ),
  563. ( i:A_MOVEP;oc: $0148; ops:2;size: [S_L]; o1:AF_OFFAN; o2:AF_DN ),
  564. {* MOVES 68010 *}
  565. ( i:A_MOVEQ;oc: $7000; ops:2;size: [S_L]; o1:AF_IMM; o2:AF_DN ),
  566. {* opcode Temp Rs EAs Rd EAd Siz Sizes SModes DModes Spec# *}
  567. ( i:A_MULS; oc: $C1C0; ops:2;size: [S_W]; o1:AF_ALLNA; o2:AF_DN ),
  568. ( i:A_MULS; oc: $4C00; ops:2;size: [S_L]; o1:AF_ALLNA; o2:AF_DN OR AF_MULDREGS), {* 020 *}
  569. ( i:A_MULU; oc: $C0C0; ops:2;size: [S_W]; o1:AF_ALLNA; o2:AF_DN ),
  570. ( i:A_MULU; oc: $4C00; ops:2;size: [S_L]; o1:AF_ALLNA; o2:AF_DN OR AF_MULDREGU), {* 020 *}
  571. ( i:A_NBCD; oc: $4800; ops:1;size: [S_B]; o1:AF_ALTNA; o2:0 ),
  572. ( i:A_NEG; oc: $4400; ops:1;size: S_ALL; o1:AF_ALTNA; o2:0 ),
  573. ( i:A_NEGX; oc: $4000; ops:1;size: S_ALL; o1:AF_ALTNA; o2:0 ),
  574. ( i:A_NOP; oc: $4E71; ops:0;size: [S_NO]; o1:0; o2:0 ),
  575. ( i:A_NOT; oc: $4600; ops:1;size: S_ALL; o1:AF_ALTNA; o2:0 ),
  576. ( i:A_OR; oc: $8000; ops:2;size: S_ALL; o1:AF_ALLNA; o2:AF_DN ),
  577. ( i:A_OR; oc: $8100; ops:2;size: S_ALL; o1:AF_DN; o2:AF_ALTNA ),
  578. ( i:A_OR; oc: $0000; ops:2;size: S_ALL; o1:AF_IMM; o2:AF_ALTNA ),
  579. ( i:A_OR; oc: $003C; ops:2;size: [S_B]; o1:AF_IMM; o2:AF_CCR ),
  580. ( i:A_OR; oc: $007C; ops:2;size: [S_W]; o1:AF_IMM; o2:AF_SR ),
  581. ( i:A_PEA; oc: $4840; ops:1;size: [S_L]; o1:AF_CTL; o2:0 ),
  582. ( i:A_RESET;oc: $4E70; ops:0;size: [S_NO]; o1:0; o2:0 ),
  583. {* opcode Temp Rs EAs Rd EAd Siz Sizes SModes DModes Spec# *}
  584. ( i:A_ROL; oc: $E138; ops:2;size: S_ALL; o1:AF_DN; o2:AF_DN ),
  585. ( i:A_ROL; oc: $E118; ops:2;size: S_ALL; o1:AF_IMM; o2:AF_DN ),
  586. ( i:A_ROL; oc: $E7C0; ops:1;size: [S_W]; o1:AF_ALTM; o2:0 ),
  587. ( i:A_ROR; oc: $E038; ops:2;size: S_ALL; o1:AF_DN; o2:AF_DN ),
  588. ( i:A_ROR; oc: $E018; ops:2;size: S_ALL; o1:AF_IMM; o2:AF_DN ),
  589. ( i:A_ROR; oc: $E6C0; ops:1;size: [S_W]; o1:AF_ALTM; o2:0 ),
  590. ( i:A_ROXL; oc: $E130; ops:2;size: S_ALL; o1:AF_DN; o2:AF_DN ),
  591. ( i:A_ROXL; oc: $E110; ops:2;size: S_ALL; o1:AF_IMM; o2:AF_DN ),
  592. ( i:A_ROXL; oc: $E5C0; ops:1;size: [S_W]; o1:AF_ALTM; o2:0 ),
  593. ( i:A_ROXR; oc: $E030; ops:2;size: S_ALL; o1:AF_DN; o2:AF_DN ),
  594. ( i:A_ROXR; oc: $E010; ops:2;size: S_ALL; o1:AF_IMM; o2:AF_DN ),
  595. ( i:A_ROXR; oc: $E4C0; ops:1;size: [S_W]; o1:AF_ALTM; o2:0 ),
  596. {* RTD 68010 *}
  597. ( i:A_RTE; oc: $4E73; ops:0;size: [S_NO]; o1:0; o2:0 ),
  598. ( i:A_RTR; oc: $4E77; ops:0;size: [S_NO]; o1:0; o2:0 ),
  599. ( i:A_RTS; oc: $4E75; ops:0;size: [S_NO]; o1:0; o2:0 ),
  600. ( i:A_SBCD; oc: $8100; ops:2;size: [S_B]; o1:AF_DN; o2:AF_DN ),
  601. ( i:A_SBCD; oc: $8108; ops:2;size: [S_B]; o1:AF_MMIND; o2:AF_MMIND ),
  602. {* opcode Temp Rs EAs Rd EAd Siz Sizes SModes DModes Spec# *}
  603. {* SCC note; even though they are in the same group since all have the
  604. * same note if one isn't accepted none of the others will be either
  605. *}
  606. ( i:A_SCC; oc: $54C0; ops:1;size: [S_B]; o1:AF_ALTNA; o2: 0 ),
  607. ( i:A_SCS; oc: $55C0; ops:1;size: [S_B]; o1:AF_ALTNA; o2: 0 ),
  608. ( i:A_SEQ; oc: $57C0; ops:1;size: [S_B]; o1:AF_ALTNA; o2: 0 ),
  609. ( i:A_SF; oc: $51C0; ops:1;size: [S_B]; o1:AF_ALTNA; o2: 0 ),
  610. ( i:A_SGE; oc: $5CC0; ops:1;size: [S_B]; o1:AF_ALTNA; o2: 0 ),
  611. ( i:A_SGT; oc: $5EC0; ops:1;size: [S_B]; o1:AF_ALTNA; o2: 0 ),
  612. ( i:A_SHI; oc: $52C0; ops:1;size: [S_B]; o1:AF_ALTNA; o2: 0 ),
  613. ( i:A_SLE; oc: $5FC0; ops:1;size: [S_B]; o1:AF_ALTNA; o2: 0 ),
  614. ( i:A_SLS; oc: $53C0; ops:1;size: [S_B]; o1:AF_ALTNA; o2: 0 ),
  615. ( i:A_SLT; oc: $5DC0; ops:1;size: [S_B]; o1:AF_ALTNA; o2: 0 ),
  616. ( i:A_SMI; oc: $5BC0; ops:1;size: [S_B]; o1:AF_ALTNA; o2: 0 ),
  617. ( i:A_SNE; oc: $56C0; ops:1;size: [S_B]; o1:AF_ALTNA; o2: 0 ),
  618. ( i:A_SPL; oc: $5AC0; ops:1;size: [S_B]; o1:AF_ALTNA; o2: 0 ),
  619. ( i:A_ST; oc: $50C0; ops:1;size: [S_B]; o1:AF_ALTNA; o2: 0 ),
  620. ( i:A_SVC; oc: $58C0; ops:1;size: [S_B]; o1:AF_ALTNA; o2: 0 ),
  621. ( i:A_SVS; oc: $59C0; ops:1;size: [S_B]; o1:AF_ALTNA; o2: 0 ),
  622. {* opcode Temp Rs EAs Rd EAd Siz Sizes SModes DModes Spec# *}
  623. ( i:A_STOP; oc: $4E72; ops:0; size: [S_W]; o1:AF_IMM; o2: 0 ),
  624. ( i:A_SUB; oc: $9000; ops:2;size: S_ALL; o1:AF_ALL; o2:AF_DN ),
  625. ( i:A_SUB; oc: $9100; ops:2;size: S_ALL; o1:AF_DN; o2:AF_ALTM ),
  626. ( i:A_SUB; oc: $90C0; ops:2;size: [S_W]; o1:AF_ALL; o2:AF_AN ),
  627. ( i:A_SUB; oc: $91C0; ops:2;size: [S_L]; o1:AF_ALL; o2:AF_AN ),
  628. ( i:A_SUB; oc: $0400; ops:2;size: S_ALL; o1:AF_IMM; o2:AF_ALTNA ),
  629. ( i:A_SUBQ; oc: $5100; ops:2;size: S_ALL; o1:AF_IMM; o2:AF_ALT ),
  630. ( i:A_SUBX; oc: $9100; ops:2;size: S_ALL; o1:AF_DN; o2:AF_DN ),
  631. ( i:A_SUBX; oc: $9108; ops:2;size: S_ALL; o1:AF_MMIND; o2:AF_MMIND ),
  632. ( i:A_SWAP; oc: $4840; ops:1;size: [S_W]; o1:AF_DN; o2:0 ),
  633. ( i:A_TAS; oc: $4AC0; ops:1;size: [S_B]; o1:AF_ALTNA; o2:0 ),
  634. ( i:A_TRAP; oc: $4E40; ops:1;size: [S_NO]; o1:AF_IMM; o2:0 ),
  635. ( i:A_TRAPV;oc: $4E76; ops:0;size: [S_NO]; o1:0; o2:0 ),
  636. ( i:A_TST; oc: $4A00; ops:1;size: S_ALL; o1:AF_ALTNA; o2:0 ),
  637. ( i:A_UNLK; oc: $4E58; ops:1;size: [S_NO]; o1:AF_AN; o2:0 ),
  638. ( i:A_NONE)
  639. );
  640. {****************************************************************************
  641. Assembler Mnemoics
  642. ****************************************************************************}
  643. const
  644. firstop = A_ABCD;
  645. lastop = A_LABEL;
  646. mot_op2str : array[firstop..lastop] of string[10] =
  647. { 68000 only instructions }
  648. ('abcd','add', 'adda','addi','addq','addx','and','andi',
  649. 'asl','asr','bcc','bcs','beq','bge','bgt','bhi',
  650. 'ble','bls','blt','bmi','bne','bpl','bvc','bvs',
  651. 'bchg','bclr','bra','bset','bsr','btst','chk',
  652. 'clr','cmp','cmpa','cmpi','cmpm','dbcc','dbcs','dbeq','dbge',
  653. 'dbgt','dbhi','dble','dbls','dblt','dbmi','dbne','dbra',
  654. 'dbpl','dbt','dbvc','dbvs','dbf','divs','divu',
  655. 'eor','eori','exg','illegal','ext','jmp','jsr',
  656. 'lea','link','lsl','lsr','move','movea','movei','moveq',
  657. 'movem','movep','muls','mulu','nbcd','neg','negx',
  658. 'nop','not','or','ori','pea','rol','ror','roxl',
  659. 'roxr','rtr','rts','sbcd','scc','scs','seq','sge',
  660. 'sgt','shi','sle','sls','slt','smi','sne',
  661. 'spl','st','svc','svs','sf','sub','suba','subi','subq',
  662. 'subx','swap','tas','trap','trapv','tst','unlk',
  663. 'rte','reset','stop',
  664. { MC68010 instructions }
  665. 'bkpt','movec','moves','rtd',
  666. { MC68020 instructions }
  667. 'bfchg','bfclr','bfexts','bfextu','bfffo',
  668. 'bfins','bfset','bftst','callm','cas','cas2',
  669. 'chk2','cmp2','divsl','divul','extb','pack','rtm',
  670. 'trapcc','tracs','trapeq','trapf','trapge','trapgt',
  671. 'traphi','traple','trapls','traplt','trapmi','trapne',
  672. 'trappl','trapt','trapvc','trapvs','unpk',
  673. { FPU Processor instructions - directly supported only. }
  674. { IEEE aware and misc. condition codes not supported }
  675. 'fabs','fadd',
  676. 'fbeq','fbne','fbngt','fbgt','fbge','fbnge',
  677. 'fblt','fbnlt','fble','fbgl','fbngl','fbgle','fbngle',
  678. 'fdbeq','fdbne','fdbgt','fdbngt','fdbge','fdnbge',
  679. 'fdblt','fdbnlt','fdble','fdbgl','fdbngl','fdbgle','fbdngle',
  680. 'fseq','fsne','fsgt','fsngt','fsge','fsnge',
  681. 'fslt','fsnlt','fsle','fsgl','fsngl','fsgle','fsngle',
  682. 'fcmp','fdiv','fmove','fmovem',
  683. 'fmul','fneg','fnop','fsqrt','fsub','fsgldiv',
  684. 'fsflmul','ftst',
  685. 'ftrapeq','ftrapne','ftrapgt','ftrapngt','ftrapge','ftrapnge',
  686. 'ftraplt','ftrapnlt','ftraple','ftrapgl','ftrapngl','ftrapgle',
  687. 'ftrapngle',
  688. { Useful for assembly langage output }
  689. { Protected instructions }
  690. 'cprestore','cpsave',
  691. { FPU Unit protected instructions }
  692. { and 68030/68851 common MMU instructions }
  693. { (this may include 68040 MMU instructions) }
  694. 'frestore','fsave','pflush','pflusha','pload','pmove','ptest',
  695. { Useful for assembly langage output }
  696. '');
  697. mot_opsize2str : array[topsize] of string[2] =
  698. ('','.b','.w','.l','.b','.b','.w','.d','.s','.x');
  699. mot_reg2str : array[R_NO..R_FPSR] of string[6] =
  700. ('', 'd0','d1','d2','d3','d4','d5','d6','d7',
  701. 'a0','a1','a2','a3','a4','a5','a6','sp',
  702. '-(sp)','(sp)+',
  703. 'ccr','fp0','fp1','fp2','fp3','fp4','fp5',
  704. 'fp6','fp7','fpcr','sr','ssp','dfc',
  705. 'sfc','vbr','fpsr');
  706. gas_opsize2str : array[topsize] of string[2] =
  707. ('','.b','.w','.l','.b','.b','.w','.d','.s','.x');
  708. gas_reg2str : array[R_NO..R_FPSR] of string[6] =
  709. ('', 'd0','d1','d2','d3','d4','d5','d6','d7',
  710. 'a0','a1','a2','a3','a4','a5','a6','sp',
  711. '-(sp)','(sp)+',
  712. 'ccr','fp0','fp1','fp2','fp3','fp4','fp5',
  713. 'fp6','fp7','fpcr','sr','ssp','dfc',
  714. 'sfc','vbr','fpsr');
  715. mit_opsize2str : array[topsize] of string[2] =
  716. ('','b','w','l','b','b','w','d','s','x');
  717. mit_reg2str : array[R_NO..R_FPSR] of string[6] =
  718. ('', 'd0','d1','d2','d3','d4','d5','d6','d7',
  719. 'a0','a1','a2','a3','a4','a5','a6','sp',
  720. 'sp@-','sp@+',
  721. 'ccr','fp0','fp1','fp2','fp3','fp4','fp5',
  722. 'fp6','fp7','fpcr','sr','ssp','dfc',
  723. 'sfc','vbr','fpsr');
  724. implementation
  725. function reg2str(r : tregister) : string;
  726. const
  727. a : array[R_NO..R_FPSR] of string[3] =
  728. ('','D0','D1','D2','D3','D4','D5','D6','D7',
  729. 'A0','A1','A2','A3','A4','A5','A6','A7',
  730. '-(SP)','(SP)+',
  731. 'CCR','FP0','FP1','FP2',
  732. 'FP3','FP4','FP5','FP6','FP7','FPCR','SR',
  733. 'SSP','DFC','SFC','VBR','FPSR');
  734. begin
  735. reg2str:=a[r];
  736. end;
  737. function newreference(const r : treference) : preference;
  738. var
  739. p : preference;
  740. begin
  741. new(p);
  742. p^:=r;
  743. if assigned(r.symbol) then
  744. p^.symbol:=stringdup(r.symbol^);
  745. newreference:=p;
  746. end;
  747. function lab2str(l : plabel) : string;
  748. begin
  749. if (l=nil) or (l^.nb=0) then
  750. {$ifdef EXTDEBUG}
  751. lab2str:='ILLEGAL'
  752. else
  753. lab2str:=target_info.labelprefix+tostr(l^.nb);
  754. {$else EXTDEBUG}
  755. internalerror(2000);
  756. lab2str:=target_info.labelprefix+tostr(l^.nb);
  757. {$endif EXTDEBUG}
  758. l^.is_used:=true;
  759. end;
  760. procedure reset_reference(var ref : treference);
  761. begin
  762. with ref do
  763. begin
  764. index:=R_NO;
  765. base:=R_NO;
  766. segment:=R_DEFAULT_SEG;
  767. offset:=0;
  768. scalefactor:=1;
  769. isintvalue:=false;
  770. symbol:=nil;
  771. direction := dir_none;
  772. end;
  773. end;
  774. procedure clear_reference(var ref : treference);
  775. begin
  776. stringdispose(ref.symbol);
  777. reset_reference(ref);
  778. end;
  779. procedure getlabel(var l : plabel);
  780. begin
  781. new(l);
  782. l^.nb:=nextlabelnr;
  783. l^.is_used:=false;
  784. l^.is_set:=false;
  785. l^.refcount:=0;
  786. inc(nextlabelnr);
  787. end;
  788. procedure freelabel(var l : plabel);
  789. begin
  790. if (l<>nil) and (not l^.is_set) and (not l^.is_used) then
  791. dispose(l);
  792. l:=nil;
  793. end;
  794. procedure setzerolabel(var l : plabel);
  795. begin
  796. l^.nb:=0;
  797. l^.is_used:=false;
  798. l^.is_set:=false;
  799. l^.refcount:=0;
  800. end;
  801. procedure getzerolabel(var l : plabel);
  802. begin
  803. new(l);
  804. l^.nb:=0;
  805. l^.is_used:=false;
  806. l^.is_set:=false;
  807. l^.refcount:=0;
  808. end;
  809. procedure getlabelnr(var l : longint);
  810. begin
  811. l:=nextlabelnr;
  812. inc(nextlabelnr);
  813. end;
  814. function newcsymbol(const s : string;l : longint) : pcsymbol;
  815. var
  816. p : pcsymbol;
  817. begin
  818. new(p);
  819. p^.symbol:=strpnew(s);
  820. p^.offset:=l;
  821. newcsymbol:=p;
  822. end;
  823. procedure disposecsymbol(p : pcsymbol);
  824. begin
  825. strdispose(p^.symbol);
  826. dispose(p);
  827. end;
  828. {****************************************************************************
  829. TAI68k
  830. ****************************************************************************}
  831. constructor tai68k.op_none(op : tasmop;_size : topsize);
  832. begin
  833. inherited init;
  834. typ:=ait_instruction;
  835. _operator:=op;
  836. op1t:=top_none;
  837. op2t:=top_none;
  838. op3t:=top_none;
  839. size:=_size;
  840. { the following isn't required ! }
  841. op1:=nil;
  842. op2:=nil;
  843. op3:=nil;
  844. end;
  845. constructor tai68k.op_reg(op : tasmop;_size : topsize;_op1 : tregister);
  846. begin
  847. inherited init;
  848. typ:=ait_instruction;
  849. _operator:=op;
  850. op1t:=top_reg;
  851. op2t:=top_none;
  852. op3t:=top_none;
  853. size:=_size;
  854. op1:=pointer(_op1);
  855. op2:=nil;
  856. op3:=nil;
  857. end;
  858. constructor tai68k.op_const(op : tasmop;_size : topsize;_op1 : longint);
  859. begin
  860. inherited init;
  861. typ:=ait_instruction;
  862. _operator:=op;
  863. op1t:=top_const;
  864. op2t:=top_none;
  865. op3t:=top_none;
  866. size:=_size;
  867. op1:=pointer(_op1);
  868. op2:=nil;
  869. op3:=nil;
  870. end;
  871. constructor tai68k.op_ref(op : tasmop;_size : topsize;_op1 : preference);
  872. begin
  873. inherited init;
  874. typ:=ait_instruction;
  875. _operator:=op;
  876. op2t:=top_none;
  877. op3t:=top_none;
  878. size:=_size;
  879. if _op1^.isintvalue then
  880. begin
  881. op1t:=top_const;
  882. op1:=pointer(_op1^.offset);
  883. end
  884. else
  885. begin
  886. op1t:=top_ref;
  887. op1:=pointer(_op1);
  888. end;
  889. op2:=nil;
  890. op3:=nil;
  891. end;
  892. constructor tai68k.op_loc(op : tasmop;_size : topsize;_op1 : tlocation);
  893. begin
  894. inherited init;
  895. typ:=ait_instruction;
  896. _operator:=op;
  897. op2t:=top_none;
  898. op3t:=top_none;
  899. size:=_size;
  900. if (_op1.loc=loc_register) or (_op1.loc=loc_cregister) then
  901. begin
  902. op1t:=top_reg;
  903. op1:=pointer(_op1.register);
  904. end
  905. else
  906. if _op1.reference.isintvalue then
  907. begin
  908. op1t:=top_const;
  909. op1:=pointer(_op1.reference.offset);
  910. end
  911. else
  912. begin
  913. op1t:=top_ref;
  914. op1:=pointer(newreference(_op1.reference));
  915. end;
  916. op2:=nil;
  917. op3:=nil;
  918. end;
  919. constructor tai68k.op_reg_reg(op : tasmop;_size : topsize;_op1,_op2 : tregister);
  920. begin
  921. inherited init;
  922. typ:=ait_instruction;
  923. _operator:=op;
  924. op1t:=top_reg;
  925. op2t:=top_reg;
  926. op3t:=top_none;
  927. size:=_size;
  928. op1:=pointer(_op1);
  929. op2:=pointer(_op2);
  930. op3:=nil;
  931. end;
  932. constructor tai68k.op_reg_ref(op : tasmop;_size : topsize;_op1 : tregister;_op2 : preference);
  933. begin
  934. inherited init;
  935. typ:=ait_instruction;
  936. _operator:=op;
  937. op1t:=top_reg;
  938. op3t:=top_none;
  939. size:=_size;
  940. op1:=pointer(_op1);
  941. if _op2^.isintvalue then
  942. begin
  943. op2t:=top_const;
  944. op2:=pointer(_op2^.offset);
  945. end
  946. else
  947. begin
  948. op2t:=top_ref;
  949. op2:=pointer(_op2);
  950. end;
  951. op3:=nil;
  952. end;
  953. constructor tai68k.op_reg_loc(op : tasmop;_size : topsize;_op1 : tregister;_op2 : tlocation);
  954. begin
  955. inherited init;
  956. typ:=ait_instruction;
  957. _operator:=op;
  958. op1t:=top_reg;
  959. op3t:=top_none;
  960. size:=_size;
  961. op1:=pointer(_op1);
  962. if (_op2.loc=loc_register) or (_op2.loc=loc_cregister) then
  963. begin
  964. op2t:=top_reg;
  965. op2:=pointer(_op2.register);
  966. end
  967. else
  968. if _op2.reference.isintvalue then
  969. begin
  970. op2t:=top_const;
  971. op2:=pointer(_op2.reference.offset);
  972. end
  973. else
  974. begin
  975. op2t:=top_ref;
  976. op2:=pointer(newreference(_op2.reference));
  977. end;
  978. op3:=nil;
  979. end;
  980. constructor tai68k.op_loc_reg(op : tasmop;_size : topsize;_op1 : tlocation;_op2 : tregister);
  981. begin
  982. inherited init;
  983. typ:=ait_instruction;
  984. _operator:=op;
  985. op2t:=top_reg;
  986. op3t:=top_none;
  987. size:=_size;
  988. op2:=pointer(_op2);
  989. if (_op1.loc=loc_register) or (_op1.loc=loc_cregister) then
  990. begin
  991. op1t:=top_reg;
  992. op1:=pointer(_op1.register);
  993. end
  994. else
  995. if _op1.reference.isintvalue then
  996. begin
  997. op1t:=top_const;
  998. op1:=pointer(_op1.reference.offset);
  999. end
  1000. else
  1001. begin
  1002. op1t:=top_ref;
  1003. op1:=pointer(newreference(_op1.reference));
  1004. end;
  1005. op3:=nil;
  1006. end;
  1007. constructor tai68k.op_const_reg_reg(op : tasmop;_size : topsize;_op1 : longint;_op2 : tregister;_op3 : tregister);
  1008. begin
  1009. inherited init;
  1010. typ:=ait_instruction;
  1011. _operator:=op;
  1012. op1t:=top_const;
  1013. op2t:=top_reg;
  1014. op3t:=top_reg;
  1015. size:=_size;
  1016. op1:=pointer(_op1);
  1017. op2:=pointer(_op2);
  1018. op3:=pointer(_op3);
  1019. end;
  1020. constructor tai68k.op_reg_const(op: tasmop; _size: topsize; _op1: tregister; _op2: longint);
  1021. begin
  1022. inherited init;
  1023. typ := ait_instruction;
  1024. _operator := op;
  1025. op1t := top_reg;
  1026. op2t := top_const;
  1027. op3t := top_none;
  1028. op1 := pointer(_op1);
  1029. op2 := pointer(_op2);
  1030. size := _size;
  1031. end;
  1032. constructor tai68k.op_reg_reg_reg(op : tasmop;_size : topsize;_op1 : tregister;_op2 : tregister;_op3 : tregister);
  1033. begin
  1034. inherited init;
  1035. typ:=ait_instruction;
  1036. _operator:=op;
  1037. op1t:=top_reg;
  1038. op2t:=top_reg;
  1039. op3t:=top_reg;
  1040. size:=_size;
  1041. op1:=pointer(_op1);
  1042. op2:=pointer(_op2);
  1043. op3:=pointer(_op3);
  1044. end;
  1045. constructor tai68k.op_const_reg(op : tasmop;_size : topsize;_op1 : longint;_op2 : tregister);
  1046. begin
  1047. inherited init;
  1048. typ:=ait_instruction;
  1049. _operator:=op;
  1050. op1t:=top_const;
  1051. op2t:=top_reg;
  1052. op3t:=top_none;
  1053. size:=_size;
  1054. op1:=pointer(_op1);
  1055. op2:=pointer(_op2);
  1056. op3:=nil;
  1057. end;
  1058. constructor tai68k.op_const_const(op : tasmop;_size : topsize;_op1,_op2 : longint);
  1059. begin
  1060. inherited init;
  1061. typ:=ait_instruction;
  1062. _operator:=op;
  1063. op1t:=top_const;
  1064. op2t:=top_const;
  1065. op3t:=top_none;
  1066. size:=_size;
  1067. op1:=pointer(_op1);
  1068. op2:=pointer(_op2);
  1069. op3:=nil;
  1070. end;
  1071. constructor tai68k.op_const_ref(op : tasmop;_size : topsize;_op1 : longint;_op2 : preference);
  1072. begin
  1073. inherited init;
  1074. typ:=ait_instruction;
  1075. _operator:=op;
  1076. op1t:=top_const;
  1077. op3t:=top_none;
  1078. size:=_size;
  1079. op1:=pointer(_op1);
  1080. if _op2^.isintvalue then
  1081. begin
  1082. op2t:=top_const;
  1083. op2:=pointer(_op2^.offset);
  1084. end
  1085. else
  1086. begin
  1087. op2t:=top_ref;
  1088. op2:=pointer(_op2);
  1089. end;
  1090. op3:=nil;
  1091. end;
  1092. constructor tai68k.op_const_loc(op : tasmop;_size : topsize;_op1 : longint;_op2 : tlocation);
  1093. begin
  1094. inherited init;
  1095. typ:=ait_instruction;
  1096. _operator:=op;
  1097. op1t:=top_const;
  1098. op3t:=top_none;
  1099. size:=_size;
  1100. op1:=pointer(_op1);
  1101. if (_op2.loc=loc_register) or (_op2.loc=loc_cregister) then
  1102. begin
  1103. op2t:=top_reg;
  1104. op2:=pointer(_op2.register);
  1105. end
  1106. else
  1107. if _op2.reference.isintvalue then
  1108. begin
  1109. op2t:=top_const;
  1110. op2:=pointer(_op2.reference.offset);
  1111. end
  1112. else
  1113. begin
  1114. op2t:=top_ref;
  1115. op2:=pointer(newreference(_op2.reference));
  1116. end;
  1117. op3:=nil;
  1118. end;
  1119. constructor tai68k.op_ref_reg(op : tasmop;_size : topsize;_op1 : preference;_op2 : tregister);
  1120. begin
  1121. inherited init;
  1122. typ:=ait_instruction;
  1123. _operator:=op;
  1124. op2t:=top_reg;
  1125. op3t:=top_none;
  1126. size:=_size;
  1127. op2:=pointer(_op2);
  1128. if _op1^.isintvalue then
  1129. begin
  1130. op1t:=top_const;
  1131. op1:=pointer(_op1^.offset);
  1132. end
  1133. else
  1134. begin
  1135. op1t:=top_ref;
  1136. op1:=pointer(_op1);
  1137. end;
  1138. op3:=nil;
  1139. end;
  1140. constructor tai68k.op_ref_ref(op : tasmop;_size : topsize;_op1,_op2 : preference);
  1141. begin
  1142. inherited init;
  1143. typ:=ait_instruction;
  1144. _operator:=op;
  1145. op3t:=top_none;
  1146. size:=_size;
  1147. if _op1^.isintvalue then
  1148. begin
  1149. op1t:=top_const;
  1150. op1:=pointer(_op1^.offset);
  1151. end
  1152. else
  1153. begin
  1154. op1t:=top_ref;
  1155. op1:=pointer(_op1);
  1156. end;
  1157. if _op2^.isintvalue then
  1158. begin
  1159. op2t:=top_const;
  1160. op2:=pointer(_op2^.offset);
  1161. end
  1162. else
  1163. begin
  1164. op2t:=top_ref;
  1165. op2:=pointer(_op2);
  1166. end;
  1167. op3:=nil;
  1168. end;
  1169. constructor tai68k.op_csymbol(op : tasmop;_size : topsize;_op1 : pcsymbol);
  1170. begin
  1171. inherited init;
  1172. typ:=ait_instruction;
  1173. _operator:=op;
  1174. if (op=A_JSR) and
  1175. (use_esp_stackframe) then
  1176. Message(cg_e_stackframe_with_esp);
  1177. op1t:=top_symbol;
  1178. op2t:=top_none;
  1179. op3t:=top_none;
  1180. size:=_size;
  1181. op1:=pointer(_op1);
  1182. op2:=nil;
  1183. op3:=nil;
  1184. end;
  1185. constructor tai68k.op_csymbol_reg(op : tasmop;_size : topsize;_op1 : pcsymbol;_op2 : tregister);
  1186. begin
  1187. inherited init;
  1188. typ:=ait_instruction;
  1189. _operator:=op;
  1190. op1t:=top_symbol;
  1191. op2t:=top_reg;
  1192. op3t:=top_none;
  1193. size:=_size;
  1194. op1:=pointer(_op1);
  1195. op2:=pointer(_op2);
  1196. op3:=nil;
  1197. end;
  1198. constructor tai68k.op_csymbol_ref(op : tasmop;_size : topsize;_op1 : pcsymbol;_op2 : preference);
  1199. begin
  1200. inherited init;
  1201. typ:=ait_instruction;
  1202. _operator:=op;
  1203. op1t:=top_symbol;
  1204. op3t:=top_none;
  1205. size:=_size;
  1206. op1:=pointer(_op1);
  1207. if _op2^.isintvalue then
  1208. begin
  1209. op2t:=top_const;
  1210. op2:=pointer(_op2^.offset);
  1211. end
  1212. else
  1213. begin
  1214. op2t:=top_ref;
  1215. op2:=pointer(_op2);
  1216. end;
  1217. op3:=nil;
  1218. end;
  1219. constructor tai68k.op_csymbol_loc(op : tasmop;_size : topsize;_op1 : pcsymbol;_op2 : tlocation);
  1220. begin
  1221. inherited init;
  1222. typ:=ait_instruction;
  1223. _operator:=op;
  1224. op1t:=top_symbol;
  1225. op3t:=top_none;
  1226. size:=_size;
  1227. op1:=pointer(_op1);
  1228. if (_op2.loc=loc_register) or (_op2.loc=loc_cregister) then
  1229. begin
  1230. op2t:=top_reg;
  1231. op2:=pointer(_op2.register);
  1232. end
  1233. else
  1234. if _op2.reference.isintvalue then
  1235. begin
  1236. op2t:=top_const;
  1237. op2:=pointer(_op2.reference.offset);
  1238. end
  1239. else
  1240. begin
  1241. op2t:=top_ref;
  1242. op2:=pointer(newreference(_op2.reference));
  1243. end;
  1244. op3:=nil;
  1245. end;
  1246. destructor tai68k.done;
  1247. begin
  1248. if op1t=top_symbol then
  1249. disposecsymbol(pcsymbol(op1))
  1250. else if op1t=top_ref then
  1251. begin
  1252. clear_reference(preference(op1)^);
  1253. dispose(preference(op1));
  1254. end;
  1255. if op2t=top_symbol then
  1256. disposecsymbol(pcsymbol(op2))
  1257. else if op2t=top_ref then
  1258. begin
  1259. clear_reference(preference(op2)^);
  1260. dispose(preference(op2));
  1261. end;
  1262. if op3t=top_symbol then
  1263. disposecsymbol(pcsymbol(op3))
  1264. else if op3t = top_ref then
  1265. begin
  1266. clear_reference(preference(op3)^);
  1267. dispose(preference(op3));
  1268. end;
  1269. inherited done;
  1270. end;
  1271. constructor tai68k.op_ref_reglist(op: tasmop; _size : topsize; _op1: preference;_op2: tregisterlist);
  1272. Begin
  1273. Inherited Init;
  1274. typ:=ait_instruction;
  1275. _operator:=op;
  1276. op2t:=top_reglist;
  1277. op3t:=top_none;
  1278. size:=_size;
  1279. reglist := _op2;
  1280. if _op1^.isintvalue then
  1281. begin
  1282. op1t:=top_const;
  1283. op1:=pointer(_op1^.offset);
  1284. end
  1285. else
  1286. begin
  1287. op1t:=top_ref;
  1288. op1:=pointer(_op1);
  1289. end;
  1290. op3:=nil;
  1291. end;
  1292. constructor tai68k.op_reglist_ref(op: tasmop; _size : topsize; _op1: tregisterlist; _op2: preference);
  1293. Begin
  1294. Inherited Init;
  1295. typ:=ait_instruction;
  1296. _operator:=op;
  1297. reglist:=_op1;
  1298. op1t:=top_reglist;
  1299. op3t:=top_none;
  1300. size:=_size;
  1301. if _op2^.isintvalue then
  1302. begin
  1303. op2t:=top_const;
  1304. op2:=pointer(_op2^.offset);
  1305. end
  1306. else
  1307. begin
  1308. op2t:=top_ref;
  1309. op2:=pointer(_op2);
  1310. end;
  1311. op3:=nil;
  1312. end;
  1313. {****************************************************************************
  1314. TAI_LABELED
  1315. ****************************************************************************}
  1316. constructor tai_labeled.init(op : tasmop; l : plabel);
  1317. begin
  1318. inherited init;
  1319. typ:=ait_labeled_instruction;
  1320. _operator:=op;
  1321. _op1:=R_NO;
  1322. lab:=l;
  1323. lab^.is_used:=true;
  1324. inc(lab^.refcount);
  1325. end;
  1326. constructor tai_labeled.init_reg(op : tasmop; l : plabel; reg: tregister);
  1327. begin
  1328. inherited init;
  1329. typ:=ait_labeled_instruction;
  1330. _op1:=reg;
  1331. _operator:=op;
  1332. lab:=l;
  1333. lab^.is_used:=true;
  1334. inc(lab^.refcount);
  1335. end;
  1336. destructor tai_labeled.done;
  1337. begin
  1338. dec(lab^.refcount);
  1339. if lab^.refcount=0 then
  1340. Begin
  1341. lab^.is_used := False;
  1342. If Not(lab^.is_set) Then
  1343. Dispose(lab);
  1344. End;
  1345. inherited done;
  1346. end;
  1347. {****************************************************************************
  1348. TAI_EXTENDED
  1349. ****************************************************************************}
  1350. constructor tai_extended.init(_value : bestreal);
  1351. begin
  1352. inherited init;
  1353. typ:=ait_real_extended;
  1354. value:=_value;
  1355. end;
  1356. {****************************************************************************
  1357. TAI_COMP
  1358. ****************************************************************************}
  1359. constructor tai_comp.init(_value : bestreal);
  1360. begin
  1361. inherited init;
  1362. typ:=ait_comp;
  1363. value:=_value;
  1364. end;
  1365. end.
  1366. {
  1367. $Log$
  1368. Revision 1.1 1998-03-25 11:18:13 root
  1369. Initial revision
  1370. Revision 1.13 1998/03/10 01:17:20 peter
  1371. * all files have the same header
  1372. * messages are fully implemented, EXTDEBUG uses Comment()
  1373. + AG... files for the Assembler generation
  1374. Revision 1.12 1998/03/09 12:58:11 peter
  1375. * FWait warning is only showed for Go32V2 and $E+
  1376. * opcode tables moved to i386.pas/m68k.pas to reduce circular uses (and
  1377. for m68k the same tables are removed)
  1378. + $E for i386
  1379. Revision 1.11 1998/03/06 00:52:24 peter
  1380. * replaced all old messages from errore.msg, only ExtDebug and some
  1381. Comment() calls are left
  1382. * fixed options.pas
  1383. Revision 1.10 1998/03/02 01:48:43 peter
  1384. * renamed target_DOS to target_GO32V1
  1385. + new verbose system, merged old errors and verbose units into one new
  1386. verbose.pas, so errors.pas is obsolete
  1387. Revision 1.9 1998/02/13 10:35:09 daniel
  1388. * Made Motorola version compilable.
  1389. * Fixed optimizer
  1390. Revision 1.8 1998/02/12 11:50:13 daniel
  1391. Yes! Finally! After three retries, my patch!
  1392. Changes:
  1393. Complete rewrite of psub.pas.
  1394. Added support for DLL's.
  1395. Compiler requires less memory.
  1396. Platform units for each platform.
  1397. Revision 1.7 1998/01/11 03:38:05 carl
  1398. * bugfix op_reg_const , op3t was never initialized
  1399. Revision 1.3 1997/12/09 13:46:42 carl
  1400. + renamed pai_labeled68k --> pai_labeled
  1401. + added extended size constant
  1402. Revision 1.2 1997/11/28 18:14:37 pierre
  1403. working version with several bug fixes
  1404. Revision 1.1.1.1 1997/11/27 08:32:57 michael
  1405. FPC Compiler CVS start
  1406. Pre-CVS log:
  1407. History:
  1408. 30th september 1996:
  1409. + unit started
  1410. 15th october 1996:
  1411. + tai386 added
  1412. + some code from asmgen moved to this unit
  1413. 26th november 1996:
  1414. + tai386_labeled
  1415. ---------------------
  1416. 3rd september 1997:
  1417. + unit started
  1418. 5th september 1997:
  1419. + first version completed
  1420. 24 september 1997:
  1421. + minor fixes regarding register conventions (CEC)
  1422. 26 september 1997:
  1423. + added divs/muls tai68k constructor (CEC)
  1424. + added mc68020 instruction types (CEC)
  1425. + converted to work with v093 (CEC)
  1426. 4th october 1997:
  1427. + version v95 (CEC)
  1428. + added floating point flags (CEC)
  1429. + added op_reg_const opcode for LINK instruction. (CEC)
  1430. + added floating point branch / flags (CEC)
  1431. 2nd november 1997:
  1432. + instruction set for the 68000/68020/common FPU/common MMU is
  1433. now supposedely complete. (CEC).
  1434. 20th november 1997:
  1435. * changed LOC_FPUREGISTER to LOC_FPU same as in i386.pas (PM)
  1436. What is left to do:
  1437. o Create an opcode table to use in direct object output.
  1438. o Create an instruction template for MOVEM instruction.
  1439. }