mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-20 19:29:26 +02:00
* converted tcgaddrnode.pass_generate_code to use the high level code generator,
which makes the i8086 overridden class unnecessary git-svn-id: trunk@27323 -
This commit is contained in:
parent
85d09b62e9
commit
e465ab355b
@ -31,10 +31,6 @@ interface
|
||||
node,nmem,ncgmem,nx86mem;
|
||||
|
||||
type
|
||||
ti8086addrnode = class(tcgaddrnode)
|
||||
procedure pass_generate_code;override;
|
||||
end;
|
||||
|
||||
ti8086derefnode = class(tx86derefnode)
|
||||
procedure pass_generate_code;override;
|
||||
end;
|
||||
@ -52,38 +48,6 @@ implementation
|
||||
defutil,hlcgobj,
|
||||
pass_2,ncgutil;
|
||||
|
||||
{*****************************************************************************
|
||||
TI8086ADDRNODE
|
||||
*****************************************************************************}
|
||||
|
||||
procedure ti8086addrnode.pass_generate_code;
|
||||
var
|
||||
segref: treference;
|
||||
begin
|
||||
if (current_settings.x86memorymodel in x86_far_code_models) and
|
||||
(left.nodetype=loadn) and
|
||||
(tloadnode(left).symtableentry.typ=labelsym) then
|
||||
begin
|
||||
secondpass(left);
|
||||
|
||||
location_reset(location,LOC_REGISTER,OS_32);
|
||||
location.register:=cg.getintregister(current_asmdata.CurrAsmList,OS_32);
|
||||
if not(left.location.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
|
||||
internalerror(2013091801);
|
||||
|
||||
{ load offset }
|
||||
cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,left.location.reference,location.register);
|
||||
|
||||
{ load segment }
|
||||
segref:=left.location.reference;
|
||||
segref.refaddr:=addr_seg;
|
||||
cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_16,OS_16,segref,GetNextReg(location.register));
|
||||
end
|
||||
else
|
||||
inherited;
|
||||
end;
|
||||
|
||||
|
||||
{*****************************************************************************
|
||||
TI8086DEREFNODE
|
||||
*****************************************************************************}
|
||||
@ -164,6 +128,5 @@ implementation
|
||||
|
||||
|
||||
begin
|
||||
caddrnode:=ti8086addrnode;
|
||||
cderefnode:=ti8086derefnode;
|
||||
end.
|
||||
|
@ -193,8 +193,8 @@ implementation
|
||||
begin
|
||||
secondpass(left);
|
||||
|
||||
location_reset(location,LOC_REGISTER,OS_ADDR);
|
||||
location.register:=cg.getaddressregister(current_asmdata.CurrAsmList);
|
||||
location_reset(location,LOC_REGISTER,int_cgsize(resultdef.size));
|
||||
location.register:=hlcg.getaddressregister(current_asmdata.CurrAsmList,resultdef);
|
||||
if not(left.location.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
|
||||
{ on x86_64-win64, array of chars can be returned in registers, however,
|
||||
when passing these arrays to other functions, the compiler wants to take
|
||||
@ -205,7 +205,7 @@ implementation
|
||||
hlcg.location_force_mem(current_asmdata.CurrAsmList,left.location,left.resultdef)
|
||||
else
|
||||
internalerror(2006111510);
|
||||
cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,left.location.reference,location.register);
|
||||
hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,left.resultdef,resultdef,left.location.reference,location.register);
|
||||
end;
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user