* tcgloadnode.pass_generate_code: fixes for i8086 far data model fixes in the

handling of method procsyms + even more ifdef i8086s removed

git-svn-id: trunk@27551 -
This commit is contained in:
nickysn 2014-04-12 19:59:04 +00:00
parent 68ff3fb1e2
commit 02988023b7

View File

@ -491,11 +491,16 @@ implementation
LOC_CREFERENCE, LOC_CREFERENCE,
LOC_REFERENCE: LOC_REFERENCE:
begin begin
location.registerhi:=cg.getaddressregister(current_asmdata.CurrAsmList);
if not is_object(left.resultdef) then if not is_object(left.resultdef) then
cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,left.location.reference,location.registerhi) begin
location.registerhi:=hlcg.getaddressregister(current_asmdata.CurrAsmList,left.resultdef);
hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,left.resultdef,left.resultdef,left.location.reference,location.registerhi)
end
else else
cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,left.location.reference,location.registerhi); begin
location.registerhi:=hlcg.getaddressregister(current_asmdata.CurrAsmList,voidpointertype);
hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,left.resultdef,voidpointertype,left.location.reference,location.registerhi);
end;
location_freetemp(current_asmdata.CurrAsmList,left.location); location_freetemp(current_asmdata.CurrAsmList,left.location);
end; end;
else else
@ -521,47 +526,23 @@ implementation
if (left.resultdef.typ<>classrefdef) then if (left.resultdef.typ<>classrefdef) then
begin begin
{ load vmt pointer } { load vmt pointer }
reference_reset_base(href,location.registerhi,tobjectdef(left.resultdef).vmt_offset,sizeof(pint)); hlcg.reference_reset_base(href,voidpointertype,location.registerhi,tobjectdef(left.resultdef).vmt_offset,voidpointertype.alignment);
hregister:=cg.getaddressregister(current_asmdata.CurrAsmList); hregister:=hlcg.getaddressregister(current_asmdata.CurrAsmList,voidpointertype);
cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,href,hregister); hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,voidpointertype,voidpointertype,href,hregister);
end end
else else
hregister:=location.registerhi; hregister:=location.registerhi;
{ load method address } { load method address }
{$ifdef i8086} hlcg.reference_reset_base(href,voidpointertype,hregister,tobjectdef(procdef.struct).vmtmethodoffset(procdef.extnumber),voidpointertype.alignment);
if po_far in procdef.procoptions then location.register:=hlcg.getaddressregister(current_asmdata.CurrAsmList,procdef.address_type);
begin hlcg.a_load_ref_reg(current_asmdata.CurrAsmList,procdef.address_type,procdef.address_type,href,location.register);
reference_reset_base(href,hregister,tobjectdef(procdef.struct).vmtmethodoffset(procdef.extnumber),4);
location.register:=cg.getintregister(current_asmdata.CurrAsmList,OS_32);
cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_32,OS_32,href,location.register);
end
else
{$endif i8086}
begin
reference_reset_base(href,hregister,tobjectdef(procdef.struct).vmtmethodoffset(procdef.extnumber),sizeof(pint));
location.register:=cg.getaddressregister(current_asmdata.CurrAsmList);
cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,href,location.register);
end;
end end
else else
begin begin
{ load address of the function } { load address of the function }
{$ifdef i8086} reference_reset_symbol(href,current_asmdata.RefAsmSymbol(procdef.mangledname),0,procdef.address_type.alignment);
if po_far in procdef.procoptions then location.register:=hlcg.getaddressregister(current_asmdata.CurrAsmList,procdef.address_type);
begin hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,procdef,procdef.address_type,href,location.register);
reference_reset_symbol(href,current_asmdata.RefAsmSymbol(procdef.mangledname),0,sizeof(pint));
location.register:=cg.getintregister(current_asmdata.CurrAsmList,OS_32);
cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,href,location.register);
href.refaddr:=addr_seg;
cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_16,OS_16,href,GetNextReg(location.register));
end
else
{$endif i8086}
begin
reference_reset_symbol(href,current_asmdata.RefAsmSymbol(procdef.mangledname),0,sizeof(pint));
location.register:=cg.getaddressregister(current_asmdata.CurrAsmList);
cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,href,location.register);
end;
end; end;
{ to get methodpointers stored correctly, code and self register must be swapped on { to get methodpointers stored correctly, code and self register must be swapped on