mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-14 00:02:06 +02:00
* unified g_concatcopy_move
This commit is contained in:
parent
ac8fefbc2b
commit
f49da05633
@ -101,7 +101,6 @@ interface
|
||||
procedure g_maybe_got_init(list: TAsmList); override;
|
||||
procedure g_restore_registers(list: TAsmList);override;
|
||||
procedure g_save_registers(list: TAsmList);override;
|
||||
procedure g_concatcopy_move(list: TAsmList; const source, dest: treference; len: tcgint);
|
||||
procedure g_concatcopy(list: TAsmList; const source, dest: treference; len: tcgint);override;
|
||||
procedure g_adjust_self_value(list: TAsmList; procdef: tprocdef; ioffset: tcgint);override;
|
||||
procedure g_check_for_fpu_exception(list: TAsmList; force, clear: boolean);override;
|
||||
@ -2168,37 +2167,6 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
{ ************* concatcopy ************ }
|
||||
|
||||
procedure tcgaarch64.g_concatcopy_move(list : TAsmList;const source,dest : treference;len : tcgint);
|
||||
var
|
||||
paraloc1,paraloc2,paraloc3 : TCGPara;
|
||||
pd : tprocdef;
|
||||
begin
|
||||
pd:=search_system_proc('MOVE');
|
||||
paraloc1.init;
|
||||
paraloc2.init;
|
||||
paraloc3.init;
|
||||
paramanager.getcgtempparaloc(list,pd,1,paraloc1);
|
||||
paramanager.getcgtempparaloc(list,pd,2,paraloc2);
|
||||
paramanager.getcgtempparaloc(list,pd,3,paraloc3);
|
||||
a_load_const_cgpara(list,OS_SINT,len,paraloc3);
|
||||
a_loadaddr_ref_cgpara(list,dest,paraloc2);
|
||||
a_loadaddr_ref_cgpara(list,source,paraloc1);
|
||||
paramanager.freecgpara(list,paraloc3);
|
||||
paramanager.freecgpara(list,paraloc2);
|
||||
paramanager.freecgpara(list,paraloc1);
|
||||
alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
alloccpuregisters(list,R_MMREGISTER,paramanager.get_volatile_registers_mm(pocall_default));
|
||||
a_call_name(list,'FPC_MOVE',false);
|
||||
dealloccpuregisters(list,R_MMREGISTER,paramanager.get_volatile_registers_mm(pocall_default));
|
||||
dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
paraloc3.done;
|
||||
paraloc2.done;
|
||||
paraloc1.done;
|
||||
end;
|
||||
|
||||
|
||||
procedure tcgaarch64.g_concatcopy(list: TAsmList; const source, dest: treference; len: tcgint);
|
||||
|
||||
var
|
||||
|
@ -86,7 +86,6 @@ unit cgcpu;
|
||||
|
||||
procedure g_concatcopy(list : TAsmList;const source,dest : treference;len : tcgint);override;
|
||||
procedure g_concatcopy_unaligned(list : TAsmList;const source,dest : treference;len : tcgint);override;
|
||||
procedure g_concatcopy_move(list : TAsmList;const source,dest : treference;len : tcgint);
|
||||
procedure g_concatcopy_internal(list : TAsmList;const source,dest : treference;len : tcgint;aligned : boolean);
|
||||
|
||||
procedure g_overflowcheck(list: TAsmList; const l: tlocation; def: tdef); override;
|
||||
@ -2669,35 +2668,6 @@ unit cgcpu;
|
||||
end;
|
||||
|
||||
|
||||
procedure tbasecgarm.g_concatcopy_move(list : TAsmList;const source,dest : treference;len : tcgint);
|
||||
var
|
||||
paraloc1,paraloc2,paraloc3 : TCGPara;
|
||||
pd : tprocdef;
|
||||
begin
|
||||
pd:=search_system_proc('MOVE');
|
||||
paraloc1.init;
|
||||
paraloc2.init;
|
||||
paraloc3.init;
|
||||
paramanager.getcgtempparaloc(list,pd,1,paraloc1);
|
||||
paramanager.getcgtempparaloc(list,pd,2,paraloc2);
|
||||
paramanager.getcgtempparaloc(list,pd,3,paraloc3);
|
||||
a_load_const_cgpara(list,OS_SINT,len,paraloc3);
|
||||
a_loadaddr_ref_cgpara(list,dest,paraloc2);
|
||||
a_loadaddr_ref_cgpara(list,source,paraloc1);
|
||||
paramanager.freecgpara(list,paraloc3);
|
||||
paramanager.freecgpara(list,paraloc2);
|
||||
paramanager.freecgpara(list,paraloc1);
|
||||
alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
alloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
|
||||
a_call_name(list,'FPC_MOVE',false);
|
||||
dealloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
|
||||
dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
paraloc3.done;
|
||||
paraloc2.done;
|
||||
paraloc1.done;
|
||||
end;
|
||||
|
||||
|
||||
procedure tbasecgarm.g_concatcopy_internal(list : TAsmList;const source,dest : treference;len : tcgint;aligned : boolean);
|
||||
const
|
||||
maxtmpreg_arm = 10; {roozbeh: can be reduced to 8 or lower if might conflick with reserved ones,also +2 is used becouse of regs required for referencing}
|
||||
|
@ -93,7 +93,6 @@ unit cgcpu;
|
||||
procedure a_loadaddr_ref_reg(list : TAsmList;const ref : treference;r : tregister);override;
|
||||
|
||||
procedure g_concatcopy(list : TAsmList;const source,dest : treference;len : tcgint);override;
|
||||
procedure g_concatcopy_move(list : TAsmList;const source,dest : treference;len : tcgint);
|
||||
|
||||
procedure g_overflowcheck(list: TAsmList; const l: tlocation; def: tdef); override;
|
||||
procedure g_overflowCheck_loc(List: TAsmList; const Loc: TLocation; def: TDef; ovloc: tlocation); override;
|
||||
@ -2657,33 +2656,6 @@ unit cgcpu;
|
||||
end;
|
||||
|
||||
|
||||
procedure tcgavr.g_concatcopy_move(list : TAsmList;const source,dest : treference;len : tcgint);
|
||||
var
|
||||
paraloc1,paraloc2,paraloc3 : TCGPara;
|
||||
pd : tprocdef;
|
||||
begin
|
||||
pd:=search_system_proc('MOVE');
|
||||
paraloc1.init;
|
||||
paraloc2.init;
|
||||
paraloc3.init;
|
||||
paramanager.getcgtempparaloc(list,pd,1,paraloc1);
|
||||
paramanager.getcgtempparaloc(list,pd,2,paraloc2);
|
||||
paramanager.getcgtempparaloc(list,pd,3,paraloc3);
|
||||
a_load_const_cgpara(list,OS_SINT,len,paraloc3);
|
||||
a_loadaddr_ref_cgpara(list,dest,paraloc2);
|
||||
a_loadaddr_ref_cgpara(list,source,paraloc1);
|
||||
paramanager.freecgpara(list,paraloc3);
|
||||
paramanager.freecgpara(list,paraloc2);
|
||||
paramanager.freecgpara(list,paraloc1);
|
||||
alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
a_call_name_static(list,'FPC_MOVE');
|
||||
dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
paraloc3.done;
|
||||
paraloc2.done;
|
||||
paraloc1.done;
|
||||
end;
|
||||
|
||||
|
||||
procedure tcgavr.g_concatcopy(list : TAsmList;const source,dest : treference;len : tcgint);
|
||||
var
|
||||
countreg,tmpreg,tmpreg2: tregister;
|
||||
|
@ -372,6 +372,14 @@ unit cgobj;
|
||||
procedure optimize_op_const(size: TCGSize; var op: topcg; var a : tcgint);virtual;
|
||||
|
||||
|
||||
{# This emits code to copy len bytes from the source using the move procedure
|
||||
|
||||
@param(source Source reference of copy)
|
||||
@param(dest Destination reference of copy)
|
||||
|
||||
}
|
||||
procedure g_concatcopy_move(list : TAsmList;const source,dest : treference;len : tcgint);virtual;
|
||||
|
||||
{# This should emit the opcode to copy len bytes from the source
|
||||
to destination.
|
||||
|
||||
@ -2660,6 +2668,33 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
procedure tcg.g_concatcopy_move(list : TAsmList;const source,dest : treference;len : tcgint);
|
||||
var
|
||||
paraloc1,paraloc2,paraloc3 : TCGPara;
|
||||
pd : tprocdef;
|
||||
begin
|
||||
pd:=search_system_proc('MOVE');
|
||||
paraloc1.init;
|
||||
paraloc2.init;
|
||||
paraloc3.init;
|
||||
paramanager.getcgtempparaloc(list,pd,1,paraloc1);
|
||||
paramanager.getcgtempparaloc(list,pd,2,paraloc2);
|
||||
paramanager.getcgtempparaloc(list,pd,3,paraloc3);
|
||||
a_load_const_cgpara(list,OS_SINT,len,paraloc3);
|
||||
a_loadaddr_ref_cgpara(list,dest,paraloc2);
|
||||
a_loadaddr_ref_cgpara(list,source,paraloc1);
|
||||
paramanager.freecgpara(list,paraloc3);
|
||||
paramanager.freecgpara(list,paraloc2);
|
||||
paramanager.freecgpara(list,paraloc1);
|
||||
allocallcpuregisters(list);
|
||||
a_call_name(list,'FPC_MOVE',false);
|
||||
deallocallcpuregisters(list);
|
||||
paraloc3.done;
|
||||
paraloc2.done;
|
||||
paraloc1.done;
|
||||
end;
|
||||
|
||||
|
||||
procedure tcg.g_concatcopy_unaligned(list : TAsmList;const source,dest : treference;len : tcgint);
|
||||
begin
|
||||
g_concatcopy(list,source,dest,len);
|
||||
|
@ -87,7 +87,6 @@ type
|
||||
procedure g_proc_exit(list: tasmlist; parasize: longint; nostackframe: boolean); override;
|
||||
procedure g_concatcopy(list: tasmlist; const Source, dest: treference; len: tcgint); override;
|
||||
procedure g_concatcopy_unaligned(list: tasmlist; const Source, dest: treference; len: tcgint); override;
|
||||
procedure g_concatcopy_move(list: tasmlist; const Source, dest: treference; len: tcgint);
|
||||
procedure g_adjust_self_value(list:TAsmList;procdef: tprocdef;ioffset: tcgint); override;
|
||||
procedure g_profilecode(list: TAsmList);override;
|
||||
end;
|
||||
@ -1528,38 +1527,6 @@ begin
|
||||
end;
|
||||
|
||||
|
||||
|
||||
{ ************* concatcopy ************ }
|
||||
|
||||
procedure TCGMIPS.g_concatcopy_move(list: tasmlist; const Source, dest: treference; len: tcgint);
|
||||
var
|
||||
paraloc1, paraloc2, paraloc3: TCGPara;
|
||||
pd: tprocdef;
|
||||
begin
|
||||
pd:=search_system_proc('MOVE');
|
||||
paraloc1.init;
|
||||
paraloc2.init;
|
||||
paraloc3.init;
|
||||
paramanager.getcgtempparaloc(list, pd, 1, paraloc1);
|
||||
paramanager.getcgtempparaloc(list, pd, 2, paraloc2);
|
||||
paramanager.getcgtempparaloc(list, pd, 3, paraloc3);
|
||||
a_load_const_cgpara(list, OS_SINT, len, paraloc3);
|
||||
a_loadaddr_ref_cgpara(list, dest, paraloc2);
|
||||
a_loadaddr_ref_cgpara(list, Source, paraloc1);
|
||||
paramanager.freecgpara(list, paraloc3);
|
||||
paramanager.freecgpara(list, paraloc2);
|
||||
paramanager.freecgpara(list, paraloc1);
|
||||
alloccpuregisters(list, R_INTREGISTER, paramanager.get_volatile_registers_int(pocall_default));
|
||||
alloccpuregisters(list, R_FPUREGISTER, paramanager.get_volatile_registers_fpu(pocall_default));
|
||||
a_call_name(list, 'FPC_MOVE', false);
|
||||
dealloccpuregisters(list, R_FPUREGISTER, paramanager.get_volatile_registers_fpu(pocall_default));
|
||||
dealloccpuregisters(list, R_INTREGISTER, paramanager.get_volatile_registers_int(pocall_default));
|
||||
paraloc3.done;
|
||||
paraloc2.done;
|
||||
paraloc1.done;
|
||||
end;
|
||||
|
||||
|
||||
procedure TCGMIPS.g_concatcopy(list: tasmlist; const Source, dest: treference; len: tcgint);
|
||||
var
|
||||
tmpreg1, hreg, countreg: TRegister;
|
||||
|
@ -43,7 +43,6 @@ unit cgcpu;
|
||||
{ 32x32 to 64 bit multiplication }
|
||||
procedure a_mul_reg_reg_pair(list: TAsmList;size: tcgsize; src1,src2,dstlo,dsthi: tregister); override;
|
||||
|
||||
procedure g_concatcopy_move(list: tasmlist; const Source, dest: treference; len: tcgint);
|
||||
procedure g_concatcopy(list : TAsmList;const source,dest : treference;len : tcgint);override;
|
||||
|
||||
procedure g_overflowcheck(list: TAsmList; const Loc: tlocation; def: tdef); override;
|
||||
@ -177,35 +176,6 @@ unit cgcpu;
|
||||
end;
|
||||
|
||||
|
||||
procedure tcgrv32.g_concatcopy_move(list: tasmlist; const Source, dest: treference; len: tcgint);
|
||||
var
|
||||
paraloc1, paraloc2, paraloc3: TCGPara;
|
||||
pd: tprocdef;
|
||||
begin
|
||||
pd:=search_system_proc('MOVE');
|
||||
paraloc1.init;
|
||||
paraloc2.init;
|
||||
paraloc3.init;
|
||||
paramanager.getcgtempparaloc(list, pd, 1, paraloc1);
|
||||
paramanager.getcgtempparaloc(list, pd, 2, paraloc2);
|
||||
paramanager.getcgtempparaloc(list, pd, 3, paraloc3);
|
||||
a_load_const_cgpara(list, OS_SINT, len, paraloc3);
|
||||
a_loadaddr_ref_cgpara(list, dest, paraloc2);
|
||||
a_loadaddr_ref_cgpara(list, Source, paraloc1);
|
||||
paramanager.freecgpara(list, paraloc3);
|
||||
paramanager.freecgpara(list, paraloc2);
|
||||
paramanager.freecgpara(list, paraloc1);
|
||||
alloccpuregisters(list, R_INTREGISTER, paramanager.get_volatile_registers_int(pocall_default));
|
||||
alloccpuregisters(list, R_FPUREGISTER, paramanager.get_volatile_registers_fpu(pocall_default));
|
||||
a_call_name(list, 'FPC_MOVE', false);
|
||||
dealloccpuregisters(list, R_FPUREGISTER, paramanager.get_volatile_registers_fpu(pocall_default));
|
||||
dealloccpuregisters(list, R_INTREGISTER, paramanager.get_volatile_registers_int(pocall_default));
|
||||
paraloc3.done;
|
||||
paraloc2.done;
|
||||
paraloc1.done;
|
||||
end;
|
||||
|
||||
|
||||
procedure tcgrv32.g_concatcopy(list : TAsmList;const source,dest : treference;len : tcgint);
|
||||
var
|
||||
tmpreg1, hreg, countreg: TRegister;
|
||||
|
@ -46,7 +46,6 @@ unit cgcpu;
|
||||
|
||||
procedure g_overflowcheck(list: TAsmList; const Loc: tlocation; def: tdef); override;
|
||||
|
||||
procedure g_concatcopy_move(list: tasmlist; const Source, dest: treference; len: tcgint);
|
||||
procedure g_concatcopy(list: TAsmList; const source, dest: treference; len: aint); override;
|
||||
end;
|
||||
|
||||
@ -353,34 +352,6 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
procedure tcgrv64.g_concatcopy_move(list: tasmlist; const Source, dest: treference; len: tcgint);
|
||||
var
|
||||
paraloc1, paraloc2, paraloc3: TCGPara;
|
||||
pd: tprocdef;
|
||||
begin
|
||||
pd:=search_system_proc('MOVE');
|
||||
paraloc1.init;
|
||||
paraloc2.init;
|
||||
paraloc3.init;
|
||||
paramanager.getcgtempparaloc(list, pd, 1, paraloc1);
|
||||
paramanager.getcgtempparaloc(list, pd, 2, paraloc2);
|
||||
paramanager.getcgtempparaloc(list, pd, 3, paraloc3);
|
||||
a_load_const_cgpara(list, OS_SINT, len, paraloc3);
|
||||
a_loadaddr_ref_cgpara(list, dest, paraloc2);
|
||||
a_loadaddr_ref_cgpara(list, Source, paraloc1);
|
||||
paramanager.freecgpara(list, paraloc3);
|
||||
paramanager.freecgpara(list, paraloc2);
|
||||
paramanager.freecgpara(list, paraloc1);
|
||||
alloccpuregisters(list, R_INTREGISTER, paramanager.get_volatile_registers_int(pocall_default));
|
||||
alloccpuregisters(list, R_FPUREGISTER, paramanager.get_volatile_registers_fpu(pocall_default));
|
||||
a_call_name(list, 'FPC_MOVE', false);
|
||||
dealloccpuregisters(list, R_FPUREGISTER, paramanager.get_volatile_registers_fpu(pocall_default));
|
||||
dealloccpuregisters(list, R_INTREGISTER, paramanager.get_volatile_registers_int(pocall_default));
|
||||
paraloc3.done;
|
||||
paraloc2.done;
|
||||
paraloc1.done;
|
||||
end;
|
||||
|
||||
procedure tcgrv64.g_concatcopy(list: TAsmList; const source, dest: treference; len: aint);
|
||||
var
|
||||
tmpreg1, hreg, countreg: TRegister;
|
||||
|
@ -90,7 +90,6 @@ interface
|
||||
procedure g_save_registers(list : TAsmList);override;
|
||||
procedure g_concatcopy(list : TAsmList;const source,dest : treference;len : tcgint);override;
|
||||
procedure g_concatcopy_unaligned(list : TAsmList;const source,dest : treference;len : tcgint);override;
|
||||
procedure g_concatcopy_move(list : TAsmList;const source,dest : treference;len : tcgint);
|
||||
procedure g_adjust_self_value(list:TAsmList;procdef: tprocdef;ioffset: tcgint);override;
|
||||
protected
|
||||
use_unlimited_pic_mode : boolean;
|
||||
@ -1104,35 +1103,6 @@ implementation
|
||||
|
||||
{ ************* concatcopy ************ }
|
||||
|
||||
procedure TCGSparcGen.g_concatcopy_move(list : TAsmList;const source,dest : treference;len : tcgint);
|
||||
var
|
||||
paraloc1,paraloc2,paraloc3 : TCGPara;
|
||||
pd : tprocdef;
|
||||
begin
|
||||
pd:=search_system_proc('MOVE');
|
||||
paraloc1.init;
|
||||
paraloc2.init;
|
||||
paraloc3.init;
|
||||
paramanager.getcgtempparaloc(list,pd,1,paraloc1);
|
||||
paramanager.getcgtempparaloc(list,pd,2,paraloc2);
|
||||
paramanager.getcgtempparaloc(list,pd,3,paraloc3);
|
||||
a_load_const_cgpara(list,OS_SINT,len,paraloc3);
|
||||
a_loadaddr_ref_cgpara(list,dest,paraloc2);
|
||||
a_loadaddr_ref_cgpara(list,source,paraloc1);
|
||||
paramanager.freecgpara(list,paraloc3);
|
||||
paramanager.freecgpara(list,paraloc2);
|
||||
paramanager.freecgpara(list,paraloc1);
|
||||
alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
alloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
|
||||
a_call_name(list,'FPC_MOVE',false);
|
||||
dealloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
|
||||
dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
|
||||
paraloc3.done;
|
||||
paraloc2.done;
|
||||
paraloc1.done;
|
||||
end;
|
||||
|
||||
|
||||
procedure TCGSparcGen.g_concatcopy(list:TAsmList;const source,dest:treference;len:tcgint);
|
||||
var
|
||||
tmpreg1,
|
||||
|
@ -38,7 +38,6 @@ interface
|
||||
tcgcpu=class(tcg)
|
||||
private
|
||||
procedure fixref(list : TAsmList; var ref : treference);
|
||||
procedure g_concatcopy_move(list : tasmlist; const Source,dest : treference; len : tcgint);
|
||||
public
|
||||
procedure init_register_allocators;override;
|
||||
procedure done_register_allocators;override;
|
||||
@ -1073,35 +1072,6 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
procedure tcgcpu.g_concatcopy_move(list: tasmlist; const Source, dest: treference; len: tcgint);
|
||||
var
|
||||
paraloc1, paraloc2, paraloc3: TCGPara;
|
||||
pd: tprocdef;
|
||||
begin
|
||||
pd:=search_system_proc('MOVE');
|
||||
paraloc1.init;
|
||||
paraloc2.init;
|
||||
paraloc3.init;
|
||||
paramanager.getcgtempparaloc(list, pd, 1, paraloc1);
|
||||
paramanager.getcgtempparaloc(list, pd, 2, paraloc2);
|
||||
paramanager.getcgtempparaloc(list, pd, 3, paraloc3);
|
||||
a_load_const_cgpara(list, OS_SINT, len, paraloc3);
|
||||
a_loadaddr_ref_cgpara(list, dest, paraloc2);
|
||||
a_loadaddr_ref_cgpara(list, Source, paraloc1);
|
||||
paramanager.freecgpara(list, paraloc3);
|
||||
paramanager.freecgpara(list, paraloc2);
|
||||
paramanager.freecgpara(list, paraloc1);
|
||||
alloccpuregisters(list, R_INTREGISTER, paramanager.get_volatile_registers_int(pocall_default));
|
||||
alloccpuregisters(list, R_FPUREGISTER, paramanager.get_volatile_registers_fpu(pocall_default));
|
||||
a_call_name(list, 'FPC_MOVE', false);
|
||||
dealloccpuregisters(list, R_FPUREGISTER, paramanager.get_volatile_registers_fpu(pocall_default));
|
||||
dealloccpuregisters(list, R_INTREGISTER, paramanager.get_volatile_registers_int(pocall_default));
|
||||
paraloc3.done;
|
||||
paraloc2.done;
|
||||
paraloc1.done;
|
||||
end;
|
||||
|
||||
|
||||
procedure tcgcpu.g_concatcopy(list : TAsmList;const source,dest : treference;len : tcgint);
|
||||
var
|
||||
tmpreg1, hreg, countreg: TRegister;
|
||||
|
Loading…
Reference in New Issue
Block a user