From cc596225fa3dda18b9a623d634bc4f5556e36d28 Mon Sep 17 00:00:00 2001 From: Jonas Maebe Date: Mon, 6 Oct 2014 20:54:33 +0000 Subject: [PATCH] + thlcg.g_ptrtypecast_reg/ref() to typecast a pointer in a register, or the pointer type describing a reference, to another pointer type git-svn-id: branches/hlcgllvm@28781 - --- compiler/hlcgobj.pas | 18 ++++++++++++++++++ compiler/llvm/hlcgllvm.pas | 20 ++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/compiler/hlcgobj.pas b/compiler/hlcgobj.pas index 178dc8b72a..be16c10de6 100644 --- a/compiler/hlcgobj.pas +++ b/compiler/hlcgobj.pas @@ -531,6 +531,14 @@ unit hlcgobj; for targets without pointers. } procedure g_reference_loc(list: TAsmList; def: tdef; const fromloc: tlocation; out toloc: tlocation); virtual; + { typecasts the pointer in reg to a new pointer. By default it does + nothing, only required for type-aware platforms like LLVM } + procedure g_ptrtypecast_reg(list: TAsmList; fromdef, todef: tpointerdef; reg: tregister); virtual; + { same but for a treference (considers the reference itself, not the + value stored at that place in memory). Replaces ref with a new + reference if necessary } + procedure g_ptrtypecast_ref(list: TAsmList; fromdef, todef: tpointerdef; var ref: treference); virtual; + { routines migrated from ncgutil } @@ -3790,6 +3798,16 @@ implementation end; end; + procedure thlcgobj.g_ptrtypecast_reg(list: TAsmList; fromdef, todef: tpointerdef; reg: tregister); + begin + { nothing to do } + end; + + procedure thlcgobj.g_ptrtypecast_ref(list: TAsmList; fromdef, todef: tpointerdef; var ref: treference); + begin + { nothing to do } + end; + procedure thlcgobj.location_force_reg(list: TAsmList; var l: tlocation; src_size, dst_size: tdef; maybeconst: boolean); var hregister, diff --git a/compiler/llvm/hlcgllvm.pas b/compiler/llvm/hlcgllvm.pas index 06c39da077..b01a472c4c 100644 --- a/compiler/llvm/hlcgllvm.pas +++ b/compiler/llvm/hlcgllvm.pas @@ -91,6 +91,9 @@ uses procedure g_overflowcheck(list: TAsmList; const Loc: tlocation; def: tdef); override; procedure g_overflowCheck_loc(List:TAsmList;const Loc:TLocation;def:TDef;var ovloc : tlocation); override; + procedure g_ptrtypecast_reg(list: TAsmList; fromdef, todef: tpointerdef; reg: tregister); override; + procedure g_ptrtypecast_ref(list: TAsmList; fromdef, todef: tpointerdef; var ref: treference); override; + procedure a_loadmm_ref_reg(list: TAsmList; fromsize, tosize: tdef; const ref: treference; reg: tregister; shuffle: pmmshuffle); override; procedure a_loadmm_reg_ref(list: TAsmList; fromsize, tosize: tdef; reg: tregister; const ref: treference; shuffle: pmmshuffle); override; procedure a_loadmm_reg_reg(list: TAsmList; fromsize, tosize: tdef; reg1, reg2: tregister; shuffle: pmmshuffle); override; @@ -1100,6 +1103,23 @@ implementation end; + procedure thlcgllvm.g_ptrtypecast_reg(list: TAsmList; fromdef, todef: tpointerdef; reg: tregister); + begin + { will insert a bitcast if necessary } + a_load_reg_reg(list,fromdef,todef,reg,reg); + end; + + + procedure thlcgllvm.g_ptrtypecast_ref(list: TAsmList; fromdef, todef: tpointerdef; var ref: treference); + var + hreg: tregister; + begin + hreg:=getaddresregister(list,todef); + a_loadaddr_ref_reg(list,fromdef.pointeddef,todef,ref,hreg); + reference_reset_base(ref,todef,hreg,0,ref.alignment); + end; + + procedure thlcgllvm.a_loadmm_ref_reg(list: TAsmList; fromsize, tosize: tdef; const ref: treference; reg: tregister; shuffle: pmmshuffle); var href: treference;