rgcpu.pas 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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 then
  54. internalerror(200302191);
  55. if (reg.number=RS_O7) or (reg.number=NR_I7)
  56. then
  57. cg.a_reg_dealloc(list,reg)
  58. else
  59. inherited ungetregisterint(list,reg);
  60. end;
  61. begin
  62. rg := trgcpu.create;
  63. end.
  64. {
  65. $Log$
  66. Revision 1.6 2003-02-19 22:00:17 daniel
  67. * Code generator converted to new register notation
  68. - Horribily outdated todo.txt removed
  69. Revision 1.5 2003/01/08 18:43:58 daniel
  70. * Tregister changed into a record
  71. Revision 1.4 2002/10/13 21:46:07 mazen
  72. * assembler output format fixed
  73. Revision 1.3 2002/10/12 19:03:23 mazen
  74. * Get/Unget expilit registers to be re-examined
  75. }