mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-12 14:09:17 +02:00
* optimized a_loadaddr_ref_reg() in cases where an offset is added to a
symbol or base register and the offset is a multiple of the def's size git-svn-id: branches/hlcgllvm@27007 -
This commit is contained in:
parent
c4869980e8
commit
abee66b611
@ -915,6 +915,7 @@ implementation
|
|||||||
|
|
||||||
function thlcgllvm.make_simple_ref(list: TAsmList; const ref: treference; def: tdef): treference;
|
function thlcgllvm.make_simple_ref(list: TAsmList; const ref: treference; def: tdef): treference;
|
||||||
var
|
var
|
||||||
|
ptrindex: tcgint;
|
||||||
hreg1,
|
hreg1,
|
||||||
hreg2: tregister;
|
hreg2: tregister;
|
||||||
tmpref: treference;
|
tmpref: treference;
|
||||||
@ -928,6 +929,22 @@ implementation
|
|||||||
result:=ref;
|
result:=ref;
|
||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
hreg2:=getaddressregister(list,getpointerdef(def));
|
||||||
|
{ symbol+offset or base+offset with offset a multiple of the size ->
|
||||||
|
use getelementptr }
|
||||||
|
if (ref.index=NR_NO) and
|
||||||
|
(ref.offset mod def.size=0) then
|
||||||
|
begin
|
||||||
|
ptrindex:=ref.offset div def.size;
|
||||||
|
if assigned(ref.symbol) then
|
||||||
|
reference_reset_symbol(tmpref,ref.symbol,0,ref.alignment)
|
||||||
|
else
|
||||||
|
reference_reset_base(tmpref,ref.base,0,ref.alignment);
|
||||||
|
list.concat(taillvm.getelementptr_reg_size_ref_size_const(hreg2,getpointerdef(def),tmpref,ptruinttype,ptrindex,assigned(ref.symbol)));
|
||||||
|
reference_reset_base(result,hreg2,0,ref.alignment);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
{ for now, perform all calculations using plain pointer arithmetic. Later
|
{ for now, perform all calculations using plain pointer arithmetic. Later
|
||||||
we can look into optimizations based on getelementptr for structured
|
we can look into optimizations based on getelementptr for structured
|
||||||
accesses (if only to prevent running out of virtual registers).
|
accesses (if only to prevent running out of virtual registers).
|
||||||
@ -963,7 +980,6 @@ implementation
|
|||||||
a_op_const_reg_reg(list,OP_ADD,ptruinttype,ref.offset,hreg1,hreg2);
|
a_op_const_reg_reg(list,OP_ADD,ptruinttype,ref.offset,hreg1,hreg2);
|
||||||
hreg1:=hreg2;
|
hreg1:=hreg2;
|
||||||
end;
|
end;
|
||||||
hreg2:=getaddressregister(list,getpointerdef(def));
|
|
||||||
a_load_reg_reg(list,ptruinttype,getpointerdef(def),hreg1,hreg2);
|
a_load_reg_reg(list,ptruinttype,getpointerdef(def),hreg1,hreg2);
|
||||||
reference_reset_base(result,hreg2,0,ref.alignment);
|
reference_reset_base(result,hreg2,0,ref.alignment);
|
||||||
end;
|
end;
|
||||||
|
Loading…
Reference in New Issue
Block a user