* made the alpha version compilable

This commit is contained in:
florian 1999-08-06 14:15:51 +00:00
parent fe08a50b7e
commit eca7460542
5 changed files with 175 additions and 104 deletions

View File

@ -25,7 +25,7 @@ unit cgcpu;
interface interface
uses uses
cgobj,aasm,cpuasm,cpubase; cgbase,cgobj,aasm,cpuasm,cpubase,cpuinfo;
type type
pcgalpha = ^tcgalpha; pcgalpha = ^tcgalpha;
@ -33,17 +33,16 @@ tcgalpha = object(tcg)
procedure a_push_reg(list : paasmoutput;r : tregister);virtual; procedure a_push_reg(list : paasmoutput;r : tregister);virtual;
procedure a_call_name(list : paasmoutput;const s : string; procedure a_call_name(list : paasmoutput;const s : string;
offset : longint);virtual; offset : longint);virtual;
procedure a_call_name(list : paasmoutput;const s : string;
offset : longint);virtual;
procedure a_push_reg(list : paasmoutput;r : tregister);virtual;
procedure a_load_const_reg(list : paasmoutput;size : tcgsize;a : aword;register : tregister);virtual; procedure a_load_const_reg(list : paasmoutput;size : tcgsize;a : aword;register : tregister);virtual;
procedure a_load_reg_ref(list : paasmoutput;size : tcgsize;register : tregister;const ref : treference);virtual; procedure a_load_reg_ref(list : paasmoutput;size : tcgsize;register : tregister;const ref : treference);virtual;
procedure a_load_ref_reg(list : paasmoutput;size : tcgsize;const ref : treference;register : tregister);virtual; procedure a_load_ref_reg(list : paasmoutput;size : tcgsize;const ref : treference;register : tregister);virtual;
procedure a_load_reg_reg(list : paasmoutput;size : tcgsize;reg1,reg2 : tregister);virtual; procedure a_load_reg_reg(list : paasmoutput;size : tcgsize;reg1,reg2 : tregister);virtual;
procedure a_cmp_reg_const_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;b : byte;reg : tregister; l : pasmlabel);virtual; procedure a_cmp_reg_const_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;b : byte;
reg : tregister; l : pasmlabel);virtual;
procedure a_cmp_reg_reg_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;reg1,reg2 : tregister;l : pasmlabel); procedure a_cmp_reg_reg_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;reg1,reg2 : tregister;l : pasmlabel);
procedure a_cmp_reg_ref_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;reg : tregister;l : pasmlabel); procedure a_cmp_reg_ref_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;reg : tregister;l : pasmlabel);
procedure a_cmp_ref_const_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;l : longint;reg : tregister; l : pasmlabel); procedure a_cmp_ref_const_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;a : aword;
reg : tregister; l : pasmlabel);
procedure a_loadaddress_ref_reg(list : paasmoutput;const ref : treference;r : tregister);virtual; procedure a_loadaddress_ref_reg(list : paasmoutput;const ref : treference;r : tregister);virtual;
procedure g_stackframe_entry(list : paasmoutput;localsize : longint);virtual; procedure g_stackframe_entry(list : paasmoutput;localsize : longint);virtual;
procedure g_maybe_loadself(list : paasmoutput);virtual; procedure g_maybe_loadself(list : paasmoutput);virtual;
@ -51,10 +50,6 @@ tcgalpha = object(tcg)
procedure g_push_exception_value_reg(list : paasmoutput;reg : tregister);virtual; procedure g_push_exception_value_reg(list : paasmoutput;reg : tregister);virtual;
procedure g_push_exception_value_const(list : paasmoutput;reg : tregister);virtual; procedure g_push_exception_value_const(list : paasmoutput;reg : tregister);virtual;
procedure g_pop_exception_value_reg(list : paasmoutput;reg : tregister);virtual; procedure g_pop_exception_value_reg(list : paasmoutput;reg : tregister);virtual;
procedure g_stackframe_entry(list : paasmoutput;localsize : longint);virtual;
procedure g_exite_entry(list : paasmoutput;localsize : longint);virtual;
procedure g_exitcode(list : paasmoutput;parasize : longint;
nostackframe,inlined : boolean);
constructor init; constructor init;
end; end;
@ -74,12 +69,12 @@ procedure tcgalpha.g_stackframe_entry(list : paasmoutput;localsize : longint);
begin begin
With List^ do With List^ do
begin begin
concat(new(paialpha,op_reg_ref(A_LDGP,Global_pointer,new_reference(R_27,0))); concat(new(paialpha,op_reg_ref(A_LDGP,Global_pointer,new_reference(R_27,0))));
concat(new(paialpha,op_reg_ref(A_LDA,Stack_Pointer,new_reference(Stack_pointer,-LocalSize)))); concat(new(paialpha,op_reg_ref(A_LDA,Stack_Pointer,new_reference(Stack_pointer,-LocalSize))));
If LocalSize<>0 then If LocalSize<>0 then
concat(new(paiframe,Init(Global_pinter,LocalSize,R27,0))); concat(new(paiframe,Init(Global_pointer,LocalSize,R_27,0)));
// Always generate a frame pointer. { Always generate a frame pointer. }
concat(new(paiframe,op_reg_reg_reg(A_BIS,Stackpointer,Stack_pointer,Frame_pointer))) concat(new(paialpha,op_reg_reg_reg(A_BIS,Stack_pointer,Stack_pointer,Frame_pointer)))
end; end;
end; end;
@ -88,14 +83,15 @@ procedure g_exitcode(list : paasmoutput;parasize : longint; nostackframe,inlined
begin begin
With List^ do With List^ do
begin begin
// Restore stack pointer from frame pointer { Restore stack pointer from frame pointer }
Concat (new(paialpha,op_reg_reg_reg(A_BIS,Frame_Pointer,Frame_Pointer,Stack_Pointer))); Concat (new(paialpha,op_reg_reg_reg(A_BIS,Frame_Pointer,Frame_Pointer,Stack_Pointer)));
// Restore previous stack position { Restore previous stack position}
Concat (new(paialpha,op_reg_const_reg(A_ADDQ,Stack_Pointer,Parasize,Stack_pointer))); Concat (new(paialpha,op_reg_const_reg(A_ADDQ,Stack_Pointer,Parasize,Stack_pointer)));
// return... { return... }
Concat (new(paialpha,op_reg_ref_const(A_RET,Stack_pointer,new_reference(Return_pointer,0),1))); Concat (new(paialpha,op_reg_ref_const(A_RET,Stack_pointer,new_reference(Return_pointer,0),1)));
// end directive { end directive
Concat (new(paiend,init('')); Concat (new(paiend,init(''));
}
end; end;
end; end;
@ -115,43 +111,32 @@ procedure tcgalpha.a_push_reg(list : paasmoutput;r : tregister);
end; end;
procedure tcgalpha.a_call_name(list : paasmoutput;const s : string; offset : longint);virtual; procedure tcgalpha.a_load_const_reg(list : paasmoutput;size : tcgsize;a : aword;register : tregister);
begin begin
end; end;
procedure tcgalpha.a_push_reg(list : paasmoutput;r : tregister);virtual; procedure tcgalpha.a_load_reg_ref(list : paasmoutput;size : tcgsize;register : tregister;const ref : treference);
begin begin
end; end;
procedure tcgalpha.a_load_const_reg(list : paasmoutput;size : tcgsize;a : aword;register : tregister);virtual; procedure tcgalpha.a_load_ref_reg(list : paasmoutput;size : tcgsize;const ref : treference;register : tregister);
begin begin
end; end;
procedure tcgalpha.a_load_reg_ref(list : paasmoutput;size : tcgsize;register : tregister;const ref : treference);virtual; procedure tcgalpha.a_load_reg_reg(list : paasmoutput;size : tcgsize;reg1,reg2 : tregister);
begin begin
end; end;
procedure tcgalpha.a_load_ref_reg(list : paasmoutput;size : tcgsize;const ref : treference;register : tregister);virtual; procedure tcgalpha.a_cmp_reg_const_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;b : byte;reg : tregister;
l : pasmlabel);
begin
end;
procedure tcgalpha.a_load_reg_reg(list : paasmoutput;size : tcgsize;reg1,reg2 : tregister);virtual;
begin
end;
procedure tcgalpha.a_cmp_reg_const_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;b : byte;reg : tregister; l : pasmlabel);virtual;
begin begin
end; end;
@ -169,55 +154,44 @@ begin
end; end;
procedure tcgalpha.a_cmp_ref_const_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;l : longint;reg : tregister; l : pasmlabel); procedure tcgalpha.a_cmp_ref_const_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;a : aword;
reg : tregister; l : pasmlabel);
begin begin
end; end;
procedure tcgalpha.a_loadaddress_ref_reg(list : paasmoutput;const ref : treference;r : tregister);
begin begin
end; end;
procedure tcgalpha.a_loadaddress_ref_reg(list : paasmoutput;const ref : treference;r : tregister);virtual; procedure tcgalpha.g_maybe_loadself(list : paasmoutput);
begin begin
end; end;
procedure tcgalpha.g_stackframe_entry(list : paasmoutput;localsize : longint);virtual; procedure tcgalpha.g_restore_frame_pointer(list : paasmoutput);
begin begin
end; end;
procedure tcgalpha.g_maybe_loadself(list : paasmoutput);virtual; procedure tcgalpha.g_push_exception_value_reg(list : paasmoutput;reg : tregister);
begin begin
end; end;
procedure tcgalpha.g_restore_frame_pointer(list : paasmoutput);virtual; procedure tcgalpha.g_push_exception_value_const(list : paasmoutput;reg : tregister);
begin begin
end; end;
procedure tcgalpha.g_push_exception_value_reg(list : paasmoutput;reg : tregister);virtual; procedure tcgalpha.g_pop_exception_value_reg(list : paasmoutput;reg : tregister);
begin
end;
procedure tcgalpha.g_push_exception_value_const(list : paasmoutput;reg : tregister);virtual;
begin
end;
procedure tcgalpha.g_pop_exception_value_reg(list : paasmoutput;reg : tregister);virtual;
begin begin
end; end;
@ -226,7 +200,10 @@ end;
end. end.
{ {
$Log$ $Log$
Revision 1.4 1999-08-06 13:53:54 michael Revision 1.5 1999-08-06 14:15:53 florian
* made the alpha version compilable
Revision 1.4 1999/08/06 13:53:54 michael
Empty Virtual methods inserted Empty Virtual methods inserted
Revision 1.3 1999/08/05 15:50:32 michael Revision 1.3 1999/08/05 15:50:32 michael

View File

@ -78,10 +78,11 @@ type
constructor op_ref_ref(op : tasmop;_op1,_op2 : preference); constructor op_ref_ref(op : tasmop;_op1,_op2 : preference);
constructor op_reg_reg_reg(op : tasmop;_op1,_op2,_op3 : tregister); constructor op_reg_reg_reg(op : tasmop;_op1,_op2,_op3 : tregister);
constructor op_const_reg_reg(op : tasmop;_op1 : longint;_op2 : tregister;_op3 : tregister); constructor op_reg_const_reg(op : tasmop;_op1 : tregister;_op2 : longint;_op3 : tregister);
constructor op_const_ref_reg(op : tasmop;_op1 : longint;_op2 : preference;_op3 : tregister); constructor op_const_ref_reg(op : tasmop;_op1 : longint;_op2 : preference;_op3 : tregister);
constructor op_reg_reg_ref(op : tasmop;_op1,_op2 : tregister; _op3 : preference); constructor op_reg_reg_ref(op : tasmop;_op1,_op2 : tregister; _op3 : preference);
constructor op_const_reg_ref(op : tasmop;_op1 : longint;_op2 : tregister;_op3 : preference); constructor op_const_reg_ref(op : tasmop;_op1 : longint;_op2 : tregister;_op3 : preference);
constructor op_reg_ref_const(op : tasmop;_op1 : tregister;_op2 : preference;_op3 : longint);
{ this is for Jmp instructions } { this is for Jmp instructions }
constructor op_cond_sym(op : tasmop;cond:TAsmCond;_op1 : pasmsymbol); constructor op_cond_sym(op : tasmop;cond:TAsmCond;_op1 : pasmsymbol);
@ -239,7 +240,7 @@ implementation
ops:=3; ops:=3;
end; end;
constructor taialpha.op_const_reg_reg(op : tasmop;_op1 : longint;_op2 : tregister;_op3 : tregister); constructor taialpha.op_reg_const_reg(op : tasmop;_op1 : tregister;_op2 : longint;_op3 : tregister);
begin begin
inherited init; inherited init;
init(op); init(op);
@ -267,6 +268,13 @@ implementation
ops:=3; ops:=3;
end; end;
constructor taialpha.op_reg_ref_const(op : tasmop;_op1 : tregister;_op2 : preference;_op3 : longint);
begin
inherited init;
init(op);
ops:=3;
end;
constructor taialpha.op_cond_sym(op : tasmop;cond:TAsmCond;_op1 : pasmsymbol); constructor taialpha.op_cond_sym(op : tasmop;cond:TAsmCond;_op1 : pasmsymbol);
begin begin
@ -356,7 +364,10 @@ implementation
end. end.
{ {
$Log$ $Log$
Revision 1.2 1999-08-05 15:50:33 michael Revision 1.3 1999-08-06 14:15:54 florian
* made the alpha version compilable
Revision 1.2 1999/08/05 15:50:33 michael
* more changes * more changes
Revision 1.1 1999/08/03 00:24:01 michael Revision 1.1 1999/08/03 00:24:01 michael

View File

@ -105,6 +105,7 @@ Const
accumulator = R_0; accumulator = R_0;
global_pointer = R_29; global_pointer = R_29;
scratch_register = R_1; scratch_register = R_1;
return_pointer = R_26;
cpuflags = [cf_64bitaddr]; cpuflags = [cf_64bitaddr];
@ -237,7 +238,10 @@ end;
end. end.
{ {
$Log$ $Log$
Revision 1.9 1999-08-06 13:26:53 florian Revision 1.10 1999-08-06 14:15:55 florian
* made the alpha version compilable
Revision 1.9 1999/08/06 13:26:53 florian
* more changes ... * more changes ...
Revision 1.8 1999/08/05 17:10:58 florian Revision 1.8 1999/08/05 17:10:58 florian

View File

@ -1,6 +1,7 @@
{ {
$Id$ $Id$
Copyright (c) 1993-98 by Florian Klaempfl Copyright (c) 1993-99 by Florian Klaempfl
Member of the Free Pascal development team
This unit implements the basic code generator object This unit implements the basic code generator object
@ -88,7 +89,6 @@ unit cgobj;
procedure a_call_name(list : paasmoutput;const s : string; procedure a_call_name(list : paasmoutput;const s : string;
offset : longint);virtual; offset : longint);virtual;
procedure a_push_reg(list : paasmoutput;r : tregister);virtual;
{ move instructions } { move instructions }
procedure a_load_const_reg(list : paasmoutput;size : tcgsize;a : aword;register : tregister);virtual; procedure a_load_const_reg(list : paasmoutput;size : tcgsize;a : aword;register : tregister);virtual;
@ -101,7 +101,7 @@ unit cgobj;
l : pasmlabel);virtual; l : pasmlabel);virtual;
procedure a_cmp_reg_reg_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;reg1,reg2 : tregister;l : pasmlabel); procedure a_cmp_reg_reg_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;reg1,reg2 : tregister;l : pasmlabel);
procedure a_cmp_reg_ref_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;reg : tregister;l : pasmlabel); procedure a_cmp_reg_ref_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;reg : tregister;l : pasmlabel);
procedure a_cmp_ref_const_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;l : longint;reg : tregister; procedure a_cmp_ref_const_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;a : aword;reg : tregister;
l : pasmlabel); l : pasmlabel);
procedure a_loadaddress_ref_reg(list : paasmoutput;const ref : treference;r : tregister);virtual; procedure a_loadaddress_ref_reg(list : paasmoutput;const ref : treference;r : tregister);virtual;
@ -120,7 +120,7 @@ unit cgobj;
procedure g_push_exception_value_const(list : paasmoutput;reg : tregister);virtual; procedure g_push_exception_value_const(list : paasmoutput;reg : tregister);virtual;
{ that procedure pops a exception value } { that procedure pops a exception value }
procedure g_pop_exception_value_reg(list : paasmoutput;reg : tregister);virtual; procedure g_pop_exception_value_reg(list : paasmoutput;reg : tregister);virtual;
procedure g_return_from_proc(list : paasmoutput;parasize : aword);virtual;
{********************************************************} {********************************************************}
{ these methods can be overriden for extra functionality } { these methods can be overriden for extra functionality }
@ -188,6 +188,12 @@ unit cgobj;
list^.concat(new(pairegalloc,dealloc(r))); list^.concat(new(pairegalloc,dealloc(r)));
end; end;
procedure tcg.a_label(list : paasmoutput;l : pasmlabel);
begin
list^.concat(new(pai_label,init(l)));
end;
{***************************************************************************** {*****************************************************************************
this methods must be overridden for extra functionality this methods must be overridden for extra functionality
******************************************************************************} ******************************************************************************}
@ -211,16 +217,22 @@ unit cgobj;
for better code generation these methods should be overridden for better code generation these methods should be overridden
******************************************************************************} ******************************************************************************}
procedure tcg.a_param_reg(list : paasmoutput;size : tcgsize;r : tregister;nr : longint);
begin
a_push_reg(list,r);
end;
procedure tcg.a_param_const(list : paasmoutput;size : tcgsize;a : aword;nr : longint); procedure tcg.a_param_const(list : paasmoutput;size : tcgsize;a : aword;nr : longint);
begin begin
{!!!!!!!! a_push_const8(list,b); } a_reg_alloc(list,scratch_register);
a_load_const_reg(list,size,a,scratch_register);
a_param_reg(list,size,scratch_register,nr);
a_reg_dealloc(list,scratch_register);
end;
procedure tcg.a_param_ref(list : paasmoutput;size : tcgsize;const r : treference;nr : longint);
begin
a_reg_alloc(list,scratch_register);
a_load_ref_reg(list,size,r,scratch_register);
a_param_reg(list,size,scratch_register,nr);
a_reg_dealloc(list,scratch_register);
end; end;
procedure tcg.a_param_ref_addr(list : paasmoutput;r : treference;nr : longint); procedure tcg.a_param_ref_addr(list : paasmoutput;r : treference;nr : longint);
@ -462,10 +474,10 @@ unit cgobj;
tg.availabletempregsmm)) then tg.availabletempregsmm)) then
begin begin
if not(r in tg.usedinproc) then if not(r in tg.usedinproc) then
a_push_reg(list,r) {!!!!!!!!!!!! a_push_reg(list,r) }
end end
else else
a_push_reg(list,r); {!!!!!!!! a_push_reg(list,r) };
end; end;
end; end;
{ omit stack frame ? } { omit stack frame ? }
@ -736,19 +748,7 @@ unit cgobj;
if po_interrupt in aktprocsym^.definition^.procoptions then if po_interrupt in aktprocsym^.definition^.procoptions then
g_interrupt_stackframe_exit(list) g_interrupt_stackframe_exit(list)
else else
begin g_return_from_proc(list,parasize);
{ parameters are limited to 65535 bytes because }
{ ret allows only imm16 }
if (parasize>65535) and not(pocall_clearstack in aktprocsym^.definition^.proccalloptions) then
CGMessage(cg_e_parasize_too_big);
{Routines with the poclearstack flag set use only a ret.}
{ also routines with parasize=0 }
if (parasize=0) or (pocall_clearstack in aktprocsym^.definition^.proccalloptions) then
exprasmlist^.concat(new(pai386,op_none(A_RET,S_NO)))
else
exprasmlist^.concat(new(pai386,op_const(A_RET,S_NO,parasize)));
end;
list^.concat(new(pai_symbol_end,initname(aktprocsym^.definition^.mangledname))); list^.concat(new(pai_symbol_end,initname(aktprocsym^.definition^.mangledname)));
{$ifdef GDB} {$ifdef GDB}
@ -798,12 +798,6 @@ unit cgobj;
some abstract definitions some abstract definitions
****************************************************************************} ****************************************************************************}
procedure tcg.a_push_reg(list : paasmoutput;r : tregister);
begin
abstract;
end;
procedure tcg.a_call_name(list : paasmoutput;const s : string; procedure tcg.a_call_name(list : paasmoutput;const s : string;
offset : longint); offset : longint);
@ -811,12 +805,6 @@ unit cgobj;
abstract; abstract;
end; end;
procedure tcg.a_load_const_ref(list : paasmoutput;a : aword;const ref : treference);
begin
abstract;
end;
procedure tcg.g_stackframe_entry(list : paasmoutput;localsize : longint); procedure tcg.g_stackframe_entry(list : paasmoutput;localsize : longint);
begin begin
@ -835,7 +823,13 @@ unit cgobj;
abstract; abstract;
end; end;
procedure tcg.a_loadaddress_ref_reg(list : paasmoutput;ref : treference;r : tregister); procedure g_return_from_proc(list : paasmoutput;parasize : aword);
begin
abstract;
end;
procedure tcg.a_loadaddress_ref_reg(list : paasmoutput;const ref : treference;r : tregister);
begin begin
abstract; abstract;
@ -853,13 +847,75 @@ unit cgobj;
abstract; abstract;
end; end;
procedure g_pop_exception_value_reg(list : paasmoutput;reg : tregister); procedure tcg.g_pop_exception_value_reg(list : paasmoutput;reg : tregister);
begin begin
abstract; abstract;
end; end;
procedure a_param_ref(list : paasmoutput;const r : treference;nr : longint);virtual; procedure tcg.a_load_const_reg(list : paasmoutput;size : tcgsize;a : aword;register : tregister);
begin
abstract;
end;
procedure tcg.a_load_reg_ref(list : paasmoutput;size : tcgsize;register : tregister;const ref : treference);
begin
abstract;
end;
procedure tcg.a_load_ref_reg(list : paasmoutput;size : tcgsize;const ref : treference;register : tregister);
begin
abstract;
end;
procedure tcg.a_load_reg_reg(list : paasmoutput;size : tcgsize;reg1,reg2 : tregister);
begin
abstract;
end;
procedure tcg.a_cmp_reg_const_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;b : byte;reg : tregister;
l : pasmlabel);
begin
abstract;
end;
procedure tcg.a_cmp_reg_reg_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;reg1,reg2 : tregister;l : pasmlabel);
begin
abstract;
end;
procedure tcg.a_cmp_reg_ref_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;reg : tregister;l : pasmlabel);
begin
abstract;
end;
procedure tcg.a_cmp_ref_const_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;a : aword;reg : tregister;
l : pasmlabel);
begin
abstract;
end;
procedure tcg.g_return_from_proc(list : paasmoutput;parasize : aword);
begin
abstract;
end;
procedure tcg.a_param_reg(list : paasmoutput;size : tcgsize;r : tregister;nr : longint);
begin
abstract;
end;
procedure tcg.a_paramaddr_ref(list : paasmoutput;const r : treference;nr : longint);
begin begin
abstract; abstract;
@ -868,7 +924,10 @@ unit cgobj;
end. end.
{ {
$Log$ $Log$
Revision 1.13 1999-08-06 13:26:50 florian Revision 1.14 1999-08-06 14:15:51 florian
* made the alpha version compilable
Revision 1.13 1999/08/06 13:26:50 florian
* more changes ... * more changes ...
Revision 1.12 1999/08/05 17:10:56 florian Revision 1.12 1999/08/05 17:10:56 florian

View File

@ -44,6 +44,7 @@ unit cgcpu;
procedure g_stackframe_entry(list : paasmoutput;localsize : longint);virtual; procedure g_stackframe_entry(list : paasmoutput;localsize : longint);virtual;
procedure g_restore_frame_pointer(list : paasmoutput);virtual; procedure g_restore_frame_pointer(list : paasmoutput);virtual;
procedure tcg386.g_ret_from_proc(list : paasmoutput;para size : aword);
constructor init; constructor init;
end; end;
@ -122,10 +123,29 @@ unit cgcpu;
begin begin
list^.concat(new(pai386,op_none(A_LEAVE,S_NO))); list^.concat(new(pai386,op_none(A_LEAVE,S_NO)));
end; end;
procedure tcg386.g_ret_from_proc(list : paasmoutput;para size : aword);
begin
{ parameters are limited to 65535 bytes because }
{ ret allows only imm16 }
if (parasize>65535) and not(pocall_clearstack in aktprocsym^.definition^.proccalloptions) then
CGMessage(cg_e_parasize_too_big);
{ Routines with the poclearstack flag set use only a ret.}
{ also routines with parasize=0 }
if (parasize=0) or (pocall_clearstack in aktprocsym^.definition^.proccalloptions) then
list^.concat(new(pai386,op_none(A_RET,S_NO)))
else
list^.concat(new(pai386,op_const(A_RET,S_NO,parasize)));
end;
end. end.
{ {
$Log$ $Log$
Revision 1.3 1999-08-06 13:26:54 florian Revision 1.4 1999-08-06 14:15:56 florian
* made the alpha version compilable
Revision 1.3 1999/08/06 13:26:54 florian
* more changes ... * more changes ...
Revision 1.2 1999/08/01 23:19:59 florian Revision 1.2 1999/08/01 23:19:59 florian