2
0

cgllvm.pas 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. {
  2. Copyright (c) 2010-2013 by Jonas Maebe
  3. This unit implements the code generator for LLVM
  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 cgllvm;
  18. {$i fpcdefs.inc}
  19. interface
  20. uses
  21. globtype,parabase,
  22. cgbase,cgutils,cgobj,cghlcpu,
  23. llvmbase,llvminfo,aasmbase,aasmtai,aasmdata,aasmllvm;
  24. type
  25. tcgllvm=class(thlbasecgcpu)
  26. public
  27. procedure a_label(list : TAsmList;l : tasmlabel);override;
  28. procedure a_jmp_always(list: TAsmList; l: tasmlabel); override;
  29. procedure init_register_allocators;override;
  30. procedure done_register_allocators;override;
  31. function getintregister(list:TAsmList;size:Tcgsize):Tregister;override;
  32. function getfpuregister(list:TAsmList;size:Tcgsize):Tregister;override;
  33. end;
  34. procedure create_codegen;
  35. implementation
  36. uses
  37. globals,verbose,systems,cutils,
  38. paramgr,fmodule,
  39. tgobj,rgllvm,cpubase,
  40. procinfo,cpupi;
  41. {****************************************************************************
  42. Assembler code
  43. ****************************************************************************}
  44. procedure tcgllvm.a_label(list: TAsmList; l: tasmlabel);
  45. begin
  46. { in llvm, every block must end with a terminator instruction, such as
  47. a branch -> if the previous instruction is not a terminator instruction,
  48. add an unconditional branch to the next block (= the one starting with
  49. this label) }
  50. if not assigned(list.last) or
  51. (tai(list.Last).typ<>ait_llvmins) or
  52. not(taillvm(list.Last).llvmopcode in llvmterminatoropcodes) then
  53. a_jmp_always(list,l);
  54. inherited;
  55. end;
  56. procedure tcgllvm.a_jmp_always(list: TAsmList; l: tasmlabel);
  57. begin
  58. list.concat(taillvm.op_lab(la_br,l));
  59. end;
  60. procedure tcgllvm.init_register_allocators;
  61. begin
  62. inherited init_register_allocators;
  63. rg[R_INTREGISTER]:=Trgllvm.create(R_INTREGISTER,R_SUBWHOLE,
  64. [0],first_int_imreg,[]);
  65. rg[R_FPUREGISTER]:=Trgllvm.create(R_FPUREGISTER,R_SUBWHOLE,
  66. [0],first_fpu_imreg,[]);
  67. rg[R_MMREGISTER]:=Trgllvm.create(R_MMREGISTER,R_SUBWHOLE,
  68. [0],first_mm_imreg,[]);
  69. { every temp gets its own "base register" to uniquely identify it }
  70. rg[R_TEMPREGISTER]:=trgllvm.Create(R_TEMPREGISTER,R_SUBWHOLE,
  71. [0],1,[]);
  72. end;
  73. procedure tcgllvm.done_register_allocators;
  74. begin
  75. rg[R_INTREGISTER].free;
  76. rg[R_FPUREGISTER].free;
  77. rg[R_MMREGISTER].free;
  78. rg[R_TEMPREGISTER].free;
  79. inherited done_register_allocators;
  80. end;
  81. function tcgllvm.getintregister(list:TAsmList;size:Tcgsize):Tregister;
  82. begin
  83. { all size determinations are based on tdef, subregisters are
  84. irrelevant }
  85. result:=rg[R_INTREGISTER].getregister(list,R_SUBWHOLE)
  86. end;
  87. function tcgllvm.getfpuregister(list:TAsmList;size:Tcgsize):Tregister;
  88. begin
  89. { all size determinations are based on tdef, subregisters are
  90. irrelevant }
  91. result:=rg[R_FPUREGISTER].getregister(list,R_SUBWHOLE);
  92. end;
  93. procedure create_codegen;
  94. begin
  95. cg:=tcgllvm.Create;
  96. end;
  97. end.