mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-10 07:08:56 +02:00
* 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:
parent
cefcb856b6
commit
e70175a10e
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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 }
|
||||
|
Loading…
Reference in New Issue
Block a user