* 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 }
constructor op_size_reg(op:tllvmop;def: tdef;reg: tregister);
{ e.g. dst = getelementptr ptrsize ref, i32 0 (implicit), 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_const(dst:tregister;ptrsize:tdef;const ref:treference;indextype: tdef;index1:ptrint);
{ 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;indirect:boolean);
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 loaddouble(opidx: longint; _dval: double);
@ -648,31 +648,53 @@ uses
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
create_llvm(la_getelementptr);
ops:=7;
if indirect then
ops:=7
else
ops:=5;
loadreg(0,dst);
loaddef(1,ptrsize);
loadref(2,ref);
loaddef(3,s32inttype);
loadconst(4,0);
loaddef(5,indextype);
loadreg(6,index1);
if indirect then
begin
loaddef(3,s32inttype);
loadconst(4,0);
index:=5;
end
else
index:=3;
loaddef(index,indextype);
loadreg(index+1,index1);
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
create_llvm(la_getelementptr);
ops:=7;
if indirect then
ops:=7
else
ops:=5;
loadreg(0,dst);
loaddef(1,ptrsize);
loadref(2,ref);
loaddef(3,s32inttype);
loadconst(4,0);
loaddef(5,indextype);
loadconst(6,index1);
if indirect then
begin
loaddef(3,s32inttype);
loadconst(4,0);
index:=5;
end
else
index:=3;
loaddef(index,indextype);
loadconst(index+1,index1);
end;
end.

View File

@ -926,7 +926,7 @@ implementation
if ref.base<>NR_NO then
internalerror(2012111301);
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
else if ref.base<>NR_NO then
begin

View File

@ -99,7 +99,7 @@ implementation
getarrelementptrdef;
hreg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,arrptrelementdef);
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);
end;
@ -131,7 +131,7 @@ implementation
{ get address of indexed array element and convert pointer to array into
pointer to the elementdef in the process }
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;
reference_reset_base(location.reference,hreg,0,location.reference.alignment);
location.reference.alignment:=newalignment(location.reference.alignment,l);
@ -185,7 +185,7 @@ implementation
{ index the array using this chunk index }
basereg:=hlcg.getaddressregister(current_asmdata.CurrAsmList,getpointerdef(defloadsize));
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;
reference_reset_base(sref.ref,basereg,0,sref.ref.alignment);
{ calculate the bit index inside that chunk }