* created generic version of thlcgobj.g_reference_loc() and only override

JVM-specific case (needed for future trunk marge to prevent abstract
    method warning)

git-svn-id: branches/jvmbackend@20387 -
This commit is contained in:
Jonas Maebe 2012-02-20 11:28:50 +00:00
parent 8b4b081ed5
commit 3916a32f9e
2 changed files with 58 additions and 33 deletions

View File

@ -420,6 +420,9 @@ unit hlcgobj;
The default implementation issues a jump instruction to the external name. } The default implementation issues a jump instruction to the external name. }
// procedure g_external_wrapper(list : TAsmList; procdef: tprocdef; const externalname: string); virtual; // procedure g_external_wrapper(list : TAsmList; procdef: tprocdef; const externalname: string); virtual;
protected
procedure g_allocload_reg_reg(list: TAsmList; regsize: tdef; const fromreg: tregister; out toreg: tregister; regtyp: tregistertype);
public
{ create "safe copy" of a tlocation that can be used later: all { create "safe copy" of a tlocation that can be used later: all
registers used in the tlocation are copied to new ones, so that registers used in the tlocation are copied to new ones, so that
even if the original ones change, things stay the same (except if even if the original ones change, things stay the same (except if
@ -427,7 +430,7 @@ unit hlcgobj;
kept). Must only be used on lvalue locations. kept). Must only be used on lvalue locations.
It's intended as some kind of replacement for a_loadaddr_ref_reg() It's intended as some kind of replacement for a_loadaddr_ref_reg()
for targets without pointers. } for targets without pointers. }
procedure g_reference_loc(list: TAsmList; def: tdef; const fromloc: tlocation; out toloc: tlocation); virtual; abstract; procedure g_reference_loc(list: TAsmList; def: tdef; const fromloc: tlocation; out toloc: tlocation); virtual;
{ routines migrated from ncgutil } { routines migrated from ncgutil }
@ -1859,6 +1862,54 @@ implementation
begin begin
end; end;
procedure thlcgobj.g_allocload_reg_reg(list: TAsmList; regsize: tdef; const fromreg: tregister; out toreg: tregister; regtyp: tregistertype);
begin
case regtyp of
R_INTREGISTER:
toreg:=getintregister(list,regsize);
R_ADDRESSREGISTER:
toreg:=getaddressregister(list,regsize);
R_FPUREGISTER:
toreg:=getfpuregister(list,regsize);
end;
a_load_reg_reg(list,regsize,regsize,fromreg,toreg);
end;
procedure thlcgobj.g_reference_loc(list: TAsmList; def: tdef; const fromloc: tlocation; out toloc: tlocation);
begin
toloc:=fromloc;
case fromloc.loc of
{ volatile location, can't get a permanent reference }
LOC_REGISTER,
LOC_FPUREGISTER:
internalerror(2012012702);
LOC_CONSTANT:
{ finished }
;
LOC_CREGISTER:
g_allocload_reg_reg(list,def,fromloc.reference.index,toloc.reference.index,R_INTREGISTER);
LOC_CFPUREGISTER:
g_allocload_reg_reg(list,def,fromloc.reference.index,toloc.reference.index,R_FPUREGISTER);
{ although LOC_CREFERENCE cannot be an lvalue, we may want to take a
reference to such a location for multiple reading }
LOC_CREFERENCE,
LOC_REFERENCE:
begin
if (fromloc.reference.base<>NR_NO) and
(fromloc.reference.base<>current_procinfo.framepointer) and
(fromloc.reference.base<>NR_STACK_POINTER_REG) then
g_allocload_reg_reg(list,voidpointertype,fromloc.reference.base,toloc.reference.base,getregtype(fromloc.reference.base));
if (fromloc.reference.index<>NR_NO) and
(fromloc.reference.index<>current_procinfo.framepointer) and
(fromloc.reference.index<>NR_STACK_POINTER_REG) then
g_allocload_reg_reg(list,voidpointertype,fromloc.reference.index,toloc.reference.index,getregtype(fromloc.reference.index));
end;
else
internalerror(2012012701);
end;
end;
procedure thlcgobj.location_force_reg(list: TAsmList; var l: tlocation; src_size, dst_size: tdef; maybeconst: boolean); procedure thlcgobj.location_force_reg(list: TAsmList; var l: tlocation; src_size, dst_size: tdef; maybeconst: boolean);
var var
hregister, hregister,

View File

@ -588,59 +588,33 @@ implementation
end; end;
procedure thlcgjvm.g_reference_loc(list: TAsmList; def: tdef; const fromloc: tlocation; out toloc: tlocation); procedure thlcgjvm.g_reference_loc(list: TAsmList; def: tdef; const fromloc: tlocation; out toloc: tlocation);
procedure handle_reg_move(regsize: tdef; const fromreg: tregister; out toreg: tregister; regtyp: tregistertype);
begin
case regtyp of
R_INTREGISTER:
toreg:=getintregister(list,regsize);
R_ADDRESSREGISTER:
toreg:=getaddressregister(list,regsize);
R_FPUREGISTER:
toreg:=getfpuregister(list,regsize);
end;
a_load_reg_reg(list,regsize,regsize,fromreg,toreg);
end;
begin begin
toloc:=fromloc;
case fromloc.loc of case fromloc.loc of
{ volatile location, can't get a permanent reference }
LOC_REGISTER,
LOC_FPUREGISTER:
internalerror(2011031406);
LOC_CONSTANT:
{ finished }
;
LOC_CREGISTER:
handle_reg_move(def,fromloc.reference.index,toloc.reference.index,R_INTREGISTER);
LOC_CFPUREGISTER:
handle_reg_move(def,fromloc.reference.index,toloc.reference.index,R_FPUREGISTER);
{ although LOC_CREFERENCE cannot be an lvalue, we may want to take a
reference to such a location for multiple reading }
LOC_CREFERENCE, LOC_CREFERENCE,
LOC_REFERENCE: LOC_REFERENCE:
begin begin
toloc:=fromloc;
if (fromloc.reference.base<>NR_NO) and if (fromloc.reference.base<>NR_NO) and
(fromloc.reference.base<>current_procinfo.framepointer) and (fromloc.reference.base<>current_procinfo.framepointer) and
(fromloc.reference.base<>NR_STACK_POINTER_REG) then (fromloc.reference.base<>NR_STACK_POINTER_REG) then
handle_reg_move(java_jlobject,fromloc.reference.base,toloc.reference.base,R_ADDRESSREGISTER); g_allocload_reg_reg(list,voidpointertype,fromloc.reference.base,toloc.reference.base,R_ADDRESSREGISTER);
case fromloc.reference.arrayreftype of case fromloc.reference.arrayreftype of
art_indexreg: art_indexreg:
begin begin
{ all array indices in Java are 32 bit ints } { all array indices in Java are 32 bit ints }
handle_reg_move(s32inttype,fromloc.reference.index,toloc.reference.index,R_INTREGISTER); g_allocload_reg_reg(list,s32inttype,fromloc.reference.index,toloc.reference.index,R_INTREGISTER);
end; end;
art_indexref: art_indexref:
begin begin
{ base register of the address of the index -> pointer }
if (fromloc.reference.indexbase<>NR_NO) and if (fromloc.reference.indexbase<>NR_NO) and
(fromloc.reference.indexbase<>NR_STACK_POINTER_REG) then (fromloc.reference.indexbase<>NR_STACK_POINTER_REG) then
handle_reg_move(s32inttype,fromloc.reference.indexbase,toloc.reference.indexbase,R_ADDRESSREGISTER); g_allocload_reg_reg(list,voidpointertype,fromloc.reference.indexbase,toloc.reference.indexbase,R_ADDRESSREGISTER);
end; end;
end; end;
end; end;
else else
internalerror(2011031407); inherited;
end; end;
end; end;