From f49da0563310f72c509225c53a8cdcf01a92790e Mon Sep 17 00:00:00 2001 From: florian <florian@freepascal.org> Date: Wed, 15 May 2024 22:51:58 +0200 Subject: [PATCH] * unified g_concatcopy_move --- compiler/aarch64/cgcpu.pas | 32 -------------------------------- compiler/arm/cgcpu.pas | 30 ------------------------------ compiler/avr/cgcpu.pas | 28 ---------------------------- compiler/cgobj.pas | 35 +++++++++++++++++++++++++++++++++++ compiler/mips/cgcpu.pas | 33 --------------------------------- compiler/riscv32/cgcpu.pas | 30 ------------------------------ compiler/riscv64/cgcpu.pas | 29 ----------------------------- compiler/sparcgen/cgsparc.pas | 30 ------------------------------ compiler/xtensa/cgcpu.pas | 30 ------------------------------ 9 files changed, 35 insertions(+), 242 deletions(-) diff --git a/compiler/aarch64/cgcpu.pas b/compiler/aarch64/cgcpu.pas index 38c0097f37..a48161aa1e 100644 --- a/compiler/aarch64/cgcpu.pas +++ b/compiler/aarch64/cgcpu.pas @@ -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 diff --git a/compiler/arm/cgcpu.pas b/compiler/arm/cgcpu.pas index 1f0940a080..d822d038cc 100644 --- a/compiler/arm/cgcpu.pas +++ b/compiler/arm/cgcpu.pas @@ -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} diff --git a/compiler/avr/cgcpu.pas b/compiler/avr/cgcpu.pas index 58b051eacd..fdedad2feb 100644 --- a/compiler/avr/cgcpu.pas +++ b/compiler/avr/cgcpu.pas @@ -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; diff --git a/compiler/cgobj.pas b/compiler/cgobj.pas index e27808150e..aaf0d4e3ca 100644 --- a/compiler/cgobj.pas +++ b/compiler/cgobj.pas @@ -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); diff --git a/compiler/mips/cgcpu.pas b/compiler/mips/cgcpu.pas index 90810fd128..710b9e103b 100644 --- a/compiler/mips/cgcpu.pas +++ b/compiler/mips/cgcpu.pas @@ -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; diff --git a/compiler/riscv32/cgcpu.pas b/compiler/riscv32/cgcpu.pas index 68863bf69d..27a319f436 100644 --- a/compiler/riscv32/cgcpu.pas +++ b/compiler/riscv32/cgcpu.pas @@ -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; diff --git a/compiler/riscv64/cgcpu.pas b/compiler/riscv64/cgcpu.pas index f4ba54a47e..cf76a2967d 100644 --- a/compiler/riscv64/cgcpu.pas +++ b/compiler/riscv64/cgcpu.pas @@ -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; diff --git a/compiler/sparcgen/cgsparc.pas b/compiler/sparcgen/cgsparc.pas index a7dc2ee087..d141885e5c 100644 --- a/compiler/sparcgen/cgsparc.pas +++ b/compiler/sparcgen/cgsparc.pas @@ -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, diff --git a/compiler/xtensa/cgcpu.pas b/compiler/xtensa/cgcpu.pas index a54d497c52..e933b8a300 100644 --- a/compiler/xtensa/cgcpu.pas +++ b/compiler/xtensa/cgcpu.pas @@ -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;