aoptcpuc.pas 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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.1 2000-07-13 06:30:10 michael
  76. + Initial import
  77. Revision 1.3 2000/01/07 01:14:57 peter
  78. * updated copyright to 2000
  79. Revision 1.2 1999/11/09 22:57:09 peter
  80. * compiles again both i386,alpha both with optimizer
  81. Revision 1.1 1999/08/18 14:32:26 jonas
  82. + compilable!
  83. + dataflow analyzer finished
  84. + start of CSE units
  85. + aoptbase which contains a base object for all optimizer objects
  86. * some constants and type definitions moved around to avoid circular
  87. dependencies
  88. * moved some methods from base objects to specialized objects because
  89. they're not used anywhere else
  90. }