mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-28 16:40:28 +02:00
* changeregsize -> rg.makeregsize
* changeregsize moved from cpubase to here
This commit is contained in:
parent
21593abffb
commit
1da6f9535c
@ -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)
|
||||||
@ -48,6 +48,13 @@ unit rgcpu;
|
|||||||
|
|
||||||
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;
|
||||||
var pushed : tpushedsaved;const s: tregisterset);
|
var pushed : tpushedsaved;const s: tregisterset);
|
||||||
@ -73,8 +80,73 @@ 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
|
||||||
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user