mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-15 06:29:38 +02:00
+ AArch64 optimized version of a_load_subsetreg_reg()
git-svn-id: trunk@29961 -
This commit is contained in:
parent
c9de3b2ecd
commit
602853d40b
@ -28,18 +28,70 @@ unit hlcgcpu;
|
|||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
symtype,
|
||||||
|
aasmdata,
|
||||||
|
cgbase,cgutils,
|
||||||
|
hlcgobj, hlcg2ll;
|
||||||
|
|
||||||
|
type
|
||||||
|
thlcgaarch64 = class(thlcg2ll)
|
||||||
|
procedure a_load_subsetreg_reg(list: TAsmList; subsetsize, tosize: tdef; const sreg: tsubsetregister; destreg: tregister); override;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure create_hlcodegen;
|
procedure create_hlcodegen;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
uses
|
uses
|
||||||
hlcgobj, hlcg2ll,
|
defutil,
|
||||||
cgcpu;
|
cpubase,aasmcpu,
|
||||||
|
cgobj,cgcpu;
|
||||||
|
|
||||||
|
procedure thlcgaarch64.a_load_subsetreg_reg(list: TAsmList; subsetsize, tosize: tdef; const sreg: tsubsetregister; destreg: tregister);
|
||||||
|
var
|
||||||
|
op: tasmop;
|
||||||
|
tocgsize: tcgsize;
|
||||||
|
tmpdestreg: tregister;
|
||||||
|
begin
|
||||||
|
tocgsize:=def_cgsize(tosize);
|
||||||
|
if (sreg.startbit<>0) or
|
||||||
|
not(sreg.bitlen in [32,64]) then
|
||||||
|
begin
|
||||||
|
if is_signed(subsetsize) then
|
||||||
|
op:=A_SBFX
|
||||||
|
else
|
||||||
|
op:=A_UBFX;
|
||||||
|
{ source and destination register of SBFX/UBFX have to be the same size }
|
||||||
|
if (sreg.subsetregsize in [OS_64,OS_S64]) and
|
||||||
|
not(tocgsize in [OS_64,OS_S64]) then
|
||||||
|
tmpdestreg:=cg.getintregister(list,OS_64)
|
||||||
|
else if not(sreg.subsetregsize in [OS_64,OS_S64]) and
|
||||||
|
(tocgsize in [OS_64,OS_S64]) then
|
||||||
|
tmpdestreg:=cg.getintregister(list,OS_32)
|
||||||
|
else
|
||||||
|
tmpdestreg:=destreg;
|
||||||
|
list.concat(taicpu.op_reg_reg_const_const(op,tmpdestreg,sreg.subsetreg,sreg.startbit,sreg.bitlen));
|
||||||
|
{ need to sign extend further or truncate? }
|
||||||
|
if (sreg.subsetregsize=OS_S64) and
|
||||||
|
not(tocgsize in [OS_64,OS_S64]) then
|
||||||
|
cg.a_load_reg_reg(list,OS_S64,tocgsize,tmpdestreg,destreg)
|
||||||
|
else if is_signed(subsetsize) and
|
||||||
|
(tocgsize in [OS_8,OS_16]) then
|
||||||
|
cg.a_load_reg_reg(list,OS_32,tocgsize,tmpdestreg,destreg)
|
||||||
|
else if tmpdestreg<>destreg then
|
||||||
|
cg.a_load_reg_reg(list,def_cgsize(subsetsize),tocgsize,tmpdestreg,destreg)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
cg.a_load_reg_reg(list,def_cgsize(subsetsize),tocgsize,sreg.subsetreg,destreg);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure create_hlcodegen;
|
procedure create_hlcodegen;
|
||||||
begin
|
begin
|
||||||
hlcg:=thlcg2ll.create;
|
hlcg:=thlcgaarch64.create;
|
||||||
create_codegen;
|
create_codegen;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
Loading…
Reference in New Issue
Block a user