cpuasm.pas 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. {
  2. Copyright (c) 2000 by Florian Klaempfl
  3. Contains the assembler object for the ia64
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation; either version 2 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program; if not, write to the Free Software
  14. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  15. ****************************************************************************
  16. }
  17. unit cpuasm;
  18. {$i fpcdefs.inc}
  19. interface
  20. uses
  21. cobjects,
  22. aasm,globals,verbose,
  23. cpubase;
  24. type
  25. pairegalloc = ^tairegalloc;
  26. tairegalloc = class(tai)
  27. allocation : boolean;
  28. reg : tregister;
  29. constructor alloc(r : tregister);
  30. constructor dealloc(r : tregister);
  31. end;
  32. { Types of operand }
  33. toptype=(top_none,top_reg,top_ref,top_const,top_symbol,top_qp);
  34. toper=record
  35. case typ : toptype of
  36. top_none : ();
  37. top_reg : (reg:tregister);
  38. top_qp : (qp : tqp);
  39. top_ref : (ref:preference);
  40. top_const : (val:int64);
  41. top_symbol : (sym:pasmsymbol;symofs:longint);
  42. end;
  43. paicpu = ^taicpu;
  44. taicpu = class(tai)
  45. is_jmp : boolean; { is this instruction a jump? (needed for optimizer) }
  46. opcode : tasmop;
  47. ops : array[0..4] of longint;
  48. oper : longint;
  49. qp : tqp;
  50. ldsttype : tldsttype;
  51. hint : thint;
  52. { ALU instructions }
  53. { A1,A9: integer ALU }
  54. constructor op_reg_reg_reg(op : tasmop;const r1,r2,r3 : tregister);
  55. { A2,A10: shift left and add }
  56. constructor op_reg_reg_const_reg(_qp : tqp;op : tasmop;
  57. const r1,r2 : tregister;i : byte;const r3 : tregister);
  58. { A3,A4,A5: integer ALU - imm.,register }
  59. constructor op_reg_const_reg(_qp : tqp;op : tasmop;
  60. const r1 : tregister;i : longint;const r3 : tregister);
  61. { A6,A7: integer compare - register,register }
  62. constructor op_preg_preg_reg_reg(_qp : tqp;op : tasmop;
  63. cond : tasmcond;p1,p2 : tqp;const r2,r3 : tregister);
  64. { A8: integer compare - imm.,register }
  65. constructor op_preg_preg_const_reg(_qp : tqp;op : tasmop;
  66. cond : tasmcond;p1,p2 : tqp;i : longint;const r3 : tregister);
  67. {!!!!!!!
  68. { multimedia shift and multiply }
  69. constructor op_reg_reg_reg_const(_qp : tqp;
  70. { multimedia mux }
  71. constructor op_reg_reg_mbtype(_qp : tqp;
  72. { multimedia shift fixed }
  73. constructor op_reg_reg_const(_qp : tqp;
  74. { div. }
  75. constructor op_reg_reg(_qp : tqp;
  76. { mm extract }
  77. constructor op_reg_reg_const_const(_qp : tqp;
  78. { zero and deposit imm }
  79. constructor op_reg_const_const_const(_qp : tqp;
  80. { deposit imm }
  81. constructor op_reg_const_reg_const_const(_qp : tqp;
  82. { deposit }
  83. constructor op_reg_reg_reg_const_const(_qp : tqp;
  84. { test bit }
  85. { !!!! here we need also to take care of the postfix }
  86. constructor op_preg_preg_reg_const(_qp : tqp;
  87. { test NaT }
  88. { !!!! here we need also to take care of the postfix }
  89. constructor op_preg_preg_reg(_qp : tqp;
  90. { -------- here are some missed ----------- }
  91. }
  92. { M1: integer load }
  93. { M4: integer store }
  94. { M6: floating-point load }
  95. { M9: floating-point store }
  96. constructor op_reg_ref(_qp : tqp;op : tasmop;postfix : tldsttype;
  97. _hint : thint;const r1 : tregister;ref : preference);
  98. { M2: integer load incremented by register }
  99. { M7: floating-point load incremented by register }
  100. constructor op_reg_ref_reg(_qp : tqp;op : tasmop;postfix : tldsttype;
  101. _hint : thint;const r1 : tregister;const ref : treference;
  102. const r2 : tregister);
  103. { M3: integer load increment by imm. }
  104. { M5: integer store increment by imm. }
  105. { M8: floating-point load increment by imm. }
  106. { M10: floating-point store increment by imm. }
  107. constructor op_reg_ref_const(_qp : tqp;op : tasmop;postfix : tldsttype;
  108. _hint : thint;const r1 : tregister;ref : preference;i : longint);
  109. { M11: floating-point load pair}
  110. constructor op_reg_ref(_qp : tqp;op : tasmop;postfix : tldsttype;
  111. _hint : thint;const r1,r2 : tregister;ref : preference);
  112. { M12: floating-point load pair increment by imm. }
  113. constructor op_reg_ref(_qp : tqp;op : tasmop;postfix : tldsttype;
  114. _hint : thint;const r1,r2 : tregister;ref : preference;i : longint);
  115. { X1: break/nop }
  116. constructor op_const62(_qp : tqp;op : tasmop;i : int64);
  117. { X2: move imm64 }
  118. constructor op_reg_const64(_qp : tqp;op : tasmop;const r1 : tregister;
  119. i : int64);
  120. end;
  121. { the following objects are special for the ia64 }
  122. { they decribe a stop and the bundles }
  123. paistop = ^taistop;
  124. taistop = class(tai)
  125. constructor init;
  126. end;
  127. { a second underscro indicates a stop }
  128. tbundletemplate = (but_none,but_mii,but_mii_,
  129. but_mi_i,but_mi_i_,but_mlx,but_mlx_,
  130. but_mmi,but_mmi_,but_m_mi,but_m_mi_,
  131. but_mfi,but_mfi_,but_mmf,but_mmf_,
  132. but_mif,but_mib_,but_mbb,but_mbb_,
  133. but_bbb,but_bbb_,but_mmb,but_mmb_,
  134. but_mfb,but_mfb_);
  135. paibundle = ^taibundle;
  136. taibundle = class(tai)
  137. template : tbundletemplate;
  138. instructions : array[0..1] of paicpu;
  139. end;
  140. implementation
  141. {*****************************************************************************
  142. TaiStop
  143. *****************************************************************************}
  144. constructor taistop.init;
  145. begin
  146. inherited create;
  147. typ:=ait_stop;
  148. end;
  149. {*****************************************************************************
  150. TaiRegAlloc
  151. *****************************************************************************}
  152. constructor tairegalloc.alloc(r : tregister);
  153. begin
  154. inherited create;
  155. typ:=ait_regalloc;
  156. allocation:=true;
  157. reg:=r;
  158. end;
  159. constructor tairegalloc.dealloc(r : tregister);
  160. begin
  161. inherited create;
  162. typ:=ait_regalloc;
  163. allocation:=false;
  164. reg:=r;
  165. end;
  166. {*****************************************************************************
  167. Taicpu
  168. *****************************************************************************}
  169. { ALU instructions }
  170. { A1,A9: integer ALU }
  171. constructor taicpu.op_reg_reg_reg(op : tasmop;const r1,r2,r3 : tregister);
  172. begin
  173. end;
  174. { A2,A10: shift left and add }
  175. constructor taicpu.op_reg_reg_const_reg(_qp : tqp;op : tasmop;
  176. const r1,r2 : tregister;i : byte;const r3 : tregister);
  177. begin
  178. end;
  179. { A3,A4,A5: integer ALU - imm.,register }
  180. constructor taicpu.op_reg_const_reg(_qp : tqp;op : tasmop;
  181. const r1 : tregister;i : longint;const r3 : tregister);
  182. begin
  183. end;
  184. { A6,A7: integer compare - register,register }
  185. constructor taicpu.op_preg_preg_reg_reg(_qp : tqp;op : tasmop;
  186. cond : tasmcond;p1,p2 : tqp;const r2,r3 : tregister);
  187. begin
  188. end;
  189. { A8: integer compare - imm.,register }
  190. constructor taicpu.op_preg_preg_const_reg(_qp : tqp;op : tasmop;
  191. cond : tasmcond;p1,p2 : tqp;i : longint;const r3 : tregister);
  192. begin
  193. end;
  194. { M1: integer load }
  195. { M4: integer store }
  196. { M6: floating-point load }
  197. { M9: floating-point store }
  198. constructor taicpu.op_reg_ref(_qp : tqp;op : tasmop;postfix : tldsttype;
  199. _hint : thint;const r1 : tregister;ref : preference);
  200. begin
  201. end;
  202. { M2: integer load incremented by register }
  203. { M7: floating-point load incremented by register }
  204. constructor taicpu.op_reg_ref_reg(_qp : tqp;op : tasmop;postfix : tldsttype;
  205. _hint : thint;const r1 : tregister;const ref : treference;
  206. const r2 : tregister);
  207. begin
  208. end;
  209. { M3: integer load increment by imm. }
  210. { M5: integer store increment by imm. }
  211. { M8: floating-point load increment by imm. }
  212. { M10: floating-point store increment by imm. }
  213. constructor taicpu.op_reg_ref_const(_qp : tqp;op : tasmop;postfix : tldsttype;
  214. _hint : thint;const r1 : tregister;ref : preference;i : longint);
  215. begin
  216. end;
  217. { M11: floating-point load pair}
  218. constructor taicpu.op_reg_ref(_qp : tqp;op : tasmop;postfix : tldsttype;
  219. _hint : thint;const r1,r2 : tregister;ref : preference);
  220. begin
  221. end;
  222. { M12: floating-point load pair increment by imm. }
  223. constructor taicpu.op_reg_ref(_qp : tqp;op : tasmop;postfix : tldsttype;
  224. _hint : thint;const r1,r2 : tregister;ref : preference;i : longint);
  225. begin
  226. end;
  227. { X1: break/nop }
  228. constructor taicpu.op_const62(_qp : tqp;op : tasmop;i : int64);
  229. { X2: move imm64 }
  230. begin
  231. end;
  232. constructor taicpu.op_reg_const64(_qp : tqp;op : tasmop;const r1 : tregister;
  233. i : int64);
  234. begin
  235. end;
  236. end.