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;