fpc/compiler/xtensa/ncpumem.pas
2020-10-13 19:59:01 +00:00

90 lines
3.0 KiB
ObjectPascal

{
Copyright (c) 1998-2020 by Florian Klaempfl
Generate xtensa assembler for in memory related nodes
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 ncpumem;
{$i fpcdefs.inc}
interface
uses
globtype,
cgbase,cpubase,
symtype,
nmem,ncgmem;
type
tcpuvecnode = class(tcgvecnode)
procedure update_reference_reg_mul(maybe_const_reg: tregister; regsize: tdef; l: aint);override;
end;
implementation
uses
cutils,verbose,
aasmdata,aasmcpu,
cgutils,cgobj,
symconst,symcpu;
{*****************************************************************************
TCPUVECNODE
*****************************************************************************}
procedure tcpuvecnode.update_reference_reg_mul(maybe_const_reg: tregister; regsize: tdef; l: aint);
var
hreg: tregister;
op: TAsmOp;
begin
if (l in [2,4,8]) and ((location.reference.base<>NR_NO) or (location.reference.index<>NR_NO)) then
begin
case l of
2 : op:=A_ADDX2;
4 : op:=A_ADDX4;
8 : op:=A_ADDX8;
else
Internalerror(2020042201);
end;
hreg:=cg.getaddressregister(current_asmdata.CurrAsmList);
if location.reference.base<>NR_NO then
begin
current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg_reg(op,hreg,maybe_const_reg,location.reference.base));
location.reference.base:=hreg;
end
else if location.reference.index<>NR_NO then
begin
current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg_reg(op,hreg,maybe_const_reg,location.reference.index));
location.reference.index:=hreg;
end
else
Internalerror(2020042214);
{ update alignment }
if (location.reference.alignment=0) then
internalerror(2020042217);
location.reference.alignment:=newalignment(location.reference.alignment,l);
end
else
inherited update_reference_reg_mul(maybe_const_reg,regsize,l);
end;
begin
cvecnode:=tcpuvecnode;
end.