aoptcpuc.pas 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. {
  2. $Id$
  3. Copyright (c) 1998-2000 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. Uses
  23. CpuBase,AOptCs;
  24. Type
  25. TRegInfoCpu = Object(TRegInfo)
  26. Procedure AddReg(OldReg, NewReg: TRegister); Virtual;
  27. End;
  28. Implementation
  29. { ********************* TRegInfoCpu *****************}
  30. Procedure TRegInfoCpu.AddReg(OldReg, NewReg: TRegister);
  31. Begin
  32. NewRegsEncountered := NewRegsEncountered + [NewReg];
  33. OldRegsEncountered := OldRegsEncountered + [OldReg];
  34. New2OldReg[NewReg] := OldReg;
  35. Case OldReg Of
  36. R_EAX..R_EDI:
  37. Begin
  38. NewRegsEncountered := NewRegsEncountered + [Reg32toReg16(NewReg)];
  39. OldRegsEncountered := OldRegsEncountered + [Reg32toReg16(OldReg)];
  40. New2OldReg[Reg32toReg16(NewReg)] := Reg32toReg16(OldReg);
  41. If (NewReg in [R_EAX..R_EBX]) And
  42. (OldReg in [R_EAX..R_EBX]) Then
  43. Begin
  44. NewRegsEncountered := NewRegsEncountered + [Reg32toReg8(NewReg)];
  45. OldRegsEncountered := OldRegsEncountered + [Reg32toReg8(OldReg)];
  46. New2OldReg[Reg32toReg8(NewReg)] := Reg32toReg8(OldReg);
  47. End;
  48. End;
  49. R_AX..R_DI:
  50. Begin
  51. NewRegsEncountered := NewRegsEncountered + [Reg16toReg32(NewReg)];
  52. OldRegsEncountered := OldRegsEncountered + [Reg16toReg32(OldReg)];
  53. New2OldReg[Reg16toReg32(NewReg)] := Reg16toReg32(OldReg);
  54. If (NewReg in [R_AX..R_BX]) And
  55. (OldReg in [R_AX..R_BX]) Then
  56. Begin
  57. NewRegsEncountered := NewRegsEncountered + [Reg16toReg8(NewReg)];
  58. OldRegsEncountered := OldRegsEncountered + [Reg16toReg8(OldReg)];
  59. New2OldReg[Reg16toReg8(NewReg)] := Reg16toReg8(OldReg);
  60. End;
  61. End;
  62. R_AL..R_BL:
  63. Begin
  64. NewRegsEncountered := NewRegsEncountered + [Reg8toReg32(NewReg)]
  65. + [Reg8toReg16(NewReg)];
  66. OldRegsEncountered := OldRegsEncountered + [Reg8toReg32(OldReg)]
  67. + [Reg8toReg16(OldReg)];
  68. New2OldReg[Reg8toReg32(NewReg)] := Reg8toReg32(OldReg);
  69. End;
  70. End;
  71. End;
  72. End.
  73. {
  74. $Log$
  75. Revision 1.2 2002-09-07 15:25:14 peter
  76. * old logs removed and tabs fixed
  77. }