mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-16 05:59:28 +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
|
||||
|
||||
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;
|
||||
|
||||
implementation
|
||||
|
||||
uses
|
||||
hlcgobj, hlcg2ll,
|
||||
cgcpu;
|
||||
defutil,
|
||||
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;
|
||||
begin
|
||||
hlcg:=thlcg2ll.create;
|
||||
hlcg:=thlcgaarch64.create;
|
||||
create_codegen;
|
||||
end;
|
||||
|
||||
|
||||
end.
|
||||
|
Loading…
Reference in New Issue
Block a user