|
@@ -33,7 +33,7 @@ unit rgcpu;
|
|
cpuinfo,
|
|
cpuinfo,
|
|
cpuasm,
|
|
cpuasm,
|
|
tainst,
|
|
tainst,
|
|
- cclasses,globtype,cgbase,aasm,rgobj;
|
|
|
|
|
|
+ cclasses,globtype,cgbase,aasm,cginfo,rgobj;
|
|
|
|
|
|
type
|
|
type
|
|
trgcpu = class(trgobj)
|
|
trgcpu = class(trgobj)
|
|
@@ -47,6 +47,13 @@ unit rgcpu;
|
|
procedure ungetregisterfpu(list: taasmoutput; r : tregister); override;
|
|
procedure ungetregisterfpu(list: taasmoutput; r : tregister); override;
|
|
|
|
|
|
procedure ungetreference(list: taasmoutput; const ref : treference); override;
|
|
procedure ungetreference(list: taasmoutput; const ref : treference); override;
|
|
|
|
+
|
|
|
|
+ {# Returns a subset register of the register r with the specified size.
|
|
|
|
+ WARNING: There is no clearing of the upper parts of the register,
|
|
|
|
+ if a 8-bit / 16-bit register is converted to a 32-bit register.
|
|
|
|
+ It is up to the code generator to correctly zero fill the register
|
|
|
|
+ }
|
|
|
|
+ function makeregsize(reg: tregister; size: tcgsize): tregister; override;
|
|
|
|
|
|
{ pushes and restores registers }
|
|
{ pushes and restores registers }
|
|
procedure pushusedregisters(list: taasmoutput;
|
|
procedure pushusedregisters(list: taasmoutput;
|
|
@@ -73,9 +80,74 @@ unit rgcpu;
|
|
uses
|
|
uses
|
|
systems,
|
|
systems,
|
|
globals,verbose,
|
|
globals,verbose,
|
|
- cginfo,tgobj,cga;
|
|
|
|
|
|
+ tgobj,cga;
|
|
|
|
+
|
|
|
|
+{************************************************************************}
|
|
|
|
+{ routine helpers }
|
|
|
|
+{************************************************************************}
|
|
|
|
+ const
|
|
|
|
+ reg2reg32 : array[tregister] of tregister = (R_NO,
|
|
|
|
+ R_EAX,R_ECX,R_EDX,R_EBX,R_ESP,R_EBP,R_ESI,R_EDI,
|
|
|
|
+ R_EAX,R_ECX,R_EDX,R_EBX,R_ESP,R_EBP,R_ESI,R_EDI,
|
|
|
|
+ R_EAX,R_ECX,R_EDX,R_EBX,R_NO,R_NO,R_NO,R_NO,
|
|
|
|
+ R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,
|
|
|
|
+ R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,
|
|
|
|
+ R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,
|
|
|
|
+ R_NO,R_NO,R_NO,R_NO,
|
|
|
|
+ R_NO,R_NO,R_NO,R_NO,R_NO,
|
|
|
|
+ R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,
|
|
|
|
+ R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO
|
|
|
|
+ );
|
|
|
|
+ reg2reg16 : array[tregister] of tregister = (R_NO,
|
|
|
|
+ R_AX,R_CX,R_DX,R_BX,R_SP,R_BP,R_SI,R_DI,
|
|
|
|
+ R_AX,R_CX,R_DX,R_BX,R_SP,R_BP,R_SI,R_DI,
|
|
|
|
+ R_AX,R_CX,R_DX,R_BX,R_NO,R_NO,R_NO,R_NO,
|
|
|
|
+ R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,
|
|
|
|
+ R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,
|
|
|
|
+ R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,
|
|
|
|
+ R_NO,R_NO,R_NO,R_NO,
|
|
|
|
+ R_NO,R_NO,R_NO,R_NO,R_NO,
|
|
|
|
+ R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,
|
|
|
|
+ R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO
|
|
|
|
+ );
|
|
|
|
+ reg2reg8 : array[tregister] of tregister = (R_NO,
|
|
|
|
+ R_AL,R_CL,R_DL,R_BL,R_NO,R_NO,R_NO,R_NO,
|
|
|
|
+ R_AL,R_CL,R_DL,R_BL,R_NO,R_NO,R_NO,R_NO,
|
|
|
|
+ R_AL,R_CL,R_DL,R_BL,R_NO,R_NO,R_NO,R_NO,
|
|
|
|
+ R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,
|
|
|
|
+ R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,
|
|
|
|
+ R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,
|
|
|
|
+ R_NO,R_NO,R_NO,R_NO,
|
|
|
|
+ R_NO,R_NO,R_NO,R_NO,R_NO,
|
|
|
|
+ R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,
|
|
|
|
+ R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO,R_NO
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ { convert a register to a specfied register size }
|
|
|
|
+ function changeregsize(r:tregister;size:topsize):tregister;
|
|
|
|
+ var
|
|
|
|
+ reg : tregister;
|
|
|
|
+ begin
|
|
|
|
+ case size of
|
|
|
|
+ S_B :
|
|
|
|
+ reg:=reg2reg8[r];
|
|
|
|
+ S_W :
|
|
|
|
+ reg:=reg2reg16[r];
|
|
|
|
+ S_L :
|
|
|
|
+ reg:=reg2reg32[r];
|
|
|
|
+ else
|
|
|
|
+ internalerror(200204101);
|
|
|
|
+ end;
|
|
|
|
+ if reg=R_NO then
|
|
|
|
+ internalerror(200204102);
|
|
|
|
+ changeregsize:=reg;
|
|
|
|
+ end;
|
|
|
|
|
|
|
|
|
|
|
|
+{************************************************************************}
|
|
|
|
+{ trgcpu }
|
|
|
|
+{************************************************************************}
|
|
|
|
+
|
|
function trgcpu.getregisterint(list: taasmoutput): tregister;
|
|
function trgcpu.getregisterint(list: taasmoutput): tregister;
|
|
begin
|
|
begin
|
|
if countunusedregsint=0 then
|
|
if countunusedregsint=0 then
|
|
@@ -139,7 +211,7 @@ unit rgcpu;
|
|
begin
|
|
begin
|
|
if r=R_NO then
|
|
if r=R_NO then
|
|
exit;
|
|
exit;
|
|
- r := changeregsize(r,S_L);
|
|
|
|
|
|
+ r := makeregsize(r,OS_INT);
|
|
if (r = R_EDI) or
|
|
if (r = R_EDI) or
|
|
((not assigned(procinfo^._class)) and (r = R_ESI)) then
|
|
((not assigned(procinfo^._class)) and (r = R_ESI)) then
|
|
begin
|
|
begin
|
|
@@ -326,13 +398,43 @@ unit rgcpu;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
+ function trgcpu.makeregsize(reg: tregister; size: tcgsize): tregister;
|
|
|
|
+
|
|
|
|
+ var
|
|
|
|
+ _result : topsize;
|
|
|
|
+ begin
|
|
|
|
+ case size of
|
|
|
|
+ OS_32,OS_S32:
|
|
|
|
+ begin
|
|
|
|
+ _result := S_L;
|
|
|
|
+ end;
|
|
|
|
+ OS_8,OS_S8:
|
|
|
|
+ begin
|
|
|
|
+ _result := S_B;
|
|
|
|
+ end;
|
|
|
|
+ OS_16,OS_S16:
|
|
|
|
+ begin
|
|
|
|
+ _result := S_W;
|
|
|
|
+ end;
|
|
|
|
+ else
|
|
|
|
+ internalerror(2001092312);
|
|
|
|
+ end;
|
|
|
|
+ makeregsize := changeregsize(reg,_result);
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
initialization
|
|
initialization
|
|
rg := trgcpu.create;
|
|
rg := trgcpu.create;
|
|
end.
|
|
end.
|
|
|
|
|
|
{
|
|
{
|
|
$Log$
|
|
$Log$
|
|
- Revision 1.4 2002-04-15 19:44:22 peter
|
|
|
|
|
|
+ Revision 1.5 2002-04-21 15:43:32 carl
|
|
|
|
+ * changeregsize -> rg.makeregsize
|
|
|
|
+ * changeregsize moved from cpubase to here
|
|
|
|
+
|
|
|
|
+ Revision 1.4 2002/04/15 19:44:22 peter
|
|
* fixed stackcheck that would be called recursively when a stack
|
|
* fixed stackcheck that would be called recursively when a stack
|
|
error was found
|
|
error was found
|
|
* generic changeregsize(reg,size) for i386 register resizing
|
|
* generic changeregsize(reg,size) for i386 register resizing
|