* 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
uses
cgobj,aasm,cpuasm,cpubase;
cgbase,cgobj,aasm,cpuasm,cpubase,cpuinfo;
type
pcgalpha = ^tcgalpha;
@ -33,17 +33,16 @@ tcgalpha = object(tcg)
procedure a_push_reg(list : paasmoutput;r : tregister);virtual;
procedure a_call_name(list : paasmoutput;const s : string;
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_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_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_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 g_stackframe_entry(list : paasmoutput;localsize : longint);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_const(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;
end;
@ -74,12 +69,12 @@ procedure tcgalpha.g_stackframe_entry(list : paasmoutput;localsize : longint);
begin
With List^ do
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))));
If LocalSize<>0 then
concat(new(paiframe,Init(Global_pinter,LocalSize,R27,0)));
// Always generate a frame pointer.
concat(new(paiframe,op_reg_reg_reg(A_BIS,Stackpointer,Stack_pointer,Frame_pointer)))
concat(new(paiframe,Init(Global_pointer,LocalSize,R_27,0)));
{ Always generate a frame pointer. }
concat(new(paialpha,op_reg_reg_reg(A_BIS,Stack_pointer,Stack_pointer,Frame_pointer)))
end;
end;
@ -88,14 +83,15 @@ procedure g_exitcode(list : paasmoutput;parasize : longint; nostackframe,inlined
begin
With List^ do
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)));
// Restore previous stack position
{ Restore previous stack position}
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)));
// end directive
{ end directive
Concat (new(paiend,init(''));
}
end;
end;
@ -115,43 +111,32 @@ procedure tcgalpha.a_push_reg(list : paasmoutput;r : tregister);
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
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
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
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
end;
procedure tcgalpha.a_load_ref_reg(list : paasmoutput;size : tcgsize;const ref : treference;register : tregister);virtual;
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;
procedure tcgalpha.a_cmp_reg_const_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;b : byte;reg : tregister;
l : pasmlabel);
begin
end;
@ -169,55 +154,44 @@ begin
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
end;
procedure tcgalpha.a_loadaddress_ref_reg(list : paasmoutput;const ref : treference;r : tregister);
begin
end;
procedure tcgalpha.a_loadaddress_ref_reg(list : paasmoutput;const ref : treference;r : tregister);virtual;
procedure tcgalpha.g_maybe_loadself(list : paasmoutput);
begin
end;
procedure tcgalpha.g_stackframe_entry(list : paasmoutput;localsize : longint);virtual;
procedure tcgalpha.g_restore_frame_pointer(list : paasmoutput);
begin
end;
procedure tcgalpha.g_maybe_loadself(list : paasmoutput);virtual;
procedure tcgalpha.g_push_exception_value_reg(list : paasmoutput;reg : tregister);
begin
end;
procedure tcgalpha.g_restore_frame_pointer(list : paasmoutput);virtual;
procedure tcgalpha.g_push_exception_value_const(list : paasmoutput;reg : tregister);
begin
end;
procedure tcgalpha.g_push_exception_value_reg(list : paasmoutput;reg : tregister);virtual;
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;
procedure tcgalpha.g_pop_exception_value_reg(list : paasmoutput;reg : tregister);
begin
end;
@ -226,7 +200,10 @@ end;
end.
{
$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
Revision 1.3 1999/08/05 15:50:32 michael

View File

@ -44,13 +44,13 @@ type
LS,LU : longint;
Constructor init (GP : Tregister; Localsize : Longint; RA : TRegister; L : longint);
end;
paient = ^taient;
taient = object(tai)
Name : string;
Constructor Init (ProcName : String);
end;
paialpha = ^taialpha;
taialpha = object(tai)
@ -78,10 +78,11 @@ type
constructor op_ref_ref(op : tasmop;_op1,_op2 : preference);
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_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_reg_ref_const(op : tasmop;_op1 : tregister;_op2 : preference;_op3 : longint);
{ this is for Jmp instructions }
constructor op_cond_sym(op : tasmop;cond:TAsmCond;_op1 : pasmsymbol);
@ -239,7 +240,7 @@ implementation
ops:=3;
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
inherited init;
init(op);
@ -267,6 +268,13 @@ implementation
ops:=3;
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);
begin
@ -356,7 +364,10 @@ implementation
end.
{
$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
Revision 1.1 1999/08/03 00:24:01 michael

View File

@ -105,6 +105,7 @@ Const
accumulator = R_0;
global_pointer = R_29;
scratch_register = R_1;
return_pointer = R_26;
cpuflags = [cf_64bitaddr];
@ -237,7 +238,10 @@ end;
end.
{
$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 ...
Revision 1.8 1999/08/05 17:10:58 florian

View File

@ -1,6 +1,7 @@
{
$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
@ -88,7 +89,6 @@ unit cgobj;
procedure a_call_name(list : paasmoutput;const s : string;
offset : longint);virtual;
procedure a_push_reg(list : paasmoutput;r : tregister);virtual;
{ move instructions }
procedure a_load_const_reg(list : paasmoutput;size : tcgsize;a : aword;register : tregister);virtual;
@ -101,7 +101,7 @@ unit cgobj;
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_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);
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;
{ that procedure pops a exception value }
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 }
@ -188,6 +188,12 @@ unit cgobj;
list^.concat(new(pairegalloc,dealloc(r)));
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
******************************************************************************}
@ -211,16 +217,22 @@ unit cgobj;
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);
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;
procedure tcg.a_param_ref_addr(list : paasmoutput;r : treference;nr : longint);
@ -462,10 +474,10 @@ unit cgobj;
tg.availabletempregsmm)) then
begin
if not(r in tg.usedinproc) then
a_push_reg(list,r)
{!!!!!!!!!!!! a_push_reg(list,r) }
end
else
a_push_reg(list,r);
{!!!!!!!! a_push_reg(list,r) };
end;
end;
{ omit stack frame ? }
@ -736,19 +748,7 @@ unit cgobj;
if po_interrupt in aktprocsym^.definition^.procoptions then
g_interrupt_stackframe_exit(list)
else
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
exprasmlist^.concat(new(pai386,op_none(A_RET,S_NO)))
else
exprasmlist^.concat(new(pai386,op_const(A_RET,S_NO,parasize)));
end;
g_return_from_proc(list,parasize);
list^.concat(new(pai_symbol_end,initname(aktprocsym^.definition^.mangledname)));
{$ifdef GDB}
@ -798,12 +798,6 @@ unit cgobj;
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;
offset : longint);
@ -811,12 +805,6 @@ unit cgobj;
abstract;
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);
begin
@ -835,7 +823,13 @@ unit cgobj;
abstract;
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
abstract;
@ -853,13 +847,75 @@ unit cgobj;
abstract;
end;
procedure g_pop_exception_value_reg(list : paasmoutput;reg : tregister);
procedure tcg.g_pop_exception_value_reg(list : paasmoutput;reg : tregister);
begin
abstract;
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
abstract;
@ -868,7 +924,10 @@ unit cgobj;
end.
{
$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 ...
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_restore_frame_pointer(list : paasmoutput);virtual;
procedure tcg386.g_ret_from_proc(list : paasmoutput;para size : aword);
constructor init;
end;
@ -122,10 +123,29 @@ unit cgcpu;
begin
list^.concat(new(pai386,op_none(A_LEAVE,S_NO)));
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.
{
$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 ...
Revision 1.2 1999/08/01 23:19:59 florian