* skeleton to unify the RiscV paramgr

* first routines unified
This commit is contained in:
florian 2024-12-15 15:29:05 +01:00
parent 74bad92e4d
commit f32eaa1564
4 changed files with 84 additions and 68 deletions

75
compiler/riscv/pararv.pas Normal file
View File

@ -0,0 +1,75 @@
{
Copyright (c) 2002 by Florian Klaempfl
RiscV specific calling conventions
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
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. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
****************************************************************************
}
unit pararv;
{$I fpcdefs.inc}
interface
uses
globtype,
cgutils,
paramgr;
type
trvparamanager = class(tparamanager)
function get_volatile_registers_int(calloption: tproccalloption): tcpuregisterset; override;
function get_volatile_registers_fpu(calloption: tproccalloption): tcpuregisterset; override;
function get_saved_registers_fpu(calloption: tproccalloption): tcpuregisterarray;override;
function get_saved_registers_int(calloption: tproccalloption): tcpuregisterarray;override;
end;
implementation
uses
cpubase;
function trvparamanager.get_volatile_registers_int(calloption: tproccalloption): tcpuregisterset;
begin
result:=[RS_X0..RS_X31]-[RS_X2,RS_X8..RS_X9,RS_X18..RS_X27];
end;
function trvparamanager.get_volatile_registers_fpu(calloption: tproccalloption): tcpuregisterset;
begin
result:=[RS_F0..RS_F31]-[RS_F8..RS_F9,RS_F18..RS_F27];
end;
function trvparamanager.get_saved_registers_int(calloption : tproccalloption):tcpuregisterarray;
const
saved_regs: tcpuregisterarray = (RS_X2,RS_X8,RS_X9,RS_X18,RS_X19,RS_X20,RS_X21,RS_X22,RS_X23,RS_X24,RS_X26,RS_X26,RS_X27);
begin
result:=saved_regs;
end;
function trvparamanager.get_saved_registers_fpu(calloption : tproccalloption):tcpuregisterarray;
const
saved_regs: tcpuregisterarray = (RS_F8,RS_F9,RS_F18,RS_F19,RS_F20,RS_F21,RS_F22,RS_F23,RS_F24,RS_F25,RS_F26,RS_F27);
begin
result:=saved_regs;
end;
end.

View File

