瀏覽代碼

* Just to update repsitory

mazen 23 年之前
父節點
當前提交
b44010f639
共有 5 個文件被更改,包括 126 次插入128 次删除
  1. 46 35
      compiler/sparc/cgcpu.pas
  2. 19 26
      compiler/sparc/cpubase.pas
  3. 14 15
      compiler/sparc/cpupara.pas
  4. 41 50
      compiler/sparc/ncpucall.pas
  5. 6 2
      compiler/sparc/ncpucnv.pas

+ 46 - 35
compiler/sparc/cgcpu.pas

@@ -40,10 +40,9 @@ TYPE
 {This method is used to pass a parameter, which is located in a register, to a
 routine. It should give the parameter to the routine, as required by the
 specific processor ABI. It is overriden for each CPU target.
-  Size : is the size of the operand in the register
-  r    : is the register source of the operand
-  nr   : is number of that parameter in the routine parameters list starting
-         from one from left to right}
+  Size    : is the size of the operand in the register
+  r       : is the register source of the operand
+  LocPara : is the location where the parameter will be stored}
     procedure a_param_reg(list:TAasmOutput;size:tcgsize;r:tregister;const LocPara:TParaLocation);override;
     procedure a_param_const(list:TAasmOutput;size:tcgsize;a:aword;CONST LocPara:TParaLocation);override;
     procedure a_param_ref(list:TAasmOutput;size:tcgsize;CONST r:TReference;CONST LocPara:TParaLocation);override;
@@ -117,8 +116,16 @@ 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_LD,S_L,r));
-  END;
+		with list,LocPara do
+		  case Loc of
+			  LOC_REGISTER:
+    			if r<>Register
+					then
+						Concat(taicpu.op_Reg_Reg_Reg(A_OR,S_L,r,R_G0,Register));
+				else
+				  InternalError(2002101002);
+			end;
+  end;
 procedure tcgSPARC.a_param_const(list:TAasmOutput;size:tcgsize;a:aword;CONST LocPara:TParaLocation);
   BEGIN
     IF(Size<>OS_32)AND(Size<>OS_S32)
