aoptcpuc.pas 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. {
  2. $Id$
  3. Copyright (c) 1999 by Jonas Maebe, member of the Free Pascal
  4. Development Team
  5. This unit contains the processor specific implementation of the
  6. assembler optimizer common subexpression elimination object.
  7. This program is free software; you can redistribute it and/or modify
  8. it under the terms of the GNU General Public License as published by
  9. the Free Software Foundation; either version 2 of the License, or
  10. (at your option) any later version.
  11. This program is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. GNU General Public License for more details.
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. ****************************************************************************
  19. }
  20. unit aoptcpuc;
  21. Interface
  22. Type
  23. TRegInfoCpu = Object(TRegInfo)
  24. Procedure AddReg(OldReg, NewReg: TRegister); Virtual;
  25. End;
  26. Implementation
  27. { ********************* TRegInfoCpu *****************}
  28. Procedure TRegInfoCpu.AddReg(OldReg, NewReg: TRegister);
  29. Begin
  30. NewRegsEncountered := NewRegsEncountered + [NewReg];
  31. OldRegsEncountered := OldRegsEncountered + [OldReg];
  32. New2OldReg[NewReg] := OldReg;
  33. Case OldReg Of
  34. R_EAX..R_EDI:
  35. Begin
  36. NewRegsEncountered := NewRegsEncountered + [Reg32toReg16(NewReg)];
  37. OldRegsEncountered := OldRegsEncountered + [Reg32toReg16(OldReg)];
  38. New2OldReg[Reg32toReg16(NewReg)] := Reg32toReg16(OldReg);
  39. If (NewReg in [R_EAX..R_EBX]) And
  40. (OldReg in [R_EAX..R_EBX]) Then
  41. Begin
  42. NewRegsEncountered := NewRegsEncountered + [Reg32toReg8(NewReg)];
  43. OldRegsEncountered := OldRegsEncountered + [Reg32toReg8(OldReg)];
  44. New2OldReg[Reg32toReg8(NewReg)] := Reg32toReg8(OldReg);
  45. End;
  46. End;
  47. R_AX..R_DI:
  48. Begin
  49. NewRegsEncountered := NewRegsEncountered + [Reg16toReg32(NewReg)];
  50. OldRegsEncountered := OldRegsEncountered + [Reg16toReg32(OldReg)];
  51. New2OldReg[Reg16toReg32(NewReg)] := Reg16toReg32(OldReg);
  52. If (NewReg in [R_AX..R_BX]) And
  53. (OldReg in [R_AX..R_BX]) Then
  54. Begin
  55. NewRegsEncountered := NewRegsEncountered + [Reg16toReg8(NewReg)];
  56. OldRegsEncountered := OldRegsEncountered + [Reg16toReg8(OldReg)];
  57. New2OldReg[Reg16toReg8(NewReg)] := Reg16toReg8(OldReg);
  58. End;
  59. End;
  60. R_AL..R_BL:
  61. Begin
  62. NewRegsEncountered := NewRegsEncountered + [Reg8toReg32(NewReg)]
  63. + [Reg8toReg16(NewReg)];
  64. OldRegsEncountered := OldRegsEncountered + [Reg8toReg32(OldReg)]
  65. + [Reg8toReg16(OldReg)];
  66. New2OldReg[Reg8toReg32(NewReg)] := Reg8toReg32(OldReg);
  67. End;
  68. End;
  69. End;
  70. End.
  71. {
  72. $Log$
  73. Revision 1.1 1999-08-18 14:32:26 jonas
  74. + compilable!
  75. + dataflow analyzer finished
  76. + start of CSE units
  77. + aoptbase which contains a base object for all optimizer objects
  78. * some constants and type definitions moved around to avoid circular
  79. dependencies
  80. * moved some methods from base objects to specialized objects because
  81. they're not used anywhere else
  82. }