* function prologue fixed

This commit is contained in:
mazen 2002-09-30 19:12:14 +00:00
parent 1a6d33860b
commit f83c707f71
5 changed files with 82 additions and 1697 deletions

View File

@ -113,14 +113,14 @@ PROCEDURE tcgSPARC.a_param_reg(list:TAasmOutput;size:tcgsize;r:tregister;CONST L
IF(Size<>OS_32)AND(Size<>OS_S32)
THEN
InternalError(2002032212);
List.Concat(taicpu.op_reg(A_SAVE,S_L,r));
List.Concat(taicpu.op_reg(A_LD,S_L,r));
END;
PROCEDURE tcgSPARC.a_param_const(list:TAasmOutput;size:tcgsize;a:aword;CONST LocPara:TParaLocation);
BEGIN
IF(Size<>OS_32)AND(Size<>OS_S32)
THEN
InternalError(2002032213);
List.Concat(taicpu.op_const(A_SAVE,S_L,a));
List.Concat(taicpu.op_const(A_LD,S_L,a));
END;
PROCEDURE tcgSPARC.a_param_ref(list:TAasmOutput;size:tcgsize;CONST r:TReference;CONST LocPara:TParaLocation);
VAR
@ -129,7 +129,7 @@ PROCEDURE tcgSPARC.a_param_ref(list:TAasmOutput;size:tcgsize;CONST r:TReference;
IF((Size=OS_32)AND(Size=OS_S32))
THEN
InternalError(2002032214);
list.concat(taicpu.op_ref(A_SAVE,S_L,r));
list.concat(taicpu.op_ref(A_LD,S_L,r));
END;
PROCEDURE tcgSPARC.a_paramaddr_ref(list:TAasmOutput;CONST r:TReference;CONST LocPara:TParaLocation);
VAR
@ -140,20 +140,20 @@ PROCEDURE tcgSPARC.a_paramaddr_ref(list:TAasmOutput;CONST r:TReference;CONST Loc
CGMessage(cg_e_cant_use_far_pointer_there);
IF(r.base=R_NO)AND(r.index=R_NO)
THEN
list.concat(Taicpu.Op_sym_ofs(A_SAVE,S_L,r.symbol,r.offset))
list.concat(Taicpu.Op_sym_ofs(A_LD,S_L,r.symbol,r.offset))
ELSE IF(r.base=R_NO)AND(r.index<>R_NO)AND
(r.offset=0)AND(r.scalefactor=0)AND(r.symbol=nil)
THEN
list.concat(Taicpu.Op_reg(A_SAVE,S_L,r.index))
list.concat(Taicpu.Op_reg(A_LD,S_L,r.index))
ELSE IF(r.base<>R_NO)AND(r.index=R_NO)AND
(r.offset=0)AND(r.symbol=nil)
THEN
list.concat(Taicpu.Op_reg(A_SAVE,S_L,r.base))
list.concat(Taicpu.Op_reg(A_LD,S_L,r.base))
ELSE
BEGIN
tmpreg:=get_scratch_reg_address(list);
a_loadaddr_ref_reg(list,r,tmpreg);
list.concat(taicpu.op_reg(A_SAVE,S_L,tmpreg));
list.concat(taicpu.op_reg(A_LD,S_L,tmpreg));
free_scratch_reg(list,tmpreg);
END;
END;
@ -194,7 +194,7 @@ PROCEDURE tcgSPARC.a_load_const_ref(list:TAasmOutput;size:tcgsize;a:aword;CONST
END;
PROCEDURE tcgSPARC.a_load_reg_ref(list:TAasmOutput;size:TCGSize;reg:tregister;CONST ref:TReference);
BEGIN
list.concat(taicpu.op_reg_ref(A_NONE,TCGSize2OpSize[size],reg,ref));
list.concat(taicpu.op_reg_ref(A_LD,TCGSize2OpSize[size],reg,ref));
END;
PROCEDURE tcgSPARC.a_load_ref_reg(list:TAasmOutput;size:tcgsize;CONST ref:TReference;reg:tregister);
VAR
@ -517,7 +517,7 @@ PROCEDURE tcgSPARC.a_op_const_reg(list:TAasmOutput;Op:TOpCG;a:AWord;reg:TRegiste
{ allocate ecx }
(rg.getexplicitregisterint(list,R_ECX) = R_ECX))) then
begin
list.concat(taicpu.op_reg(A_SAVE,S_L,R_ECX));
list.concat(taicpu.op_reg(A_NONE,S_L,R_ECX));
popecx := true;
end;
a_load_reg_reg(list,OS_8,OS_8,(src),R_CL);
@ -776,14 +776,10 @@ PROCEDURE tcgSPARC.g_stackframe_entry(list:TAasmOutput;localsize:LongInt);
i:integer;
again:tasmlabel;
BEGIN
{Reserve space to save register window in case of overflow/underflow}
Inc(LocalSize,16);{located between %o6 and %o6+15}
WITH list DO
BEGIN
concat(Taicpu.Op_reg(A_SAVE,S_L,Frame_Pointer_Reg));
concat(Taicpu.Op_reg_reg(A_NONE,S_L,Stack_Pointer_Reg,Frame_Pointer_Reg));
IF localsize>0
THEN
concat(Taicpu.Op_const_reg(A_SUB,S_L,localsize,Stack_Pointer_Reg));
END;
concat(Taicpu.Op_reg_const_reg(A_SAVE,S_L,Stack_Pointer_Reg,localsize,Stack_Pointer_Reg));
END;
PROCEDURE tcgSPARC.g_restore_frame_pointer(list:TAasmOutput);
BEGIN

View File

@ -453,9 +453,16 @@ CONST
}
stab_regindex:ARRAY[tregister]OF ShortInt=({$INCLUDE stabregi.inc});
{ generic register names }
stack_pointer_reg =R_O6;
frame_pointer_reg =R_I6;
{*************************** generic register names **************************}
stack_pointer_reg = R_O6;
frame_pointer_reg = R_I6;
{the return_result_reg, is used inside the called function to store its return
value when that is a scalar value otherwise a pointer to the address of the
result is placed inside it}
return_result_reg = R_I0;
{the function_result_reg contains the function result after a call to a scalar
function othewise it contains a pointer to the returned result}
function_result_reg = R_O0;
self_pointer_reg =R_G5;
{There is no accumulator in the SPARC architecture. There are just families of
registers. All registers belonging to the same family are identical except in
@ -573,7 +580,10 @@ FUNCTION flags_to_cond(CONST f:TResFlags):TAsmCond;
END.
{
$Log$
Revision 1.7 2002-09-27 04:30:53 mazen
Revision 1.8 2002-09-30 19:12:14 mazen
* function prologue fixed
Revision 1.7 2002/09/27 04:30:53 mazen
* cleanup made
Revision 1.6 2002/09/24 03:57:53 mazen

File diff suppressed because it is too large Load Diff

View File

@ -31,15 +31,17 @@
UNIT ncpucall;
{$INCLUDE fpcdefs.inc}
interface
uses
symdef,node,ncal,ncgcal;
type
TSparccallnode = class(tcgcallnode)
function pass_1 : tnode;override;
procedure load_framepointer;override;
end;
uses
symdef,node,ncal,ncgcal;
type
TSparccallnode = class(tcgcallnode)
function pass_1 : tnode;override;
{Under SPARC, the frame pointer is automatically set by the SAVE instruction
which is part of the stardrad calling mechanism. This function will do nothing
else than adding the function prologue, which is in some case loading the
correct value into the frame pointer register!}
procedure load_framepointer;override;
end;
implementation
@ -76,58 +78,19 @@ implementation
{!!!!}
end;
end;
procedure TSparccallnode.load_framepointer;
begin
{ if we call a nested function in a method, we must }
{ push also SELF! }
{ THAT'S NOT TRUE, we have to load ESI via frame pointer }
{ access }
{
begin
loadesi:=false;
emit_reg(A_PUSH,S_L,R_ESI);
end;
}
{
if lexlevel=(tprocdef(procdefinition).parast.symtablelevel) then
begin
reference_reset_base(href,procinfo^.framepointer,procinfo^.framepointer_offset);
cg.a_param_ref(exprasmlist,OS_ADDR,href,-1);
end
{ this is only true if the difference is one !!
but it cannot be more !! }
else if (lexlevel=(tprocdef(procdefinition).parast.symtablelevel)-1) then
begin
cg.a_param_reg(exprasmlist,OS_ADDR,procinfo^.framepointer,-1);
end
else if (lexlevel>(tprocdef(procdefinition).parast.symtablelevel)) then
begin
hregister:=rg.getregisterint(exprasmlist);
reference_reset_base(href,procinfo^.framepointer,procinfo^.framepointer_offset);
cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister);
for i:=(tprocdef(procdefinition).parast.symtablelevel) to lexlevel-1 do
begin
{we should get the correct frame_pointer_offset at each level
how can we do this !!! }
reference_reset_base(href,hregister,procinfo^.framepointer_offset);
cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister);
end;
cg.a_param_reg(exprasmlist,OS_ADDR,hregister,-1);
rg.ungetregisterint(exprasmlist,hregister);
end
else
internalerror(2002081303);
}
end;
procedure TSparcCallNode.load_framepointer;
begin
exprasmList.concat(TAiCpu.Op_reg_const_reg(A_SAVE,S_L,stack_pointer_reg,-tprocdef(procdefinition).parast.datasize,stack_pointer_reg));
end;
begin
ccallnode:=TSparccallnode;
end.
{
$Log$
Revision 1.2 2002-08-30 13:16:23 mazen
Revision 1.3 2002-09-30 19:12:14 mazen
* function prologue fixed
Revision 1.2 2002/08/30 13:16:23 mazen
*call parameter handling is now based on the new param manager
Revision 1.2 2002/08/17 09:23:49 florian

View File

@ -1,39 +1,42 @@
{*****************************************************************************}
{ File : strregs.inc }
{ Author : Mazen NEIFER }
{ Project : Free Pascal Compiler (FPC) }
{ Creation date : 2002\05\08 }
{ Last modification date : 2002\06\01 }
{ Licence : GPL }
{ file : strregs.inc }
{ Author : Mazen NEifER }
{ Project : free Pascal compiler (fPc) }
{ creation date : 2002\05\08 }
{ last modification date : 2002\06\01 }
{ licence : gPl }
{ Bug report : mazen.neifer.01@supaero.org }
{*****************************************************************************}
'NO',
{General purpose global registers}
'G0','G1','G2','G3','G4','G5','G6','G7',
{General purpose out registers}
'O0','O1','O2','O3','O4','O5','O6','O7',
{General purpose local registers}
'L0','L1','L2','L3','L4','L5','L6','L7',
{General purpose in registers}
'I0','I1','I2','I3','I4','I5','I6','I7',
{Floating point registers}
'F0','F1','F2','F3','F4','F5','F6','F7',
'F8','F9','F10','F11','F12','F13','F14','F15',
'F16','F17','F18','F19','F20','F21','F22','F23',
'F24','F25','F26','F27','F28','F29','F30','F31',
{Floating point status/"front of queue" registers}
'FSR','FQ',
{Coprocessor registers}
'C0','C1','C2','C3','C4','C5','C6','C7',
'C8','C9','C10','C11','C12','C13','C14','C15',
'C16','C17','C18','C19','C20','C21','C22','C23',
'C24','C25','C26','C27','C28','C29','C30','C31',
{Coprocessor status/queue registers}
'CSR','CQ',
{
$Id:
}
'%No',
{general purpose global registers}
'%g0','%g1','%g2','%g3','%g4','%g5','%g6','%g7',
{general purpose out registers}
'%o0','%o1','%o2','%o3','%o4','%o5','%o6','%o7',
{general purpose local registers}
'%l0','%l1','%l2','%l3','%l4','%l5','%l6','%l7',
{general purpose in registers}
'%i0','%i1','%i2','%i3','%i4','%i5','%i6','%i7',
{floating point registers}
'%f0','%f1','%f2','%f3','%f4','%f5','%f6','%f7',
'%f8','%f9','%f10','%f11','%f12','%f13','%f14','%f15',
'%f16','%f17','%f18','%f19','%f20','%f21','%f22','%f23',
'%f24','%f25','%f26','%f27','%f28','%f29','%f30','%f31',
{floating point status/"front of queue" registers}
'%fSR','%fQ',
{coprocessor registers}
'%c0','%c1','%c2','%c3','%c4','%c5','%c6','%c7',
'%c8','%c9','%c10','%c11','%c12','%c13','%c14','%c15',
'%c16','%c17','%c18','%c19','%c20','%c21','%c22','%c23',
'%c24','%c25','%c26','%c27','%c28','%c29','%c30','%c31',
{coprocessor status/queue registers}
'%csr','%cq',
{"Program status"/"Trap vactor base address register"/"Window invalid mask"/Y registers}
'PSR','TBR','WIM','Y',
'%psr','%tbr','%wim','%y',
{Ancillary state registers}
'ASR0','ASR1','ASR2','ASR3','ASR4','ASR5','ASR6','ASR7',
'ASR8','ASR9','ASR10','ASR11','ASR12','ASR13','ASR14','ASR15',
'ASR16','ASR17','ASR18','ASR19','ASR20','ASR21','ASR22','ASR23',
'ASR24','ASR25','ASR26','ASR27','ASR28','ASR29','ASR30','ASR31'
'%asr0','%asr1','%asr2','%asr3','%asr4','%asr5','%asr6','%asr7',
'%asr8','%asr9','%asr10','%asr11','%asr12','%asr13','%asr14','%asr15',
'%asr16','%asr17','%asr18','%asr19','%asr20','%asr21','%asr22','%asr23',
'%asr24','%asr25','%asr26','%asr27','%asr28','%asr29','%asr30','%asr31'