cpupi.pas 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. {*****************************************************************************
  2. $Id$
  3. Copyright (c) 2002 by Florian Klaempfl
  4. This unit contains the CPU specific part of tprocinfo
  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. { This unit contains the CPU specific part of tprocinfo. }
  18. unit cpupi;
  19. {$INCLUDE fpcdefs.inc}
  20. interface
  21. uses
  22. cutils,
  23. cgbase,cpuinfo;
  24. type
  25. TSparcProcInfo=class(TProcInfo)
  26. {overall size of allocated stack space, currently this is used for the
  27. PowerPC only}
  28. LocalSize:aword;
  29. {max of space need for parameters, currently used by the PowerPC port only}
  30. maxpushedparasize:aword;
  31. constructor create;override;
  32. {According the the SPARC ABI the standard stack frame must include :
  33. * 16 word save for the in and local registers in case of overflow/underflow.
  34. this save area always must exist at the %o6+0,
  35. * software conventions requires space for the aggregate return value pointer, even if the word is not used,
  36. * althogh the first six words of arguments reside in registers, the standard
  37. stack frame reserves space for them. Arguments beond the sixth reside on the
  38. stack as in the Intel architecture,
  39. * other areas depend on the compiler and the code being compiled. The
  40. standard calling sequence does not define a maximum stack frame size, nor does
  41. it restrict how a language system uses the "unspecified" areas of the standard
  42. stack frame.}
  43. procedure after_header;override;
  44. procedure after_pass1;override;
  45. end;
  46. implementation
  47. uses
  48. tgobj;
  49. constructor TSparcprocinfo.create;
  50. begin
  51. inherited create;
  52. maxpushedparasize:=0;
  53. LocalSize:=0;
  54. end;
  55. procedure TSparcprocinfo.after_header;
  56. begin
  57. {First 16 words are in the frame are used to save registers in case of a
  58. register overflow/underflow.The 17th word is used to save the address of
  59. the variable which will receive the return value of the called function}
  60. Return_Offset:=16*4;
  61. procdef.parast.address_fixup:=(16+1)*4;
  62. end;
  63. procedure TSparcProcInfo.after_pass1;
  64. begin
  65. with ProcDef do
  66. begin
  67. {Reserve the stack for copying parameters passed into registers. By
  68. default we reserve space for the 6 input registers if the function had
  69. less parameters. Otherwise, we allocate data sizeof parameters}
  70. if parast.datasize>6*4
  71. then
  72. localst.address_fixup:=parast.address_fixup+parast.datasize
  73. else
  74. procdef.localst.address_fixup:=parast.address_fixup+6*4;
  75. firsttemp_offset:=localst.address_fixup+localst.datasize;
  76. with tg do
  77. begin
  78. SetFirstTemp(firsttemp_offset);
  79. //LastTemp:=firsttemp_offset;
  80. end;
  81. end;
  82. end;
  83. begin
  84. cprocinfo:=TSparcProcInfo;
  85. end.
  86. {
  87. $Log$
  88. Revision 1.11 2003-01-05 21:32:35 mazen
  89. * fixing several bugs compiling the RTL
  90. Revision 1.10 2002/12/24 21:30:20 mazen
  91. - some writeln(s) removed in compiler
  92. + many files added to RTL
  93. * some errors fixed in RTL
  94. Revision 1.9 2002/12/21 23:21:47 mazen
  95. + added support for the shift nodes
  96. + added debug output on screen with -an command line option
  97. Revision 1.8 2002/11/17 17:49:09 mazen
  98. + return_result_reg and function_result_reg are now used, in all plateforms, to pass functions result between called function and its caller. See the explanation of each one
  99. Revision 1.7 2002/11/14 21:42:08 mazen
  100. * fixing return value variable address
  101. Revision 1.6 2002/11/10 19:07:46 mazen
  102. * SPARC calling mechanism almost OK (as in GCC./mppcsparc )
  103. Revision 1.5 2002/11/03 20:22:40 mazen
  104. * parameter handling updated
  105. Revision 1.4 2002/10/20 19:01:38 mazen
  106. + op_raddr_reg and op_caddr_reg added to fix functions prologue
  107. Revision 1.3 2002/10/10 15:10:39 mazen
  108. * Internal error fixed, but usually i386 parameter model used
  109. Revision 1.2 2002/08/29 11:02:36 mazen
  110. added support for SPARC processors
  111. Revision 1.1 2002/08/23 10:08:28 mazen
  112. *** empty log message ***
  113. Revision 1.2 2002/08/18 20:06:30 peter
  114. * inlining is now also allowed in interface
  115. * renamed write/load to ppuwrite/ppuload
  116. * tnode storing in ppu
  117. * nld,ncon,nbas are already updated for storing in ppu
  118. Revision 1.1 2002/08/17 09:23:49 florian
  119. * first part of procinfo rewrite
  120. }