mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-17 02:59:13 +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 }
|
{ 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.
|
||||||
|
@ -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
|
||||||
|
@ -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 }
|
||||||
|
Loading…
Reference in New Issue
Block a user