* 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:
nickysn 2017-09-11 15:23:59 +00:00
parent ddba821561
commit cf28b202eb
3 changed files with 61 additions and 67 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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