@ -29,20 +29,17 @@ unit cpupara;
aasmtai,aasmdata,
cpubase,
symconst,symtype,symdef,symsym,
paramgr,parabase,cgbase,cgutils;
paramgr,parabase,cgbase,cgutils,
pararv;
type
tcpuparamanager = class(tparamanager)
function get_volatile_registers_int(calloption : tproccalloption):tcpuregisterset;override;
function get_volatile_registers_fpu(calloption : tproccalloption):tcpuregisterset;override;
tcpuparamanager = class(trvparamanager)
function push_addr_param(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;override;
procedure getcgtempparaloc(list: TAsmList; pd : tabstractprocdef; nr : longint; var cgpara : tcgpara);override;
function create_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;override;
function create_varargs_paraloc_info(p : tabstractprocdef; side: tcallercallee; varargspara:tvarargsparalist):longint;override;
function get_funcretloc(p : tabstractprocdef; side: tcallercallee; forcetempdef: tdef): tcgpara;override;
function get_saved_registers_int(calloption: tproccalloption): tcpuregisterarray;override;
function get_saved_registers_fpu(calloption: tproccalloption): tcpuregisterarray;override;
private
procedure init_values(var curintreg, curfloatreg, curmmreg: tsuperregister; var cur_stack_offset: aword);
function create_paraloc_info_intern(p : tabstractprocdef; side: tcallercallee; paras:tparalist;
@ -57,35 +54,6 @@ unit cpupara;
defutil,symtable,
procinfo,cpupi;
function tcpuparamanager.get_volatile_registers_int(calloption : tproccalloption):tcpuregisterset;
begin
result:=[RS_X0..RS_X31]-[RS_X2,RS_X8..RS_X9,RS_X18..RS_X27];
end;
function tcpuparamanager.get_volatile_registers_fpu(calloption : tproccalloption):tcpuregisterset;
begin
result:=[RS_F0..RS_F31]-[RS_F8..RS_F9,RS_F18..RS_F27];
end;
function tcpuparamanager.get_saved_registers_int(calloption : tproccalloption):tcpuregisterarray;
const
saved_regs: tcpuregisterarray = (RS_X2,RS_X8,RS_X9,RS_X18,RS_X19,RS_X20,RS_X21,RS_X22,RS_X23,RS_X24,RS_X26,RS_X26,RS_X27);
begin
result:=saved_regs;
end;
function tcpuparamanager.get_saved_registers_fpu(calloption : tproccalloption):tcpuregisterarray;
const
saved_regs: tcpuregisterarray = (RS_F8,RS_F9,RS_F18,RS_F19,RS_F20,RS_F21,RS_F22,RS_F23,RS_F24,RS_F25,RS_F26,RS_F27);
begin
result:=saved_regs;
end;
procedure tcpuparamanager.getcgtempparaloc(list: TAsmList; pd : tabstractprocdef; nr : longint; var cgpara : tcgpara);
var
paraloc : pcgparalocation;

View File

@ -29,12 +29,11 @@ unit cpupara;
aasmtai,aasmdata,
cpubase,
symconst, symtype, symdef, symsym,
paramgr, parabase, cgbase, cgutils;
paramgr, parabase, cgbase, cgutils,
pararv;
type
tcpuparamanager = class(tparamanager)
function get_volatile_registers_int(calloption: tproccalloption): tcpuregisterset; override;
function get_volatile_registers_fpu(calloption: tproccalloption): tcpuregisterset; override;
tcpuparamanager = class(trvparamanager)
function push_addr_param(varspez: tvarspez; def: tdef; calloption: tproccalloption): boolean; override;
function ret_in_param(def: tdef; pd: tabstractprocdef): boolean; override;
@ -43,8 +42,6 @@ unit cpupara;
function create_varargs_paraloc_info(p: tabstractprocdef; side: tcallercallee; varargspara: tvarargsparalist): longint; override;
function get_funcretloc(p : tabstractprocdef; side: tcallercallee; forcetempdef: tdef): tcgpara;override;
function get_saved_registers_fpu(calloption: tproccalloption): tcpuregisterarray;override;
function get_saved_registers_int(calloption: tproccalloption): tcpuregisterarray;override;
private
procedure init_values(var curintreg, curfloatreg, curmmreg: tsuperregister; var cur_stack_offset: aword);
function create_paraloc_info_intern(p: tabstractprocdef; side: tcallercallee; paras: tparalist; var curintreg, curfloatreg, curmmreg: tsuperregister; var cur_stack_offset: aword; isVararg : boolean): longint;
@ -60,30 +57,6 @@ implementation
defutil,symtable,symcpu,
procinfo, cpupi;
function tcpuparamanager.get_volatile_registers_int(calloption: tproccalloption): tcpuregisterset;
begin
result:=[RS_X0..RS_X31]-[RS_X2,RS_X8..RS_X9,RS_X18..RS_X27];
end;
function tcpuparamanager.get_volatile_registers_fpu(calloption: tproccalloption): tcpuregisterset;
begin
result:=[RS_F0..RS_F31]-[RS_F8..RS_F9,RS_F18..RS_F27];
end;
function tcpuparamanager.get_saved_registers_int(calloption : tproccalloption):tcpuregisterarray;
const
saved_regs: tcpuregisterarray = (RS_X2,RS_X8,RS_X9,RS_X18,RS_X19,RS_X20,RS_X21,RS_X22,RS_X23,RS_X24,RS_X26,RS_X26,RS_X27);
begin
result:=saved_regs;
end;
function tcpuparamanager.get_saved_registers_fpu(calloption : tproccalloption):tcpuregisterarray;
const
saved_regs: tcpuregisterarray = (RS_F8,RS_F9,RS_F18,RS_F19,RS_F20,RS_F21,RS_F22,RS_F23,RS_F24,RS_F25,RS_F26,RS_F27);
begin
result:=saved_regs;
end;
procedure tcpuparamanager.getcgtempparaloc(list: TAsmList; pd : tabstractprocdef; nr: longint; var cgpara: tcgpara);
var
paraloc: pcgparalocation;
@ -339,7 +312,7 @@ implementation
else
paralen := tcgsize2size[def_cgsize(paradef)];
if (paradef.typ=recorddef) and
if (paradef.typ=recorddef) and not(is_implicit_pointer_object_type(paradef)) and
tabstractrecordsymtable(tabstractrecorddef(paradef).symtable).has_single_field(tmpdef) and
(tmpdef.typ=floatdef) then
begin

View File

@ -1645,11 +1645,11 @@ implementation
else
exit;
offset := sym.fieldoffset;
if(def2.typ = def1.typ)then
if def2.typ = def1.typ then
cnt := 2
else
cnt := 1;
if((offset = 0))then
if offset = 0 then
cnt := 0;
has_double_field := cnt;
end;