fpc/compiler/loongarch64/cpupi.pas

123 lines
3.5 KiB
ObjectPascal

{
Copyright (c) 2002 by Florian Klaempfl
This unit contains the CPU specific part of tprocinfo
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.
****************************************************************************
}
{ This unit contains the CPU specific part of tprocinfo. }
unit cpupi;
{$I fpcdefs.inc}
interface
uses
cutils,aasmdata,
globtype, cgutils, cgbase,
procinfo, cpuinfo, psub;
type
tloongarch64procinfo = class(tcgprocinfo)
stackframesize,
floatregstart : aint;
stackpaddingreg: TSuperRegister;
needs_frame_pointer: boolean;
constructor create(aparent: tprocinfo); override;
procedure set_first_temp_offset; override;
function calc_stackframe_size: longint; override;
end;
implementation
uses
globals, systems,
cpubase,
aasmtai,
tgobj,cgobj,
symconst, symsym, paramgr, symutil, symtable,
verbose,
aasmcpu;
constructor tloongarch64procinfo.create(aparent: tprocinfo);
begin
inherited create(aparent);
maxpushedparasize := 0;
{ GCC option -fomit-frame-pointer is default. }
framepointer:=NR_STACK_POINTER_REG;
end;
procedure tloongarch64procinfo.set_first_temp_offset;
begin
{ TODO framepointer:=NR_STACK_POINTER_REG; Need get backtrace updated. }
{ TODO Profile }
if (po_nostackframe in procdef.procoptions) then
begin
tg.setfirsttemp(align(maxpushedparasize,
max(current_settings.alignment.localalignmin,8)));
end
else
begin
tg.setfirsttemp(align(maxpushedparasize,
max(current_settings.alignment.localalignmin,8)));
end;
end;
function tloongarch64procinfo.calc_stackframe_size: longint;
var
firstfloatreg,lastfloatreg,
r : byte;
floatsavesize : aword;
regs: tcpuregisterset;
begin
maxpushedparasize:=align(maxpushedparasize,
max(current_settings.alignment.localalignmin,8));
floatsavesize:=0;
case current_settings.fputype of
fpu_fd:
begin
floatsavesize:=0;
regs:=cg.rg[R_FPUREGISTER].used_in_proc-paramanager.get_volatile_registers_fpu(pocall_stdcall);
for r:=RS_F0 to RS_F31 do
if r in regs then
inc(floatsavesize,8);
end;
else
;
end;
result:=align(tg.direction*tg.lasttemp,
max(current_settings.alignment.localalignmin,8))
+maxpushedparasize+aint(floatsavesize);
if tg.direction=1 then
floatregstart:=result-aint(floatsavesize)
else
floatregstart:=-result+maxpushedparasize;
end;
begin
cprocinfo := tloongarch64procinfo;
end.