aasmllvm.pas 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. {
  2. Copyright (c) 1999-2002 by Jonas Maebe
  3. Contains the assembler object for the PowerPC
  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 aasmllvm;
  18. {$i fpcdefs.inc}
  19. interface
  20. uses
  21. globtype,verbose,
  22. aasmbase,aasmtai,aasmdata,
  23. cpubase,cgbase,cgutils,
  24. symtype,symdef,
  25. llvmbase;
  26. type
  27. { taillvm }
  28. taillvm = class(tai_cpu_abstract)
  29. llvmopcode: tllvmop;
  30. size1, size2: tllvmopsize;
  31. cond: topcmp;
  32. constructor create_llvm(op: tllvmop);
  33. constructor op_none(op : tllvmop);
  34. { e.g. dst = add size src1, src2 }
  35. constructor op_reg_size_reg_reg(op:tllvmop;dst:tregister;size:tllvmopsize;src1,src2:tregister);
  36. { e.g. dst = sub size 0, src2 }
  37. constructor op_reg_size_const_reg(op:tllvmop;dst:tregister;size:tllvmopsize;src1:aint;src2:tregister);
  38. { e.g. dst = bitcast size1 src to tosize }
  39. constructor op_reg_size_reg_size(op:tllvmop;dst:tregister;fromsize:tllvmopsize;src:tregister;tosize:tllvmopsize);
  40. { e.g. dst = bitcast fromsize 255 to tosize }
  41. constructor op_reg_size_const_size(op:tllvmop;dst:tregister;fromsize:tllvmopsize;src:aint;tosize:tllvmopsize);
  42. { e.g. dst = bitcast fromsize src to tosize }
  43. constructor op_reg_size_ref_size(op:tllvmop;dst:tregister;fromsize:tllvmopsize;const src:treference;tosize:tllvmopsize);
  44. { e.g. store fromsize src, ptrsize toref}
  45. constructor op_size_reg_size_ref(op:tllvmop;fromsize:tllvmopsize;src:tregister;ptrsize:tllvmopsize;const toref:treference);
  46. { e.g. dst = load presize fromref }
  47. constructor op_reg_size_ref(op:tllvmop;dst:tregister;fromsize:tllvmopsize;const fromref:treference);
  48. { e.g. dst = icmp cmpcond size reg1, reg2 }
  49. constructor op_reg_cond_size_reg_reg(op:tllvmop;dst:tregister;cmpcond:topcmp;size:tllvmopsize;reg1,reg2:tregister);
  50. { e.g. br label lab }
  51. constructor op_lab(op:tllvmop;lab:tasmlabel);
  52. { e.g. br i1 condreg, label iftrue, label iffalse }
  53. constructor op_size_reg_lab_lab(op:tllvmop;fromsize:tllvmopsize;condreg:tregister;labtrue,labfalse: tasmlabel);
  54. { e.g. la_ret retdef retval }
  55. constructor op_def_reg(op:tllvmop;def: tdef;reg: tregister);
  56. { e.g. dst = getelementptr ptrsize ref, index1type index1 }
  57. constructor getelementptr_reg_size_ref_size_reg(dst:tregister;ptrsize:tllvmopsize;const ref:treference;indextype: tllvmopsize;index1:tregister);
  58. { older variants, will be removed }
  59. constructor op_ressym_string(op: tllvmop; restyp: tasmsymbol; const str: ansistring);
  60. procedure loadstring(opidx:longint;_str: pchar);
  61. procedure loaddef(opidx:longint;_def: tdef);
  62. end;
  63. (*
  64. procedure InitLlvmAsm;
  65. procedure DoneLlvmAsm;
  66. *)
  67. implementation
  68. uses
  69. cutils, cclasses, strings, aasmcpu;
  70. {*****************************************************************************
  71. taicpu Constructors
  72. *****************************************************************************}
  73. constructor taillvm.create_llvm(op: tllvmop);
  74. begin
  75. create(a_none);
  76. llvmopcode:=op;
  77. typ:=ait_llvmins;
  78. end;
  79. procedure taillvm.loadstring(opidx:longint;_str: pchar);
  80. begin
  81. allocate_oper(opidx+1);
  82. with oper[opidx]^ do
  83. begin
  84. clearop(opidx);
  85. str:=strnew(_str);
  86. typ:=top_string;
  87. end;
  88. end;
  89. procedure taillvm.loaddef(opidx:longint;_def: tdef);
  90. begin
  91. allocate_oper(opidx+1);
  92. with oper[opidx]^ do
  93. begin
  94. if typ<>top_def then
  95. clearop(opidx);
  96. def:=_def;
  97. typ:=top_def;
  98. end;
  99. end;
  100. constructor taillvm.op_ressym_string(op: tllvmop; restyp: tasmsymbol; const str: ansistring);
  101. begin
  102. create_llvm(op);
  103. ops:=2;
  104. loadsymbol(0,restyp,0);
  105. loadstring(1,pchar(str));
  106. end;
  107. constructor taillvm.op_none(op : tllvmop);
  108. begin
  109. create_llvm(op);
  110. ops:=0;
  111. end;
  112. constructor taillvm.op_reg_size_reg_reg(op: tllvmop; dst: tregister;size: tllvmopsize; src1, src2: tregister);
  113. begin
  114. create_llvm(op);
  115. ops:=2;
  116. size1:=size;
  117. loadreg(0,dst);
  118. loadreg(1,src1);
  119. loadreg(2,src2);
  120. end;
  121. constructor taillvm.op_reg_size_const_reg(op: tllvmop; dst: tregister; size: tllvmopsize; src1: aint; src2: tregister);
  122. begin
  123. create_llvm(op);
  124. ops:=2;
  125. size1:=size;
  126. loadreg(0,dst);
  127. loadconst(1,src1);
  128. loadreg(2,src2);
  129. end;
  130. constructor taillvm.op_reg_size_reg_size(op: tllvmop; dst: tregister; fromsize: tllvmopsize; src: tregister; tosize: tllvmopsize);
  131. begin
  132. create_llvm(op);
  133. ops:=2;
  134. size1:=fromsize;
  135. size2:=tosize;
  136. loadreg(0,dst);
  137. loadreg(1,src);
  138. end;
  139. constructor taillvm.op_reg_size_const_size(op: tllvmop; dst: tregister; fromsize: tllvmopsize; src: aint; tosize: tllvmopsize);
  140. begin
  141. create_llvm(op);
  142. ops:=2;
  143. size1:=fromsize;
  144. size2:=tosize;
  145. loadreg(0,dst);
  146. loadconst(1,src);
  147. end;
  148. constructor taillvm.op_reg_size_ref_size(op: tllvmop; dst: tregister; fromsize: tllvmopsize; const src: treference; tosize: tllvmopsize);
  149. begin
  150. create_llvm(op);
  151. ops:=2;
  152. size1:=fromsize;
  153. size2:=tosize;
  154. loadreg(0,dst);
  155. loadref(1,src);
  156. end;
  157. constructor taillvm.op_size_reg_size_ref(op: tllvmop; fromsize: tllvmopsize; src: tregister; ptrsize: tllvmopsize; const toref: treference);
  158. begin
  159. create_llvm(op);
  160. ops:=2;
  161. size1:=fromsize;
  162. size2:=ptrsize;
  163. loadreg(0,src);
  164. loadref(1,toref);
  165. end;
  166. constructor taillvm.op_reg_size_ref(op: tllvmop; dst: tregister; fromsize: tllvmopsize; const fromref: treference);
  167. begin
  168. create_llvm(op);
  169. ops:=2;
  170. size1:=fromsize;
  171. loadreg(0,dst);
  172. loadref(1,fromref);
  173. end;
  174. constructor taillvm.op_reg_cond_size_reg_reg(op: tllvmop; dst: tregister; cmpcond: topcmp; size: tllvmopsize; reg1, reg2: tregister);
  175. begin
  176. create_llvm(op);
  177. ops:=3;
  178. size1:=size;
  179. cond:=cmpcond;
  180. loadreg(0,dst);
  181. loadreg(1,reg1);
  182. loadreg(2,reg2);
  183. end;
  184. constructor taillvm.op_lab(op: tllvmop; lab: tasmlabel);
  185. begin
  186. create_llvm(op);
  187. ops:=1;
  188. loadsymbol(0,lab,0);
  189. end;
  190. constructor taillvm.op_size_reg_lab_lab(op: tllvmop; fromsize: tllvmopsize; condreg: tregister; labtrue, labfalse: tasmlabel);
  191. begin
  192. create_llvm(op);
  193. size1:=fromsize;
  194. ops:=3;
  195. loadreg(0,condreg);
  196. loadsymbol(1,labtrue,0);
  197. loadsymbol(2,labfalse,0);
  198. end;
  199. constructor taillvm.op_def_reg(op: tllvmop; def: tdef; reg: tregister);
  200. begin
  201. create_llvm(op);
  202. ops:=2;
  203. loaddef(0,def);
  204. loadreg(1,reg);
  205. end;
  206. constructor taillvm.getelementptr_reg_size_ref_size_reg(dst: tregister; ptrsize: tllvmopsize; const ref: treference; indextype: tllvmopsize; index1: tregister);
  207. begin
  208. create_llvm(la_getelementptr);
  209. ops:=3;
  210. size1:=ptrsize;
  211. size2:=indextype;
  212. loadreg(0,dst);
  213. loadref(1,ref);
  214. loadreg(2,index1);
  215. end;
  216. end.