mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-11-03 05:49:35 +01:00
* integrated the getintregister() implementation for 8-bit and 16-bit alus from
the avr and i8086 code generators into the base tcg class (so it can be reused by other 8-bit and 16-bit targets) git-svn-id: trunk@37181 -
This commit is contained in:
parent
ddba821561
commit
cf28b202eb
@ -44,7 +44,6 @@ unit cgcpu;
|
||||
procedure init_register_allocators;override;
|
||||
procedure done_register_allocators;override;
|
||||
|
||||
function getintregister(list:TAsmList;size:Tcgsize):Tregister;override;
|
||||
function getaddressregister(list:TAsmList):TRegister;override;
|
||||
|
||||
function GetHigh(const r : TRegister) : TRegister;inline;
|
||||
@ -157,50 +156,6 @@ unit cgcpu;
|
||||
end;
|
||||
|
||||
|
||||
function tcgavr.getintregister(list: TAsmList; size: Tcgsize): Tregister;
|
||||
var
|
||||
tmp1,tmp2,tmp3 : TRegister;
|
||||
begin
|
||||
case size of
|
||||
OS_8,OS_S8:
|
||||
Result:=inherited getintregister(list, size);
|
||||
OS_16,OS_S16:
|
||||
begin
|
||||
Result:=inherited getintregister(list, OS_8);
|
||||
{ ensure that the high register can be retrieved by
|
||||
GetNextReg
|
||||
}
|
||||
if inherited getintregister(list, OS_8)<>GetNextReg(Result) then
|
||||
internalerror(2011021331);
|
||||
end;
|
||||
OS_32,OS_S32:
|
||||
begin
|
||||
Result:=inherited getintregister(list, OS_8);
|
||||
tmp1:=inherited getintregister(list, OS_8);
|
||||
{ ensure that the high register can be retrieved by
|
||||
GetNextReg
|
||||
}
|
||||
if tmp1<>GetNextReg(Result) then
|
||||
internalerror(2011021332);
|
||||
tmp2:=inherited getintregister(list, OS_8);
|
||||
{ ensure that the upper register can be retrieved by
|
||||
GetNextReg
|
||||
}
|
||||
if tmp2<>GetNextReg(tmp1) then
|
||||
internalerror(2011021333);
|
||||
tmp3:=inherited getintregister(list, OS_8);
|
||||
{ ensure that the upper register can be retrieved by
|
||||
GetNextReg
|
||||
}
|
||||
if tmp3<>GetNextReg(tmp2) then
|
||||
internalerror(2011021334);
|
||||
end;
|
||||
else
|
||||
internalerror(2011021330);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
function tcgavr.getaddressregister(list: TAsmList): TRegister;
|
||||
begin
|
||||
Result:=getintregister(list,OS_ADDR);
|
||||
|
||||
@ -611,10 +611,71 @@ implementation
|
||||
{$endif}
|
||||
|
||||
function tcg.getintregister(list:TAsmList;size:Tcgsize):Tregister;
|
||||
{$ifdef cpu8bitalu}
|
||||
var
|
||||
tmp1,tmp2,tmp3 : TRegister;
|
||||
{$endif cpu8bitalu}
|
||||
begin
|
||||
if not assigned(rg[R_INTREGISTER]) then
|
||||
internalerror(200312122);
|
||||
{$if defined(cpu8bitalu)}
|
||||
case size of
|
||||
OS_8,OS_S8:
|
||||
Result:=rg[R_INTREGISTER].getregister(list,cgsize2subreg(R_INTREGISTER,size));
|
||||
OS_16,OS_S16:
|
||||
begin
|
||||
Result:=getintregister(list, OS_8);
|
||||
{ ensure that the high register can be retrieved by
|
||||
GetNextReg
|
||||
}
|
||||
if getintregister(list, OS_8)<>GetNextReg(Result) then
|
||||
internalerror(2011021331);
|
||||
end;
|
||||
OS_32,OS_S32:
|
||||
begin
|
||||
Result:=getintregister(list, OS_8);
|
||||
tmp1:=getintregister(list, OS_8);
|
||||
{ ensure that the high register can be retrieved by
|
||||
GetNextReg
|
||||
}
|
||||
if tmp1<>GetNextReg(Result) then
|
||||
internalerror(2011021332);
|
||||
tmp2:=getintregister(list, OS_8);
|
||||
{ ensure that the upper register can be retrieved by
|
||||
GetNextReg
|
||||
}
|
||||
if tmp2<>GetNextReg(tmp1) then
|
||||
internalerror(2011021333);
|
||||
tmp3:=getintregister(list, OS_8);
|
||||
{ ensure that the upper register can be retrieved by
|
||||
GetNextReg
|
||||
}
|
||||
if tmp3<>GetNextReg(tmp2) then
|
||||
internalerror(2011021334);
|
||||
end;
|
||||
else
|
||||
internalerror(2011021330);
|
||||
end;
|
||||
{$elseif defined(cpu16bitalu)}
|
||||
case size of
|
||||
OS_8, OS_S8,
|
||||
OS_16, OS_S16:
|
||||
Result:=rg[R_INTREGISTER].getregister(list,cgsize2subreg(R_INTREGISTER,size));
|
||||
OS_32, OS_S32:
|
||||
begin
|
||||
Result:=getintregister(list, OS_16);
|
||||
{ ensure that the high register can be retrieved by
|
||||
GetNextReg
|
||||
}
|
||||
if getintregister(list, OS_16)<>GetNextReg(Result) then
|
||||
internalerror(2013030202);
|
||||
end;
|
||||
else
|
||||
internalerror(2013030201);
|
||||
end;
|
||||
{$elseif defined(cpu32bitalu) or defined(cpu64bitalu)}
|
||||
result:=rg[R_INTREGISTER].getregister(list,cgsize2subreg(R_INTREGISTER,size));
|
||||
{$endif}
|
||||
end;
|
||||
|
||||
|
||||
|
||||
@ -41,7 +41,6 @@ unit cgcpu;
|
||||
procedure init_register_allocators;override;
|
||||
procedure do_register_allocation(list:TAsmList;headertai:tai);override;
|
||||
|
||||
function getintregister(list:TAsmList;size:Tcgsize):Tregister;override;
|
||||
function GetNextReg(const r: TRegister): TRegister;override;
|
||||
|
||||
procedure a_call_name(list : TAsmList;const s : string; weak: boolean);override;
|
||||
@ -159,27 +158,6 @@ unit cgcpu;
|
||||
end;
|
||||
|
||||
|
||||
function tcg8086.getintregister(list: TAsmList; size: Tcgsize): Tregister;
|
||||
begin
|
||||
case size of
|
||||
OS_8, OS_S8,
|
||||
OS_16, OS_S16:
|
||||
Result := inherited getintregister(list, size);
|
||||
OS_32, OS_S32:
|
||||
begin
|
||||
Result:=inherited getintregister(list, OS_16);
|
||||
{ ensure that the high register can be retrieved by
|
||||
GetNextReg
|
||||
}
|
||||
if inherited getintregister(list, OS_16)<>GetNextReg(Result) then
|
||||
internalerror(2013030202);
|
||||
end;
|
||||
else
|
||||
internalerror(2013030201);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
function tcg8086.GetNextReg(const r: TRegister): TRegister;
|
||||
begin
|
||||
if getsupreg(r)<first_int_imreg then
|
||||
|
||||
Loading…
Reference in New Issue
Block a user