diff options
author | florian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2012-09-06 15:11:58 +0000 |
---|---|---|
committer | florian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2012-09-06 15:11:58 +0000 |
commit | 90041581f1071a62324de861a32a9cccf9b185b2 (patch) | |
tree | 3ef1be017bf61c8607ff921fb8aac768cb0afb38 /compiler | |
parent | a1e29893763392b5ad2eb94a3dd80e2aecabb7cc (diff) | |
download | fpc-90041581f1071a62324de861a32a9cccf9b185b2.tar.gz |
* when creating method pointers, put them into registers
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@22341 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/ncgld.pas | 35 |
1 files changed, 14 insertions, 21 deletions
diff --git a/compiler/ncgld.pas b/compiler/ncgld.pas index ac344cf6bc..0b363c7487 100644 --- a/compiler/ncgld.pas +++ b/compiler/ncgld.pas @@ -459,13 +459,12 @@ implementation if assigned(left) then begin {$if sizeof(pint) = 4} - location_reset_ref(location,LOC_CREFERENCE,OS_64,sizeof(pint)); + location_reset(location,LOC_CREGISTER,OS_64); {$else} {$if sizeof(pint) = 8} - location_reset_ref(location,LOC_CREFERENCE,OS_128,sizeof(pint)); + location_reset(location,LOC_CREGISTER,OS_128); {$else} internalerror(20020520); {$endif} {$endif} - tg.gethltemp(current_asmdata.CurrAsmList,methodpointertype,methodpointertype.size,tt_normal,location.reference); secondpass(left); { load class instance/classrefdef address } @@ -479,27 +478,22 @@ implementation { this is not possible for objects } if is_object(left.resultdef) then internalerror(200304234); - hregister:=left.location.register; + location.registerhi:=left.location.register; end; LOC_CREFERENCE, LOC_REFERENCE: begin - hregister:=cg.getaddressregister(current_asmdata.CurrAsmList); + location.registerhi:=cg.getaddressregister(current_asmdata.CurrAsmList); if not is_object(left.resultdef) then - cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,left.location.reference,hregister) + cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,left.location.reference,location.registerhi) else - cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,left.location.reference,hregister); + cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,left.location.reference,location.registerhi); location_freetemp(current_asmdata.CurrAsmList,left.location); end; else internalerror(200610311); end; - { store the class instance or classredef address } - href:=location.reference; - inc(href.offset,sizeof(pint)); - cg.a_load_reg_ref(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,hregister,href); - { virtual method ? } if (po_virtualmethod in procdef.procoptions) and not(loadnf_inherited in loadnodeflags) and @@ -519,24 +513,23 @@ implementation if (left.resultdef.typ<>classrefdef) then begin { load vmt pointer } - reference_reset_base(href,hregister,tobjectdef(left.resultdef).vmt_offset,sizeof(pint)); + reference_reset_base(href,location.registerhi,tobjectdef(left.resultdef).vmt_offset,sizeof(pint)); hregister:=cg.getaddressregister(current_asmdata.CurrAsmList); cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,href,hregister); - end; + end + else + hregister:=location.registerhi; { load method address } reference_reset_base(href,hregister,tobjectdef(procdef.struct).vmtmethodoffset(procdef.extnumber),sizeof(pint)); - hregister:=cg.getaddressregister(current_asmdata.CurrAsmList); - cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,href,hregister); - { ... and store it } - cg.a_load_reg_ref(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,hregister,location.reference); + location.register:=cg.getaddressregister(current_asmdata.CurrAsmList); + cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,href,location.register); end else begin { load address of the function } reference_reset_symbol(href,current_asmdata.RefAsmSymbol(procdef.mangledname),0,sizeof(pint)); - hregister:=cg.getaddressregister(current_asmdata.CurrAsmList); - cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,href,hregister); - cg.a_load_reg_ref(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,hregister,location.reference); + location.register:=cg.getaddressregister(current_asmdata.CurrAsmList); + cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,href,location.register); end; end else |