rgcpu.pas 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. {******************************************************************************
  2. $Id$
  3. Copyright (c) 1998-2002 by Florian Klaempfl
  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. unit rgcpu;
  17. { This unit implements the processor specific class for the register allocator}
  18. {$INCLUDE fpcdefs.inc}
  19. interface
  20. uses
  21. cpubase,
  22. cpuinfo,
  23. aasmcpu,
  24. aasmtai,
  25. cclasses,globtype,cgbase,aasmbase,rgobj;
  26. type
  27. {This class implements the cpu spaecific register allocator. It is used by the
  28. code generator to allocate and free registers which might be valid across
  29. nodes. It also contains utility routines related to registers. Some of the
  30. methods in this class overrides generic implementations in rgobj.pas.}
  31. trgcpu=class(trgobj)
  32. function GetExplicitRegisterInt(list:taasmoutput;Reg:Tnewregister):tregister;override;
  33. procedure UngetregisterInt(list:taasmoutput;Reg:tregister);override;
  34. end;
  35. implementation
  36. uses
  37. cgobj,verbose;
  38. function trgcpu.GetExplicitRegisterInt(list:taasmoutput;reg:Tnewregister):tregister;
  39. var r:Tregister;
  40. begin
  41. if (reg=RS_O7) or (reg=NR_I7)
  42. then
  43. begin
  44. r.enum:=R_INTREGISTER;
  45. r.number:=reg;
  46. cg.a_reg_alloc(list,r);
  47. result := r;
  48. end
  49. else result := inherited GetExplicitRegisterInt(list,reg);
  50. end;
  51. procedure trgcpu.UngetRegisterInt(list:taasmoutput;reg:tregister);
  52. begin
  53. if reg.enum<>R_INTREGISTER
  54. then
  55. internalerror(200302191);
  56. if (reg.number=RS_O7) or (reg.number=NR_I7)
  57. then
  58. cg.a_reg_dealloc(list,reg)
  59. else
  60. inherited ungetregisterint(list,reg);
  61. end;
  62. begin
  63. rg := trgcpu.create;
  64. end.
  65. {
  66. $Log$
  67. Revision 1.7 2003-03-10 21:59:54 mazen
  68. * fixing index overflow in handling new registers arrays.
  69. Revision 1.6 2003/02/19 22:00:17 daniel
  70. * Code generator converted to new register notation
  71. - Horribily outdated todo.txt removed
  72. Revision 1.5 2003/01/08 18:43:58 daniel
  73. * Tregister changed into a record
  74. Revision 1.4 2002/10/13 21:46:07 mazen
  75. * assembler output format fixed
  76. Revision 1.3 2002/10/12 19:03:23 mazen
  77. * Get/Unget expilit registers to be re-examined
  78. }