* added extra boolean parameter to getelementptr taillvm constructors to

indicate whether or not an implicit indirection should be added (always
    was done until now)

git-svn-id: branches/hlcgllvm@26989 -
This commit is contained in:
Jonas Maebe 2014-03-06 21:40:46 +00:00
parent cefcb856b6
commit e70175a10e
3 changed files with 41 additions and 19 deletions

View File

@ -91,9 +91,9 @@ interface
{ e.g. la_ret retdef retval } { e.g. la_ret retdef retval }
constructor op_size_reg(op:tllvmop;def: tdef;reg: tregister); constructor op_size_reg(op:tllvmop;def: tdef;reg: tregister);
{ e.g. dst = getelementptr ptrsize ref, i32 0 (implicit), index1type index1 } { e.g. dst = getelementptr ptrsize ref, i32 0 (if indirect), index1type index1 }
constructor getelementptr_reg_size_ref_size_reg(dst:tregister;ptrsize:tdef;const ref:treference;indextype: tdef;index1:tregister); constructor getelementptr_reg_size_ref_size_reg(dst:tregister;ptrsize:tdef;const ref:treference;indextype:tdef;index1:tregister;indirect:boolean);
constructor getelementptr_reg_size_ref_size_const(dst:tregister;ptrsize:tdef;const ref:treference;indextype: tdef;index1:ptrint); constructor getelementptr_reg_size_ref_size_const(dst:tregister;ptrsize:tdef;const ref:treference;indextype:tdef;index1:ptrint;indirect:boolean);
procedure loaddef(opidx: longint; _def: tdef); procedure loaddef(opidx: longint; _def: tdef);
procedure loaddouble(opidx: longint; _dval: double); procedure loaddouble(opidx: longint; _dval: double);
@ -648,31 +648,53 @@ uses
end; end;
constructor taillvm.getelementptr_reg_size_ref_size_reg(dst: tregister; ptrsize: tdef; const ref: treference; indextype: tdef; index1: tregister); constructor taillvm.getelementptr_reg_size_ref_size_reg(dst: tregister; ptrsize: tdef; const ref: treference; indextype: tdef; index1: tregister; indirect: boolean);
var
index: longint;
begin begin
create_llvm(la_getelementptr); create_llvm(la_getelementptr);
ops:=7; if indirect then
ops:=7
else
ops:=5;
loadreg(0,dst); loadreg(0,dst);
loaddef(1,ptrsize); loaddef(1,ptrsize);
loadref(2,ref); loadref(2,ref);
loaddef(3,s32inttype); if indirect then
loadconst(4,0); begin
loaddef(5,indextype); loaddef(3,s32inttype);
loadreg(6,index1); loadconst(4,0);
index:=5;
end
else
index:=3;
loaddef(index,indextype);
loadreg(index+1,index1);
end; end;
constructor taillvm.getelementptr_reg_size_ref_size_const(dst: tregister; ptrsize: tdef; const ref: treference; indextype: tdef; index1: ptrint); constructor taillvm.getelementptr_reg_size_ref_size_const(dst: tregister; ptrsize: tdef; const ref: treference; indextype: tdef; index1: ptrint; indirect: boolean);
var
index: longint;
begin begin
create_llvm(la_getelementptr); create_llvm(la_getelementptr);
ops:=7; if indirect then
ops:=7
else
ops:=5;
loadreg(0,dst); loadreg(0,dst);
loaddef(1,ptrsize); loaddef(1,ptrsize);
loadref(2,ref); loadref(2,ref);
loaddef(3,s32inttype); if indirect then
loadconst(4,0); begin
loaddef(5,indextype); loaddef(3,s32inttype);
loadconst(6,index1); loadconst(4,0);
index:=5;
end
else
index:=3;
loaddef(index,indextype);
loadconst(index+1,index1);
end; end;
end. end.

View File

@ -926,7 +926,7 @@ implementation
if ref.base<>NR_NO then if ref.base<>NR_NO then
internalerror(2012111301); internalerror(2012111301);
reference_reset_symbol(tmpref,ref.symbol,0,ref.alignment); reference_reset_symbol(tmpref,ref.symbol,0,ref.alignment);
list.concat(taillvm.getelementptr_reg_size_ref_size_const(hreg1,getpointerdef(def),tmpref,ptruinttype,0)); list.concat(taillvm.getelementptr_reg_size_ref_size_const(hreg1,getpointerdef(def),tmpref,ptruinttype,0,true));
end end
else if ref.base<>NR_NO then else if ref.base<>NR_NO then
begin begin

View File

@ -99,7 +99,7 @@ implementation
getarrelementptrdef; getarrelementptrdef;
hreg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,arrptrelementdef); hreg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,arrptrelementdef);
current_asmdata.CurrAsmList.Concat(taillvm.getelementptr_reg_size_ref_size_const(hreg,getpointerdef(left.resultdef), current_asmdata.CurrAsmList.Concat(taillvm.getelementptr_reg_size_ref_size_const(hreg,getpointerdef(left.resultdef),
locref^,ptruinttype,constarrayoffset)); locref^,ptruinttype,constarrayoffset,true));
reference_reset_base(locref^,hreg,0,locref^.alignment); reference_reset_base(locref^,hreg,0,locref^.alignment);
end; end;
@ -131,7 +131,7 @@ implementation
{ get address of indexed array element and convert pointer to array into { get address of indexed array element and convert pointer to array into
pointer to the elementdef in the process } pointer to the elementdef in the process }
current_asmdata.CurrAsmList.Concat(taillvm.getelementptr_reg_size_ref_size_reg(hreg,getpointerdef(left.resultdef), current_asmdata.CurrAsmList.Concat(taillvm.getelementptr_reg_size_ref_size_reg(hreg,getpointerdef(left.resultdef),
location.reference,ptruinttype,maybe_const_reg)); location.reference,ptruinttype,maybe_const_reg,true));
arraytopointerconverted:=true; arraytopointerconverted:=true;
reference_reset_base(location.reference,hreg,0,location.reference.alignment); reference_reset_base(location.reference,hreg,0,location.reference.alignment);
location.reference.alignment:=newalignment(location.reference.alignment,l); location.reference.alignment:=newalignment(location.reference.alignment,l);
@ -185,7 +185,7 @@ implementation
{ index the array using this chunk index } { index the array using this chunk index }
basereg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,getpointerdef(defloadsize)); basereg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,getpointerdef(defloadsize));
current_asmdata.CurrAsmList.Concat(taillvm.getelementptr_reg_size_ref_size_reg(basereg,getpointerdef(left.resultdef), current_asmdata.CurrAsmList.Concat(taillvm.getelementptr_reg_size_ref_size_reg(basereg,getpointerdef(left.resultdef),
sref.ref,ptruinttype,offsetreg)); sref.ref,ptruinttype,offsetreg,true));
arraytopointerconverted:=true; arraytopointerconverted:=true;
reference_reset_base(sref.ref,basereg,0,sref.ref.alignment); reference_reset_base(sref.ref,basereg,0,sref.ref.alignment);
{ calculate the bit index inside that chunk } { calculate the bit index inside that chunk }