Browse Source

* made the alpha version compilable

florian 26 years ago
parent
commit
eca7460542

+ 32 - 55
compiler/new/alpha/cgcpu.pas

@@ -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;
-
-begin
-end;
-
-
-procedure tcgalpha.a_push_reg(list : paasmoutput;r : tregister);virtual;
-
-begin
-end;
-
-
-procedure tcgalpha.a_load_const_reg(list : paasmoutput;size : tcgsize;a : aword;register : tregister);virtual;
+procedure tcgalpha.a_load_const_reg(list : paasmoutput;size : tcgsize;a : aword;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_ref(list : paasmoutput;size : tcgsize;register : tregister;const ref : treference);
 
 begin
 end;
 
 
-procedure tcgalpha.a_load_ref_reg(list : paasmoutput;size : tcgsize;const ref : treference;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_reg(list : paasmoutput;size : tcgsize;reg1,reg2 : tregister);virtual;
+procedure tcgalpha.a_load_reg_reg(list : paasmoutput;size : tcgsize;reg1,reg2 : tregister);
 
 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);
-
-begin
-end;
-
-
-
+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);virtual;
+procedure tcgalpha.a_loadaddress_ref_reg(list : paasmoutput;const ref : treference;r : tregister);
 
 begin
 end;
 
 
-procedure tcgalpha.g_stackframe_entry(list : paasmoutput;localsize : longint);virtual;
+procedure tcgalpha.g_maybe_loadself(list : paasmoutput);
 
 begin
 end;
 
 
-procedure tcgalpha.g_maybe_loadself(list : paasmoutput);virtual;
+procedure tcgalpha.g_restore_frame_pointer(list : paasmoutput);
 
 begin
 end;
 
 
-procedure tcgalpha.g_restore_frame_pointer(list : paasmoutput);virtual;
+procedure tcgalpha.g_push_exception_value_reg(list : paasmoutput;reg : tregister);
 
 begin
 end;
 
 
-procedure tcgalpha.g_push_exception_value_reg(list : paasmoutput;reg : tregister);virtual;
+procedure tcgalpha.g_push_exception_value_const(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;
+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

+ 16 - 5
compiler/new/alpha/cpuasm.pas

@@ -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

+ 5 - 1
compiler/new/alpha/cpubase.pas

@@ -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

+ 95 - 36
compiler/new/cgobj.pas

@@ -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);
+    procedure tcg.a_param_const(list : paasmoutput;size : tcgsize;a : aword;nr : longint);
 
       begin
-         a_push_reg(list,r);
+         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_const(list : paasmoutput;size : tcgsize;a : aword;nr : longint);
+    procedure tcg.a_param_ref(list : paasmoutput;size : tcgsize;const r : treference;nr : longint);
 
       begin
-         {!!!!!!!! a_push_const8(list,b); }
+         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,68 +798,124 @@ unit cgobj;
                        some abstract definitions
  ****************************************************************************}
 
-    procedure tcg.a_push_reg(list : paasmoutput;r : tregister);
+    procedure tcg.a_call_name(list : paasmoutput;const s : string;
+      offset : longint);
 
       begin
          abstract;
       end;
 
-    procedure tcg.a_call_name(list : paasmoutput;const s : string;
-      offset : longint);
+    procedure tcg.g_stackframe_entry(list : paasmoutput;localsize : longint);
 
       begin
          abstract;
       end;
 
-    procedure tcg.a_load_const_ref(list : paasmoutput;a : aword;const ref : treference);
+    procedure tcg.g_maybe_loadself(list : paasmoutput);
 
       begin
          abstract;
       end;
 
-    procedure tcg.g_stackframe_entry(list : paasmoutput;localsize : longint);
+    procedure tcg.g_restore_frame_pointer(list : paasmoutput);
 
       begin
          abstract;
       end;
 
-    procedure tcg.g_maybe_loadself(list : paasmoutput);
+    procedure g_return_from_proc(list : paasmoutput;parasize : aword);
 
       begin
          abstract;
       end;
 
-    procedure tcg.g_restore_frame_pointer(list : paasmoutput);
+    procedure tcg.a_loadaddress_ref_reg(list : paasmoutput;const ref : treference;r : tregister);
 
       begin
          abstract;
       end;
 
-    procedure tcg.a_loadaddress_ref_reg(list : paasmoutput;ref : treference;r : tregister);
+    procedure tcg.g_push_exception_value_reg(list : paasmoutput;reg : tregister);
 
       begin
          abstract;
       end;
 
-    procedure tcg.g_push_exception_value_reg(list : paasmoutput;reg : tregister);
+    procedure tcg.g_push_exception_value_const(list : paasmoutput;reg : tregister);
 
       begin
          abstract;
       end;
 
-    procedure tcg.g_push_exception_value_const(list : paasmoutput;reg : tregister);
+    procedure tcg.g_pop_exception_value_reg(list : paasmoutput;reg : tregister);
+
+      begin
+         abstract;
+      end;
+
+    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 g_pop_exception_value_reg(list : paasmoutput;reg : tregister);
+    procedure tcg.a_cmp_ref_const_label(list : paasmoutput;size : tcgsize;cmp_op : topcmp;a : aword;reg : tregister;
+     l : pasmlabel);
 
       begin
          abstract;
       end;
 
-    procedure a_param_ref(list : paasmoutput;const r : treference;nr : longint);virtual;
+    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

+ 21 - 1
compiler/new/i386/cgcpu.pas

@@ -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