@@ -131,36 +138,37 @@ procedure tcgSPARC.a_param_ref(list:TAasmOutput;size:tcgsize;const r:TReference;
     ref: treference;
     tmpreg:TRegister;
   begin
-    case locpara.loc of
-      LOC_REGISTER,LOC_CREGISTER:
-        a_load_ref_reg(list,size,r,locpara.register);
-      LOC_REFERENCE:
-        begin
+	  with LocPara do
+	    case locpara.loc of
+  	    LOC_REGISTER,LOC_CREGISTER:
+    	    a_load_ref_reg(list,size,r,Register);
+      	LOC_REFERENCE:
+        	begin
           {Code conventions need the parameters being allocated in %o6+92. See
           comment on g_stack_frame}
-          if locpara.sp_fixup<92
-          then
-            InternalError(2002081104);
-          reference_reset(ref);
-          ref.base:=locpara.reference.index;
-          ref.offset:=locpara.reference.offset;
-          tmpreg := get_scratch_reg_int(list);
-          a_load_ref_reg(list,size,r,tmpreg);
-          a_load_reg_ref(list,size,tmpreg,ref);
-          free_scratch_reg(list,tmpreg);
-        end;
-      LOC_FPUREGISTER,LOC_CFPUREGISTER:
-        case size of
-          OS_32:
-            a_loadfpu_ref_reg(list,OS_F32,r,locpara.register);
-          OS_64:
-            a_loadfpu_ref_reg(list,OS_F64,r,locpara.register);
-        else
-          internalerror(2002072801);
-        end;
-    else
-      internalerror(2002081103);
-    end;
+          	if locpara.sp_fixup<92
+          	then
+            	InternalError(2002081104);
+          	reference_reset(ref);
+          	ref.base:=locpara.reference.index;
+          	ref.offset:=locpara.reference.offset;
+          	tmpreg := get_scratch_reg_int(list);
+          	a_load_ref_reg(list,size,r,tmpreg);
+          	a_load_reg_ref(list,size,tmpreg,ref);
+          	free_scratch_reg(list,tmpreg);
+        	end;
+      	LOC_FPUREGISTER,LOC_CFPUREGISTER:
+        	case size of
+          	OS_32:
+            	a_loadfpu_ref_reg(list,OS_F32,r,locpara.register);
+	          OS_64:
+  	          a_loadfpu_ref_reg(list,OS_F64,r,locpara.register);
+    	    else
+      	    internalerror(2002072801);
+        	end;
+	    	else
+  	    	internalerror(2002081103);
+    	end;
   end;
 procedure tcgSPARC.a_paramaddr_ref(list:TAasmOutput;CONST r:TReference;CONST LocPara:TParaLocation);
   VAR
@@ -1256,7 +1264,10 @@ BEGIN
 END.
 {
   $Log$
-  Revision 1.13  2002-10-10 15:10:39  mazen
+  Revision 1.14  2002-10-10 19:57:51  mazen
+  * Just to update repsitory
+
+  Revision 1.13  2002/10/10 15:10:39  mazen
   * Internal error fixed, but usually i386 parameter model used
 
   Revision 1.12  2002/10/08 17:17:03  mazen

+ 19 - 26
compiler/sparc/cpubase.pas

@@ -1,12 +1,5 @@
-{*****************************************************************************}
-{ File                   : cpubase.pas                                        }
-{ Author                 : Mazen NEIFER                                       }
-{ Project                : Free Pascal Compiler (FPC)                         }
-{ Creation date          : 2002\04\26                                         }
-{ Licence                : GPL                                                }
-{ Bug report             : [email protected]                        }
-{*****************************************************************************}
-{    $Id$
+{******************************************************************************
+    $Id$
     Copyright (c) 1998-2000 by Florian Klaempfl and Peter Vreman
 
     Contains the base types for the Scalable Processor ARChitecture (SPARC)
@@ -401,7 +394,6 @@ used, because contains a lot of unnessary fields.}
 
 CONST
   general_registers = [R_L0..R_L7];
-
   { legEND:                                                                }
   { xxxregs = set of all possibly used registers of that type in the code  }
   {           generator                                                    }
@@ -410,19 +402,16 @@ CONST
   {           excludes registers which can be only used for parameter      }
   {           passing on ABI's that define this)                           }
   { c_countusableregsxxx = amount of registers in the usableregsxxx set    }
-
-  intregs = [R_G0..R_I7];
-  usableregsint = general_registers;
+  IntRegs=[R_L0..R_O7];
+  usableregsint=general_registers;
   c_countusableregsint = 4;
-
-  fpuregs = [R_F0..R_F31];
-  usableregsfpu = [];
-  c_countusableregsfpu = 0;
-
-  mmregs = [R_G0..R_G7];
-  usableregsmm = [R_G0..R_G7];
-  c_countusableregsmm  = 8;
-
+  fpuregs=[R_F0..R_F31];
+  usableregsfpu=[];
+  c_countusableregsfpu=0;
+  mmregs=[];
+  usableregsmm=[];
+  c_countusableregsmm=8;
+  
   firstsaveintreg = R_G0;
   lastsaveintreg = R_I7;
   firstsavefpureg = R_F0;
@@ -468,9 +457,10 @@ function othewise it contains a pointer to the returned result}
 {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
 the "global registers" family where GO is different from the others : G0 gives
-always 0 when it is red and thows away any value written to it}
-  accumulator     = R_L0;
-  accumulatorhigh = R_L7;
+always 0 when it is red and thows away any value written to it.Nevertheless,
+scalar routine results are returned onto R_O0.}
+  accumulator     = R_O0;
+  accumulatorhigh = R_O1;
   fpu_result_reg  =R_F0;
   mmresultreg     =R_G0;
 {*****************************************************************************}
@@ -581,7 +571,10 @@ FUNCTION flags_to_cond(CONST f:TResFlags):TAsmCond;
 END.
 {
   $Log$
-  Revision 1.10  2002-10-02 22:20:28  mazen
+  Revision 1.11  2002-10-10 19:57:51  mazen
+  * Just to update repsitory
+
+  Revision 1.10  2002/10/02 22:20:28  mazen
   + out registers allocator for the first 6 scalar parameters which must be passed into %o0..%o5
 
   Revision 1.9  2002/10/01 21:06:29  mazen

+ 14 - 15
compiler/sparc/cpupara.pas

@@ -42,22 +42,20 @@ function TSparcParaManager.GetIntParaLoc(nr:longint):TParaLocation;
     if nr<1
     then
       InternalError(2002100806);
-    FillChar(Result,SizeOf(TParaLocation),0);
+    FillChar(GetIntParaLoc,SizeOf(TParaLocation),0);
     Dec(nr);
-    with Result do
+    with GetIntParaLoc do
       if nr<6
       then{The six first parameters are passed into registers}
         begin
           loc:=LOC_REGISTER;
-          register:=TRegister(LongInt(R_O0)+nr);
-          WriteLn('-------------------------------------------');
+          register:=TRegister(LongInt(R_i0)+nr);
         end
       else{The other parameters are passed into the frame}
         begin
           loc:=LOC_REFERENCE;
           reference.index:=frame_pointer_reg;
-          reference.offset:=-92-(nr-6)*4;
-          WriteLn('+++++++++++++++++++++++++++++++++++++++++++');
+          reference.offset:=-68-nr*4;
         end;
   end;
 function GetParaLoc(p:TDef):TLoc;
@@ -124,7 +122,7 @@ procedure TSparcParaManager.create_param_loc_info(p:tabstractprocdef);
     loc : tloc;
     is_64bit: boolean;
   begin
-    nextintreg:=R_O0;
+    nextintreg:=R_i0;
     nextfloatreg:=R_F0;
     stack_offset:=92;
 WriteLn('***********************************************');
@@ -140,7 +138,7 @@ WriteLn('***********************************************');
               then
                 hp.paraloc.size:=OS_ADDR;
               is_64bit:=hp.paraloc.size in [OS_64,OS_S64];
-              if NextIntReg<=TRegister(ord(R_O5)-ord(is_64bit))
+              if NextIntReg<=TRegister(ord(R_i5)-ord(is_64bit))
               then
                 begin
                   WriteLn('Allocating ',std_reg2str[NextIntReg]);
@@ -156,7 +154,7 @@ WriteLn('***********************************************');
                 end
               else
                 begin
-                  nextintreg:=R_O6;
+                  nextintreg:=R_i6;
                   hp.paraloc.loc:=LOC_REFERENCE;
                   hp.paraloc.reference.index:=stack_pointer_reg;
                   hp.paraloc.reference.offset:=stack_offset;
@@ -239,11 +237,11 @@ function tSparcParaManager.GetFuncRetParaLoc(p:TAbstractProcDef):TParaLocation;
         begin
           WriteLn('Allocating i0 as return register');
           GetFuncRetParaLoc.loc:=LOC_REGISTER;
-          GetFuncRetParaLoc.register:=R_i0;
+          GetFuncRetParaLoc.register:=R_I0;
           GetFuncRetParaLoc.size:=def_cgsize(p.rettype.def);
           if GetFuncRetParaLoc.size in [OS_S64,OS_64]
           then
-            GetFuncRetParaLoc.RegisterHigh:=R_O1;
+            GetFuncRetParaLoc.RegisterHigh:=R_I1;
         end;
       floatdef:
         begin
@@ -251,8 +249,6 @@ function tSparcParaManager.GetFuncRetParaLoc(p:TAbstractProcDef):TParaLocation;
           GetFuncRetParaLoc.register:=R_F1;
           GetFuncRetParaLoc.size:=def_cgsize(p.rettype.def);
         end;
-            { smallsets are OS_INT in R3, others are OS_ADDR in R3 -> the same }
-            { ugly, I know :) (JM)                                             }
       setdef,
       variantdef,
       pointerdef,
@@ -267,7 +263,7 @@ function tSparcParaManager.GetFuncRetParaLoc(p:TAbstractProcDef):TParaLocation;
       errordef:
         begin
           GetFuncRetParaLoc.loc:=LOC_REGISTER;
-          GetFuncRetParaLoc.register:=R_O0;
+          GetFuncRetParaLoc.register:=R_I0;
           GetFuncRetParaLoc.size:=OS_ADDR;
         end;
       else
@@ -279,7 +275,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.6  2002-10-10 15:10:39  mazen
+  Revision 1.7  2002-10-10 19:57:51  mazen
+  * Just to update repsitory
+
+  Revision 1.6  2002/10/10 15:10:39  mazen
   * Internal error fixed, but usually i386 parameter model used
 
   Revision 1.5  2002/10/09 13:52:19  mazen

+ 41 - 50
compiler/sparc/ncpucall.pas

@@ -1,20 +1,11 @@
-{*****************************************************************************}
-{ File                   : ncpucall.pas                                       }
-{ Author                 : Mazen NEIFER                                       }
-{ Project                : Free Pascal Compiler (FPC)                         }
-{ Creation date          : 2002\26\26                                         }
-{ Last modification date : 2002\07\01                                         }
-{ Licence                : GPL                                                }
-{ Bug report             : [email protected]                        }
-{*****************************************************************************}
-{
+{******************************************************************************
     $Id$
     Copyright (c) 1998-2002 by Florian Klaempfl
 
     Generate SPARC assembler for in call nodes
 
     This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published bymethodpointer
+    it under the terms of the GNU General Public License as published by
     the Free Software Foundation; either version 2 of the License, or
     (at your option) any later version.
 
@@ -34,60 +25,60 @@ interface
 uses
   symdef,node,ncal,ncgcal;
 type
-  TSparccallnode = class(tcgcallnode)
-    function pass_1 : tnode;override;
+  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!}
+which is part of the stardrad calling mechanism. This function will do nothing.
+the frame pointer register is the stack pointer register of the caller, and is
+set when generating function prologue in cgcpu.tcgSPARC.g_stackframe_entry}
     procedure load_framepointer;override;
   end;
-
 implementation
-
-    uses
-      globtype,systems,
-      cutils,verbose,globals,
-      symconst,symbase,symsym,symtable,defbase,paramgr,
+uses
+  globtype,systems,
+  cutils,verbose,globals,
+  symconst,symbase,symsym,symtable,defbase,paramgr,
 {$ifdef GDB}
   {$ifdef delphi}
-      sysutils,
+  sysutils,
   {$else}
-      strings,
+  strings,
   {$endif}
-      gdb,
+  gdb,
 {$endif GDB}
-      cginfo,cgbase,pass_2,
-      cpuinfo,cpubase,aasmbase,aasmtai,aasmcpu,
-      nmem,nld,ncnv,
-      ncgutil,cgobj,tgobj,regvars,rgobj,rgcpu,cg64f32,cgcpu,cpupi;
-
-  function TSparccallnode.pass_1 : tnode;
-
-    begin
-       result:=inherited pass_1;
-       if assigned(result) then
-         exit;
-       if procdefinition is tprocdef then
-         begin
-            if tprocdef(procdefinition).parast.datasize>TSparcprocinfo(procinfo).maxpushedparasize then
-              TSparcprocinfo(procinfo).maxpushedparasize:=tprocdef(procdefinition).parast.datasize
-         end
-       else
-         begin
-            {!!!!}
-         end;
-    end;
+  cginfo,cgbase,pass_2,
+  cpuinfo,cpubase,aasmbase,aasmtai,aasmcpu,
+  nmem,nld,ncnv,
+  ncgutil,cgobj,tgobj,regvars,rgobj,rgcpu,cg64f32,cgcpu,cpupi;
+function TSparcCallNode.pass_1:TNode;
+  begin
+    result:=inherited pass_1;
+    if assigned(result)
+    then
+      exit;
+    if ProcDefinition is TProcDef
+    then
+      begin
+        if TProcDef(procdefinition).parast.datasize>TSparcProcInfo(procinfo).maxpushedparasize
+        then
+          TSparcProcInfo(procinfo).maxpushedparasize:=TProcdef(procdefinition).parast.datasize
+     end
+   else
+     InternalError(2002101001);
+  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));
+  begin
+    InternalError(2002101000);
   end;
 begin
-   ccallnode:=TSparccallnode;
+   ccallnode:=TSparcCallNode;
 end.
 {
   $Log$
-  Revision 1.3  2002-09-30 19:12:14  mazen
+  Revision 1.4  2002-10-10 19:57:52  mazen
+  * Just to update repsitory
+
+  Revision 1.3  2002/09/30 19:12:14  mazen
   * function prologue fixed
 
   Revision 1.2  2002/08/30 13:16:23  mazen

+ 6 - 2
compiler/sparc/ncpucnv.pas

@@ -375,7 +375,8 @@ implementation
            @second_class_to_intf,
            @second_char_to_char,
            @second_nothing,  { normal_2_smallset }
-           @second_nothing   { dynarray_2_openarray }
+           @second_nothing,   { dynarray_2_openarray }
+					 @second_nothing
          );
       type
          tprocedureofobject = procedure of object;
@@ -421,7 +422,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.3  2002-09-07 15:25:14  peter
+  Revision 1.4  2002-10-10 19:57:52  mazen
+  * Just to update repsitory
+
+  Revision 1.3  2002/09/07 15:25:14  peter
     * old logs removed and tabs fixed
 
   Revision 1.2  2002/08/30 06:15:27  mazen