Browse Source

There is code in the register allocator to restrict register allocation to the
first 16 registers in RISC-V RVE and RVEC modes. However, there was still
code in tcpuparamanager.create_paraloc_info_intern that allowed the allocation
of up to register X17 in RVE and RVEC modes. Modified this function to
take the processor mode into account and restrict it to X0..X15 in RVE and RVEC modes.

Also put conditional code in setjump.inc assembler code to only set the first
16 registers in RVE and RVEC modes.

The entire embedded-riscv32 RTL can now compile successfuly in RVEC mode.

Interferon 2 years ago
parent
commit
c482bafdaf

+ 0 - 1
compiler/riscv32/cpuinfo.pas

@@ -211,7 +211,6 @@ Const
        { cpu_rv32e     } [CPURV_HAS_16REGISTERS],
        { cpu_rv32e     } [CPURV_HAS_16REGISTERS],
        { cpu_rv32imc   } [CPURV_HAS_MUL,CPURV_HAS_COMPACT],
        { cpu_rv32imc   } [CPURV_HAS_MUL,CPURV_HAS_COMPACT],
        { cpu_rv32ec    } [CPURV_HAS_16REGISTERS,CPURV_HAS_COMPACT]
        { cpu_rv32ec    } [CPURV_HAS_16REGISTERS,CPURV_HAS_COMPACT]
-
      );
      );
 
 
 Implementation
 Implementation

+ 7 - 3
compiler/riscv32/cpupara.pas

@@ -306,6 +306,7 @@ unit cpupara;
          stack_offset: longint;
          stack_offset: longint;
          paralen: aint;
          paralen: aint;
          nextintreg,nextfloatreg,nextmmreg, maxfpureg : tsuperregister;
          nextintreg,nextfloatreg,nextmmreg, maxfpureg : tsuperregister;
+         MaxIntReg : TSuperRegister;
          locdef,
          locdef,
          fdef,
          fdef,
          paradef : tdef;
          paradef : tdef;
@@ -328,6 +329,9 @@ unit cpupara;
          nextmmreg := curmmreg;
          nextmmreg := curmmreg;
          stack_offset := cur_stack_offset;
          stack_offset := cur_stack_offset;
          maxfpureg := RS_F17;
          maxfpureg := RS_F17;
+         if CPURV_HAS_16REGISTERS in cpu_capabilities[current_settings.cputype] then
+          MaxIntReg := RS_X15 else
+          MaxIntReg := RS_X17;
 
 
           for i:=0 to paras.count-1 do
           for i:=0 to paras.count-1 do
             begin
             begin
@@ -398,7 +402,7 @@ unit cpupara;
                   { In case of po_delphi_nested_cc, the parent frame pointer
                   { In case of po_delphi_nested_cc, the parent frame pointer
                     is always passed on the stack. }
                     is always passed on the stack. }
                   if (loc = LOC_REGISTER) and
                   if (loc = LOC_REGISTER) and
-                     (nextintreg <= RS_X17) and
+                     (nextintreg <= MaxIntReg) and
                      (not(vo_is_parentfp in hp.varoptions) or
                      (not(vo_is_parentfp in hp.varoptions) or
                       not(po_delphi_nested_cc in p.procoptions)) then
                       not(po_delphi_nested_cc in p.procoptions)) then
                     begin
                     begin
@@ -424,7 +428,7 @@ unit cpupara;
                       dec(paralen,tcgsize2size[paraloc^.size]);
                       dec(paralen,tcgsize2size[paraloc^.size]);
                     end
                     end
                   else if (loc = LOC_FPUREGISTER) and
                   else if (loc = LOC_FPUREGISTER) and
-                          (nextintreg <= RS_X17) then
+                          (nextintreg <= MaxIntReg) then
                     begin
                     begin
                       paraloc^.loc:=loc;
                       paraloc^.loc:=loc;
                       paraloc^.size := paracgsize;
                       paraloc^.size := paracgsize;
@@ -475,7 +479,7 @@ unit cpupara;
 
 
                        inc(stack_offset,align(paralen,4));
                        inc(stack_offset,align(paralen,4));
                        while (paralen > 0) and
                        while (paralen > 0) and
-                             (nextintreg < RS_X18) do
+                             (nextintreg <= MaxIntReg) do
                           begin
                           begin
                             inc(nextintreg);
                             inc(nextintreg);
                             dec(paralen,sizeof(pint));
                             dec(paralen,sizeof(pint));

+ 13 - 0
rtl/embedded/riscv32/CH32VxBootstrap.pp

@@ -1,3 +1,16 @@
+{
+    Copyright (c) 1998-2023 by the Free Pascal development team
+
+    Bootstrap code specific to WCH CH32Vxxx RISC-V microcontrollers.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
 unit CH32VxBootstrap;
 unit CH32VxBootstrap;
 
 
 interface
 interface

+ 0 - 1
rtl/embedded/riscv32/riscv32_start.inc

@@ -19,7 +19,6 @@ procedure InitMemAndStart; noreturn;
 var
 var
   pdest, psrc, pend: PLongWord;
   pdest, psrc, pend: PLongWord;
 begin
 begin
-
   pdest:=@_data;
   pdest:=@_data;
   psrc:=@_etext;
   psrc:=@_etext;
   pend:=@_bss_start;
   pend:=@_bss_start;