mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-11-07 09:59:39 +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 init_register_allocators;override;
|
||||||
procedure done_register_allocators;override;
|
procedure done_register_allocators;override;
|
||||||
|
|
||||||
function getintregister(list:TAsmList;size:Tcgsize):Tregister;override;
|
|
||||||
function getaddressregister(list:TAsmList):TRegister;override;
|
function getaddressregister(list:TAsmList):TRegister;override;
|
||||||
|
|
||||||
function GetHigh(const r : TRegister) : TRegister;inline;
|
function GetHigh(const r : TRegister) : TRegister;inline;
|
||||||
@ -157,50 +156,6 @@ unit cgcpu;
|
|||||||
end;
|
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;
|
function tcgavr.getaddressregister(list: TAsmList): TRegister;
|
||||||
begin
|
begin
|
||||||
Result:=getintregister(list,OS_ADDR);
|
Result:=getintregister(list,OS_ADDR);
|
||||||
|
|||||||
@ -611,10 +611,71 @@ implementation
|
|||||||
{$endif}
|
{$endif}
|
||||||
|
|
||||||
function tcg.getintregister(list:TAsmList;size:Tcgsize):Tregister;
|
function tcg.getintregister(list:TAsmList;size:Tcgsize):Tregister;
|
||||||
|
{$ifdef cpu8bitalu}
|
||||||
|
var
|
||||||
|
tmp1,tmp2,tmp3 : TRegister;
|
||||||
|
{$endif cpu8bitalu}
|
||||||
begin
|
begin
|
||||||
if not assigned(rg[R_INTREGISTER]) then
|
if not assigned(rg[R_INTREGISTER]) then
|
||||||
internalerror(200312122);
|
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));
|
result:=rg[R_INTREGISTER].getregister(list,cgsize2subreg(R_INTREGISTER,size));
|
||||||
|
{$endif}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -41,7 +41,6 @@ unit cgcpu;
|
|||||||
procedure init_register_allocators;override;
|
procedure init_register_allocators;override;
|
||||||
procedure do_register_allocation(list:TAsmList;headertai:tai);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;
|
function GetNextReg(const r: TRegister): TRegister;override;
|
||||||
|
|
||||||
procedure a_call_name(list : TAsmList;const s : string; weak: boolean);override;
|
procedure a_call_name(list : TAsmList;const s : string; weak: boolean);override;
|
||||||
@ -159,27 +158,6 @@ unit cgcpu;
|
|||||||
end;
|
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;
|
function tcg8086.GetNextReg(const r: TRegister): TRegister;
|
||||||
begin
|
begin
|
||||||
if getsupreg(r)<first_int_imreg then
|
if getsupreg(r)<first_int_imreg then
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user