cpuasm.pas 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. {
  2. $Id$
  3. Copyright (c) 2000 by Florian Klaempfl
  4. Contains the assembler object for the ia64
  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 cpuasm;
  19. {$i fpcdefs.inc}
  20. interface
  21. uses
  22. cobjects,
  23. aasm,globals,verbose,
  24. cpubase;
  25. type
  26. pairegalloc = ^tairegalloc;
  27. tairegalloc = class(tai)
  28. allocation : boolean;
  29. reg : tregister;
  30. constructor alloc(r : tregister);
  31. constructor dealloc(r : tregister);
  32. end;
  33. { Types of operand }
  34. toptype=(top_none,top_reg,top_ref,top_const,top_symbol,top_qp);
  35. toper=record
  36. case typ : toptype of
  37. top_none : ();
  38. top_reg : (reg:tregister);
  39. top_qp : (qp : tqp);
  40. top_ref : (ref:preference);
  41. top_const : (val:int64);
  42. top_symbol : (sym:pasmsymbol;symofs:longint);
  43. end;
  44. paicpu = ^taicpu;
  45. taicpu = class(tai)
  46. is_jmp : boolean; { is this instruction a jump? (needed for optimizer) }
  47. opcode : tasmop;
  48. ops : array[0..4] of longint;
  49. oper : longint;
  50. qp : tqp;
  51. ldsttype : tldsttype;
  52. hint : thint;
  53. { ALU instructions }
  54. { A1,A9: integer ALU }
  55. constructor op_reg_reg_reg(op : tasmop;const r1,r2,r3 : tregister);
  56. { A2,A10: shift left and add }
  57. constructor op_reg_reg_const_reg(_qp : tqp;op : tasmop;
  58. const r1,r2 : tregister;i : byte;const r3 : tregister);
  59. { A3,A4,A5: integer ALU - imm.,register }
  60. constructor op_reg_const_reg(_qp : tqp;op : tasmop;
  61. const r1 : tregister;i : longint;const r3 : tregister);
  62. { A6,A7: integer compare - register,register }
  63. constructor op_preg_preg_reg_reg(_qp : tqp;op : tasmop;
  64. cond : tasmcond;p1,p2 : tqp;const r2,r3 : tregister);
  65. { A8: integer compare - imm.,register }
  66. constructor op_preg_preg_const_reg(_qp : tqp;op : tasmop;
  67. cond : tasmcond;p1,p2 : tqp;i : longint;const r3 : tregister);
  68. {!!!!!!!
  69. { multimedia shift and multiply }
  70. constructor op_reg_reg_reg_const(_qp : tqp;
  71. { multimedia mux }
  72. constructor op_reg_reg_mbtype(_qp : tqp;
  73. { multimedia shift fixed }
  74. constructor op_reg_reg_const(_qp : tqp;
  75. { div. }
  76. constructor op_reg_reg(_qp : tqp;
  77. { mm extract }
  78. constructor op_reg_reg_const_const(_qp : tqp;
  79. { zero and deposit imm }
  80. constructor op_reg_const_const_const(_qp : tqp;
  81. { deposit imm }
  82. constructor op_reg_const_reg_const_const(_qp : tqp;
  83. { deposit }
  84. constructor op_reg_reg_reg_const_const(_qp : tqp;
  85. { test bit }
  86. { !!!! here we need also to take care of the postfix }
  87. constructor op_preg_preg_reg_const(_qp : tqp;
  88. { test NaT }
  89. { !!!! here we need also to take care of the postfix }
  90. constructor op_preg_preg_reg(_qp : tqp;
  91. { -------- here are some missed ----------- }
  92. }
  93. { M1: integer load }
  94. { M4: integer store }
  95. { M6: floating-point load }
  96. { M9: floating-point store }
  97. constructor op_reg_ref(_qp : tqp;op : tasmop;postfix : tldsttype;
  98. _hint : thint;const r1 : tregister;ref : preference);
  99. { M2: integer load incremented by register }
  100. { M7: floating-point load incremented by register }
  101. constructor op_reg_ref_reg(_qp : tqp;op : tasmop;postfix : tldsttype;
  102. _hint : thint;const r1 : tregister;const ref : treference;
  103. const r2 : tregister);
  104. { M3: integer load increment by imm. }
  105. { M5: integer store increment by imm. }
  106. { M8: floating-point load increment by imm. }
  107. { M10: floating-point store increment by imm. }
  108. constructor op_reg_ref_const(_qp : tqp;op : tasmop;postfix : tldsttype;
  109. _hint : thint;const r1 : tregister;ref : preference;i : longint);
  110. { M11: floating-point load pair}
  111. constructor op_reg_ref(_qp : tqp;op : tasmop;postfix : tldsttype;
  112. _hint : thint;const r1,r2 : tregister;ref : preference);
  113. { M12: floating-point load pair increment by imm. }
  114. constructor op_reg_ref(_qp : tqp;op : tasmop;postfix : tldsttype;
  115. _hint : thint;const r1,r2 : tregister;ref : preference;i : longint);
  116. { X1: break/nop }
  117. constructor op_const62(_qp : tqp;op : tasmop;i : int64);
  118. { X2: move imm64 }
  119. constructor op_reg_const64(_qp : tqp;op : tasmop;const r1 : tregister;
  120. i : int64);
  121. end;
  122. { the following objects are special for the ia64 }
  123. { they decribe a stop and the bundles }
  124. paistop = ^taistop;
  125. taistop = class(tai)
  126. constructor init;
  127. end;
  128. { a second underscro indicates a stop }
  129. tbundletemplate = (but_none,but_mii,but_mii_,
  130. but_mi_i,but_mi_i_,but_mlx,but_mlx_,
  131. but_mmi,but_mmi_,but_m_mi,but_m_mi_,
  132. but_mfi,but_mfi_,but_mmf,but_mmf_,
  133. but_mif,but_mib_,but_mbb,but_mbb_,
  134. but_bbb,but_bbb_,but_mmb,but_mmb_,
  135. but_mfb,but_mfb_);
  136. paibundle = ^taibundle;
  137. taibundle = class(tai)
  138. template : tbundletemplate;
  139. instructions : array[0..1] of paicpu;
  140. end;
  141. implementation
  142. {*****************************************************************************
  143. TaiStop
  144. *****************************************************************************}
  145. constructor taistop.init;
  146. begin
  147. inherited create;
  148. typ:=ait_stop;
  149. end;
  150. {*****************************************************************************
  151. TaiRegAlloc
  152. *****************************************************************************}
  153. constructor tairegalloc.alloc(r : tregister);
  154. begin
  155. inherited create;
  156. typ:=ait_regalloc;
  157. allocation:=true;
  158. reg:=r;
  159. end;
  160. constructor tairegalloc.dealloc(r : tregister);
  161. begin
  162. inherited create;
  163. typ:=ait_regalloc;
  164. allocation:=false;
  165. reg:=r;
  166. end;
  167. {*****************************************************************************
  168. Taicpu
  169. *****************************************************************************}
  170. { ALU instructions }
  171. { A1,A9: integer ALU }
  172. constructor taicpu.op_reg_reg_reg(op : tasmop;const r1,r2,r3 : tregister);
  173. begin
  174. end;
  175. { A2,A10: shift left and add }
  176. constructor taicpu.op_reg_reg_const_reg(_qp : tqp;op : tasmop;
  177. const r1,r2 : tregister;i : byte;const r3 : tregister);
  178. begin
  179. end;
  180. { A3,A4,A5: integer ALU - imm.,register }
  181. constructor taicpu.op_reg_const_reg(_qp : tqp;op : tasmop;
  182. const r1 : tregister;i : longint;const r3 : tregister);
  183. begin
  184. end;
  185. { A6,A7: integer compare - register,register }
  186. constructor taicpu.op_preg_preg_reg_reg(_qp : tqp;op : tasmop;
  187. cond : tasmcond;p1,p2 : tqp;const r2,r3 : tregister);
  188. begin
  189. end;
  190. { A8: integer compare - imm.,register }
  191. constructor taicpu.op_preg_preg_const_reg(_qp : tqp;op : tasmop;
  192. cond : tasmcond;p1,p2 : tqp;i : longint;const r3 : tregister);
  193. begin
  194. end;
  195. { M1: integer load }
  196. { M4: integer store }
  197. { M6: floating-point load }
  198. { M9: floating-point store }
  199. constructor taicpu.op_reg_ref(_qp : tqp;op : tasmop;postfix : tldsttype;
  200. _hint : thint;const r1 : tregister;ref : preference);
  201. begin
  202. end;
  203. { M2: integer load incremented by register }
  204. { M7: floating-point load incremented by register }
  205. constructor taicpu.op_reg_ref_reg(_qp : tqp;op : tasmop;postfix : tldsttype;
  206. _hint : thint;const r1 : tregister;const ref : treference;
  207. const r2 : tregister);
  208. begin
  209. end;
  210. { M3: integer load increment by imm. }
  211. { M5: integer store increment by imm. }
  212. { M8: floating-point load increment by imm. }
  213. { M10: floating-point store increment by imm. }
  214. constructor taicpu.op_reg_ref_const(_qp : tqp;op : tasmop;postfix : tldsttype;
  215. _hint : thint;const r1 : tregister;ref : preference;i : longint);
  216. begin
  217. end;
  218. { M11: floating-point load pair}
  219. constructor taicpu.op_reg_ref(_qp : tqp;op : tasmop;postfix : tldsttype;
  220. _hint : thint;const r1,r2 : tregister;ref : preference);
  221. begin
  222. end;
  223. { M12: floating-point load pair increment by imm. }
  224. constructor taicpu.op_reg_ref(_qp : tqp;op : tasmop;postfix : tldsttype;
  225. _hint : thint;const r1,r2 : tregister;ref : preference;i : longint);
  226. begin
  227. end;
  228. { X1: break/nop }
  229. constructor taicpu.op_const62(_qp : tqp;op : tasmop;i : int64);
  230. { X2: move imm64 }
  231. begin
  232. end;
  233. constructor taicpu.op_reg_const64(_qp : tqp;op : tasmop;const r1 : tregister;
  234. i : int64);
  235. begin
  236. end;
  237. end.
  238. {
  239. $Log$
  240. Revision 1.4 2002-09-07 15:25:11 peter
  241. * old logs removed and tabs fixed
  242. Revision 1.3 2002/05/16 19:46:52 carl
  243. + defines.inc -> fpcdefs.inc to avoid conflicts if compiling by hand
  244. + try to fix temp allocation (still in ifdef)
  245. + generic constructor calls
  246. + start of tassembler / tmodulebase class cleanup
  247. }