summaryrefslogtreecommitdiff
path: root/compiler/ncgld.pas
diff options
context:
space:
mode:
authorjonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2>2019-01-29 21:39:16 +0000
committerjonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2>2019-01-29 21:39:16 +0000
commit656e9aac04ca90d4999201c6226cb9ceff434c41 (patch)
tree50d694473d559277b42da2554a84b81d4570c239 /compiler/ncgld.pas
parentfc7f92b216a22e23b7aea4e9eafdc5f84dfbdd70 (diff)
downloadfpc-656e9aac04ca90d4999201c6226cb9ceff434c41.tar.gz
* fixed type correctness of and simplified the threadvar loading size
optimisation git-svn-id: https://svn.freepascal.org/svn/fpc/trunk@41135 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'compiler/ncgld.pas')
-rw-r--r--compiler/ncgld.pas11
1 files changed, 3 insertions, 8 deletions
diff --git a/compiler/ncgld.pas b/compiler/ncgld.pas
index bed8cd0cd7..636e864838 100644
--- a/compiler/ncgld.pas
+++ b/compiler/ncgld.pas
@@ -330,8 +330,9 @@ implementation
begin
{ Load a pointer to the thread var record into a register. }
{ This register will be used in both multithreaded and non-multithreaded cases. }
- hreg_tv_rec:=hlcg.getaddressregister(current_asmdata.CurrAsmList,fieldptrdef);
- hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,resultdef,fieldptrdef,tvref,hreg_tv_rec);
+ hreg_tv_rec:=hlcg.getaddressregister(current_asmdata.CurrAsmList,cpointerdef.getreusable(tv_rec));
+ hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,tv_rec,cpointerdef.getreusable(tv_rec),tvref,hreg_tv_rec);
+ reference_reset_base(tvref,hreg_tv_rec,0,ctempposinvalid,tvref.alignment,tvref.volatility)
end;
paraloc1.init;
paramanager.getintparaloc(current_asmdata.CurrAsmList,tprocvardef(pvd),1,paraloc1);
@@ -346,8 +347,6 @@ implementation
hlcg.g_set_addr_nonbitpacked_field_ref(current_asmdata.CurrAsmList,
tv_rec,
tfieldvarsym(tv_index_field),href);
- if size_opt then
- hlcg.reference_reset_base(href,tfieldvarsym(tv_index_field).vardef,hreg_tv_rec,href.offset,href.temppos,href.alignment,[]);
hlcg.a_load_ref_cgpara(current_asmdata.CurrAsmList,tfieldvarsym(tv_index_field).vardef,href,paraloc1);
{ Dealloc the threadvar record register before calling the helper function to allow }
{ the register allocator to assign non-mandatory real registers for hreg_tv_rec. }
@@ -377,10 +376,6 @@ implementation
hlcg.g_set_addr_nonbitpacked_field_ref(current_asmdata.CurrAsmList,
tv_rec,
tfieldvarsym(tv_non_mt_data_field),href);
- { load in the same "hregister" as above, so after this sequence
- the address of the threadvar is always in hregister }
- if size_opt then
- hlcg.reference_reset_base(href,fieldptrdef,hreg_tv_rec,href.offset,href.temppos,href.alignment,[]);
hlcg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList,resultdef,fieldptrdef,href,hregister);
hlcg.a_label(current_asmdata.CurrAsmList,endrelocatelab);