mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-06 15:50:30 +02:00
+ basic implementation: support for loading jvm-specific operands
(single, double, string, widestring), basic constructors, spilling_get_operation_type() implementation o special: O_MOV_SOURCE/O_MOV_DEST don't make sense for this target, since it's stack based git-svn-id: branches/jvmbackend@18294 -
This commit is contained in:
parent
19275d1a4c
commit
0c5b48372b
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -206,6 +206,7 @@ compiler/ia64/cpuinfo.pas svneol=native#text/plain
|
||||
compiler/ia64/ia64reg.dat svneol=native#text/plain
|
||||
compiler/impdef.pas svneol=native#text/plain
|
||||
compiler/import.pas svneol=native#text/plain
|
||||
compiler/jvm/aasmcpu.pas svneol=native#text/plain
|
||||
compiler/jvm/cpubase.pas svneol=native#text/plain
|
||||
compiler/jvm/cpuinfo.pas svneol=native#text/plain
|
||||
compiler/jvm/jvmreg.dat svneol=native#text/plain
|
||||
|
286
compiler/jvm/aasmcpu.pas
Normal file
286
compiler/jvm/aasmcpu.pas
Normal file
@ -0,0 +1,286 @@
|
||||
{
|
||||
Copyright (c) 1999-2002 by Mazen Neifer
|
||||
|
||||
Contains the assembler object for the JVM
|
||||
|
||||
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 aasmcpu;
|
||||
|
||||
{$i fpcdefs.inc}
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
cclasses,
|
||||
globtype,globals,verbose,
|
||||
aasmbase,aasmtai,aasmdata,aasmsym,
|
||||
cgbase,cgutils,cpubase,cpuinfo,
|
||||
widestr;
|
||||
|
||||
{ fake, there are no "mov reg,reg" instructions here }
|
||||
const
|
||||
{ "mov reg,reg" source operand number }
|
||||
O_MOV_SOURCE = 0;
|
||||
{ "mov reg,reg" source operand number }
|
||||
O_MOV_DEST = 0;
|
||||
|
||||
type
|
||||
|
||||
{ taicpu }
|
||||
|
||||
taicpu = class(tai_cpu_abstract_sym)
|
||||
constructor op_none(op : tasmop);
|
||||
|
||||
constructor op_reg(op : tasmop;_op1 : tregister);
|
||||
constructor op_const(op : tasmop;_op1 : aint);
|
||||
constructor op_ref(op : tasmop;const _op1 : treference);
|
||||
constructor op_sym(op : tasmop;_op1 : tasmsymbol);
|
||||
|
||||
constructor op_single(op : tasmop;_op1 : single);
|
||||
constructor op_double(op : tasmop;_op1 : double);
|
||||
constructor op_string(op : tasmop;_op1len : aint;_op1 : pchar);
|
||||
constructor op_wstring(op : tasmop;_op1 : pcompilerwidestring);
|
||||
|
||||
procedure loadsingle(opidx:longint;f:single);
|
||||
procedure loaddouble(opidx:longint;d:double);
|
||||
procedure loadstr(opidx:longint;vallen: aint;pc: pchar);
|
||||
procedure loadpwstr(opidx:longint;pwstr:pcompilerwidestring);
|
||||
|
||||
|
||||
{ register allocation }
|
||||
function is_same_reg_move(regtype: Tregistertype):boolean; override;
|
||||
|
||||
{ register spilling code }
|
||||
function spilling_get_operation_type(opnr: longint): topertype;override;
|
||||
end;
|
||||
|
||||
tai_align = class(tai_align_abstract)
|
||||
{ nothing to add }
|
||||
end;
|
||||
|
||||
procedure InitAsm;
|
||||
procedure DoneAsm;
|
||||
|
||||
function spilling_create_load(const ref:treference;r:tregister):Taicpu;
|
||||
function spilling_create_store(r:tregister; const ref:treference):Taicpu;
|
||||
|
||||
implementation
|
||||
|
||||
{*****************************************************************************
|
||||
taicpu Constructors
|
||||
*****************************************************************************}
|
||||
|
||||
constructor taicpu.op_none(op : tasmop);
|
||||
begin
|
||||
inherited create(op);
|
||||
end;
|
||||
|
||||
|
||||
constructor taicpu.op_reg(op : tasmop;_op1 : tregister);
|
||||
begin
|
||||
inherited create(op);
|
||||
ops:=1;
|
||||
loadreg(0,_op1);
|
||||
end;
|
||||
|
||||
|
||||
constructor taicpu.op_ref(op : tasmop;const _op1 : treference);
|
||||
begin
|
||||
inherited create(op);
|
||||
ops:=1;
|
||||
loadref(0,_op1);
|
||||
end;
|
||||
|
||||
|
||||
constructor taicpu.op_const(op : tasmop;_op1 : aint);
|
||||
begin
|
||||
inherited create(op);
|
||||
ops:=1;
|
||||
loadconst(0,_op1);
|
||||
end;
|
||||
|
||||
|
||||
constructor taicpu.op_sym(op : tasmop;_op1 : tasmsymbol);
|
||||
begin
|
||||
inherited create(op);
|
||||
ops:=1;
|
||||
is_jmp:=op in [a_if_acmpeq, a_if_acmpne, a_if_icmpeq, a_if_icmpge, a_if_icmpgt,
|
||||
a_if_icmple, a_if_icmplt, a_if_icmpne,
|
||||
a_ifeq, a_ifge, a_ifgt, a_ifle, a_iflt, a_ifne, a_ifnonnull, a_ifnull];
|
||||
loadsymbol(0,_op1,0);
|
||||
end;
|
||||
|
||||
constructor taicpu.op_single(op: tasmop; _op1: single);
|
||||
begin
|
||||
inherited create(op);
|
||||
ops:=1;
|
||||
loadsingle(0,_op1);
|
||||
end;
|
||||
|
||||
|
||||
constructor taicpu.op_double(op: tasmop; _op1: double);
|
||||
begin
|
||||
inherited create(op);
|
||||
ops:=1;
|
||||
loaddouble(0,_op1);
|
||||
end;
|
||||
|
||||
constructor taicpu.op_string(op: tasmop; _op1len: aint; _op1: pchar);
|
||||
begin
|
||||
inherited create(op);
|
||||
ops:=1;
|
||||
loadstr(0,_op1len,_op1);
|
||||
end;
|
||||
|
||||
constructor taicpu.op_wstring(op: tasmop; _op1: pcompilerwidestring);
|
||||
begin
|
||||
inherited create(op);
|
||||
ops:=1;
|
||||
loadpwstr(0,_op1);
|
||||
end;
|
||||
|
||||
|
||||
procedure taicpu.loadsingle(opidx:longint;f:single);
|
||||
begin
|
||||
allocate_oper(opidx+1);
|
||||
with oper[opidx]^ do
|
||||
begin
|
||||
if typ<>top_single then
|
||||
clearop(opidx);
|
||||
sval:=f;
|
||||
typ:=top_single;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
procedure taicpu.loaddouble(opidx: longint; d: double);
|
||||
begin
|
||||
allocate_oper(opidx+1);
|
||||
with oper[opidx]^ do
|
||||
begin
|
||||
if typ<>top_double then
|
||||
clearop(opidx);
|
||||
dval:=d;
|
||||
typ:=top_double;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
procedure taicpu.loadstr(opidx: longint; vallen: aint; pc: pchar);
|
||||
begin
|
||||
allocate_oper(opidx+1);
|
||||
with oper[opidx]^ do
|
||||
begin
|
||||
clearop(opidx);
|
||||
pcvallen:=vallen;
|
||||
getmem(pcval,vallen);
|
||||
move(pcval^,pc^,vallen);
|
||||
typ:=top_string;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
procedure taicpu.loadpwstr(opidx:longint;pwstr:pcompilerwidestring);
|
||||
begin
|
||||
allocate_oper(opidx+1);
|
||||
with oper[opidx]^ do
|
||||
begin
|
||||
clearop(opidx);
|
||||
initwidestring(pwstrval);
|
||||
copywidestring(pwstr,pwstrval);
|
||||
typ:=top_wstring;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
function taicpu.is_same_reg_move(regtype: Tregistertype):boolean;
|
||||
begin
|
||||
result:=false;
|
||||
end;
|
||||
|
||||
|
||||
function taicpu.spilling_get_operation_type(opnr: longint): topertype;
|
||||
begin
|
||||
case opcode of
|
||||
a_iinc:
|
||||
result:=operand_readwrite;
|
||||
a_aastore,
|
||||
a_astore,
|
||||
a_astore_0,
|
||||
a_astore_1,
|
||||
a_astore_2,
|
||||
a_astore_3,
|
||||
a_bastore,
|
||||
a_castore,
|
||||
a_dastore,
|
||||
a_dstore,
|
||||
a_dstore_0,
|
||||
a_dstore_1,
|
||||
a_dstore_2,
|
||||
a_dstore_3,
|
||||
a_fastore,
|
||||
a_fstore,
|
||||
a_fstore_0,
|
||||
a_fstore_1,
|
||||
a_fstore_2,
|
||||
a_fstore_3,
|
||||
a_iastore,
|
||||
a_istore,
|
||||
a_istore_0,
|
||||
a_istore_1,
|
||||
a_istore_2,
|
||||
a_istore_3,
|
||||
a_lastore,
|
||||
a_lstore,
|
||||
a_lstore_0,
|
||||
a_lstore_1,
|
||||
a_lstore_2,
|
||||
a_lstore_3,
|
||||
a_sastore:
|
||||
result:=operand_write;
|
||||
else
|
||||
result:=operand_read;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
function spilling_create_load(const ref:treference;r:tregister):Taicpu;
|
||||
begin
|
||||
internalerror(2010122614);
|
||||
end;
|
||||
|
||||
|
||||
function spilling_create_store(r:tregister; const ref:treference):Taicpu;
|
||||
begin
|
||||
internalerror(2010122615);
|
||||
end;
|
||||
|
||||
|
||||
procedure InitAsm;
|
||||
begin
|
||||
end;
|
||||
|
||||
|
||||
procedure DoneAsm;
|
||||
begin
|
||||
end;
|
||||
|
||||
begin
|
||||
cai_cpu:=taicpu;
|
||||
cai_align:=tai_align;
|
||||
end.
|
Loading…
Reference in New Issue
Block a user