瀏覽代碼

* maxoperands -> max_operands (for portability in rautils.pas)
* fix some range-check errors with loadconst
+ add ncgadd unit to m68k
* some bugfix of a_param_reg with LOC_CREFERENCE

carl 22 年之前
父節點
當前提交
3214bab118

+ 8 - 2
compiler/cgobj.pas

@@ -582,7 +582,7 @@ unit cgobj;
          case locpara.loc of
          case locpara.loc of
             LOC_REGISTER,LOC_CREGISTER:
             LOC_REGISTER,LOC_CREGISTER:
               a_load_reg_reg(list,size,locpara.size,r,locpara.register);
               a_load_reg_reg(list,size,locpara.size,r,locpara.register);
-            LOC_REFERENCE:
+            LOC_REFERENCE,LOC_CREFERENCE:
               begin
               begin
                  if locpara.sp_fixup<>0 then
                  if locpara.sp_fixup<>0 then
                    a_op_const_reg(list,OP_ADD,locpara.sp_fixup,stack_pointer_reg);
                    a_op_const_reg(list,OP_ADD,locpara.sp_fixup,stack_pointer_reg);
@@ -1625,7 +1625,13 @@ finalization
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.66  2002-11-25 17:43:16  peter
+  Revision 1.67  2002-12-14 15:02:03  carl
+    * maxoperands -> max_operands (for portability in rautils.pas)
+    * fix some range-check errors with loadconst
+    + add ncgadd unit to m68k
+    * some bugfix of a_param_reg with LOC_CREFERENCE
+
+  Revision 1.66  2002/11/25 17:43:16  peter
     * splitted defbase in defutil,symutil,defcmp
     * splitted defbase in defutil,symutil,defcmp
     * merged isconvertable and is_equal into compare_defs(_ext)
     * merged isconvertable and is_equal into compare_defs(_ext)
     * made operator search faster by walking the list only once
     * made operator search faster by walking the list only once

+ 8 - 2
compiler/i386/ra386att.pas

@@ -1682,7 +1682,7 @@ Begin
     case actasmtoken of
     case actasmtoken of
       AS_COMMA: { Operand delimiter }
       AS_COMMA: { Operand delimiter }
         Begin
         Begin
-          if operandnum > MaxOperands then
+          if operandnum > Max_Operands then
            Message(asmr_e_too_many_operands)
            Message(asmr_e_too_many_operands)
           else
           else
            Inc(operandnum);
            Inc(operandnum);
@@ -2122,7 +2122,13 @@ finalization
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.34  2002-12-01 22:08:34  carl
+  Revision 1.35  2002-12-14 15:02:03  carl
+    * maxoperands -> max_operands (for portability in rautils.pas)
+    * fix some range-check errors with loadconst
+    + add ncgadd unit to m68k
+    * some bugfix of a_param_reg with LOC_CREFERENCE
+
+  Revision 1.34  2002/12/01 22:08:34  carl
     * some small cleanup (remove some specific operators which are not supported)
     * some small cleanup (remove some specific operators which are not supported)
 
 
   Revision 1.33  2002/11/30 23:16:39  carl
   Revision 1.33  2002/11/30 23:16:39  carl

+ 8 - 2
compiler/i386/ra386int.pas

@@ -1684,7 +1684,7 @@ Begin
       { Operand delimiter }
       { Operand delimiter }
       AS_COMMA :
       AS_COMMA :
         Begin
         Begin
-          if operandnum > MaxOperands then
+          if operandnum > Max_Operands then
             Message(asmr_e_too_many_operands)
             Message(asmr_e_too_many_operands)
           else
           else
             Inc(operandnum);
             Inc(operandnum);
@@ -1956,7 +1956,13 @@ finalization
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.37  2002-12-01 22:08:34  carl
+  Revision 1.38  2002-12-14 15:02:03  carl
+    * maxoperands -> max_operands (for portability in rautils.pas)
+    * fix some range-check errors with loadconst
+    + add ncgadd unit to m68k
+    * some bugfix of a_param_reg with LOC_CREFERENCE
+
+  Revision 1.37  2002/12/01 22:08:34  carl
     * some small cleanup (remove some specific operators which are not supported)
     * some small cleanup (remove some specific operators which are not supported)
 
 
   Revision 1.36  2002/11/15 01:58:59  peter
   Revision 1.36  2002/11/15 01:58:59  peter

+ 17 - 11
compiler/m68k/aasmcpu.pas

@@ -29,7 +29,7 @@ interface
 uses
 uses
   cclasses,aasmtai,
   cclasses,aasmtai,
   aasmbase,globals,verbose,
   aasmbase,globals,verbose,
-  cpubase;
+  cpubase,cpuinfo;
 
 
 
 
 type
 type
@@ -142,7 +142,7 @@ implementation
          inherited create(op);;
          inherited create(op);;
          init(_size);
          init(_size);
          ops:=1;
          ops:=1;
-         loadconst(0,_op1);
+         loadconst(0,aword(_op1));
       end;
       end;
 
 
 
 
@@ -171,7 +171,7 @@ implementation
          init(_size);
          init(_size);
          ops:=2;
          ops:=2;
          loadreg(0,_op1);
          loadreg(0,_op1);
-         loadconst(1,_op2);
+         loadconst(1,aword(_op2));
       end;
       end;
 
 
 
 
@@ -190,7 +190,7 @@ implementation
          inherited create(op);;
          inherited create(op);;
          init(_size);
          init(_size);
          ops:=2;
          ops:=2;
-         loadconst(0,_op1);
+         loadconst(0,aword(_op1));
          loadreg(1,_op2);
          loadreg(1,_op2);
       end;
       end;
 
 
@@ -200,8 +200,8 @@ implementation
          inherited create(op);;
          inherited create(op);;
          init(_size);
          init(_size);
          ops:=2;
          ops:=2;
-         loadconst(0,_op1);
-         loadconst(1,_op2);
+         loadconst(0,aword(_op1));
+         loadconst(1,aword(_op2));
       end;
       end;
 
 
 
 
@@ -210,7 +210,7 @@ implementation
          inherited create(op);;
          inherited create(op);;
          init(_size);
          init(_size);
          ops:=2;
          ops:=2;
-         loadconst(0,_op1);
+         loadconst(0,aword(_op1));
          loadref(1,_op2);
          loadref(1,_op2);
       end;
       end;
 
 
@@ -250,7 +250,7 @@ implementation
          inherited create(op);;
          inherited create(op);;
          init(_size);
          init(_size);
          ops:=3;
          ops:=3;
-         loadconst(0,_op1);
+         loadconst(0,aword(_op1));
          loadreg(1,_op2);
          loadreg(1,_op2);
          loadreg(2,_op3);
          loadreg(2,_op3);
       end;
       end;
@@ -271,7 +271,7 @@ implementation
          inherited create(op);;
          inherited create(op);;
          init(_size);
          init(_size);
          ops:=3;
          ops:=3;
-         loadconst(0,_op1);
+         loadconst(0,aword(_op1));
          loadref(1,_op2);
          loadref(1,_op2);
          loadreg(2,_op3);
          loadreg(2,_op3);
       end;
       end;
@@ -282,7 +282,7 @@ implementation
          inherited create(op);;
          inherited create(op);;
          init(_size);
          init(_size);
          ops:=3;
          ops:=3;
-         loadconst(0,_op1);
+         loadconst(0,aword(_op1));
          loadreg(1,_op2);
          loadreg(1,_op2);
          loadref(2,_op3);
          loadref(2,_op3);
       end;
       end;
@@ -409,7 +409,13 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.6  2002-11-30 23:33:02  carl
+  Revision 1.7  2002-12-14 15:02:03  carl
+    * maxoperands -> max_operands (for portability in rautils.pas)
+    * fix some range-check errors with loadconst
+    + add ncgadd unit to m68k
+    * some bugfix of a_param_reg with LOC_CREFERENCE
+
+  Revision 1.6  2002/11/30 23:33:02  carl
     * merges from Pierre's fixes in m68k fixes branch
     * merges from Pierre's fixes in m68k fixes branch
 
 
   Revision 1.5  2002/09/07 15:25:11  peter
   Revision 1.5  2002/09/07 15:25:11  peter

+ 8 - 2
compiler/m68k/cpuinfo.pas

@@ -19,7 +19,7 @@ Interface
 
 
 Type
 Type
    { Architecture word - Native unsigned type }
    { Architecture word - Native unsigned type }
-   AWord  = longword;
+   aword  = longword;
    PAWord = ^AWord;
    PAWord = ^AWord;
 
 
    { this must be an ordinal type with the same size as a pointer }
    { this must be an ordinal type with the same size as a pointer }
@@ -67,7 +67,13 @@ Implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.5  2002-09-07 20:53:28  carl
+  Revision 1.6  2002-12-14 15:02:03  carl
+    * maxoperands -> max_operands (for portability in rautils.pas)
+    * fix some range-check errors with loadconst
+    + add ncgadd unit to m68k
+    * some bugfix of a_param_reg with LOC_CREFERENCE
+
+  Revision 1.5  2002/09/07 20:53:28  carl
     * cardinal -> longword
     * cardinal -> longword
 
 
   Revision 1.4  2002/09/07 15:25:13  peter
   Revision 1.4  2002/09/07 15:25:13  peter

+ 8 - 2
compiler/m68k/cpunode.pas

@@ -30,7 +30,7 @@ unit cpunode;
 
 
     uses
     uses
        { generic nodes }
        { generic nodes }
-       ncgbas,ncgld,ncgflw,ncgcnv,ncgmem,ncgcon,ncgcal,ncgset,ncginl,ncgmat
+       ncgbas,ncgld,ncgflw,ncgcnv,ncgmem,ncgcon,ncgcal,ncgset,ncginl,ncgmat,ncgadd
        { to be able to only parts of the generic code,
        { to be able to only parts of the generic code,
          the processor specific nodes must be included
          the processor specific nodes must be included
          after the generic one (FK)
          after the generic one (FK)
@@ -52,7 +52,13 @@ unit cpunode;
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.2  2002-08-14 19:16:34  carl
+  Revision 1.3  2002-12-14 15:02:03  carl
+    * maxoperands -> max_operands (for portability in rautils.pas)
+    * fix some range-check errors with loadconst
+    + add ncgadd unit to m68k
+    * some bugfix of a_param_reg with LOC_CREFERENCE
+
+  Revision 1.2  2002/08/14 19:16:34  carl
     + m68k type conversion nodes
     + m68k type conversion nodes
     + started some mathematical nodes
     + started some mathematical nodes
     * out of bound references should now be handled correctly
     * out of bound references should now be handled correctly

+ 8 - 1
compiler/m68k/cpupara.pas

@@ -51,6 +51,7 @@ unit cpupara;
 
 
     function tm68kparamanager.getintparaloc(nr : longint) : tparalocation;
     function tm68kparamanager.getintparaloc(nr : longint) : tparalocation;
       begin
       begin
+         fillchar(result,sizeof(tparalocation),0);
       end;
       end;
 
 
     procedure tm68kparamanager.create_param_loc_info(p : tabstractprocdef);
     procedure tm68kparamanager.create_param_loc_info(p : tabstractprocdef);
@@ -74,7 +75,13 @@ end.
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.1  2002-08-12 15:08:44  carl
+  Revision 1.2  2002-12-14 15:02:03  carl
+    * maxoperands -> max_operands (for portability in rautils.pas)
+    * fix some range-check errors with loadconst
+    + add ncgadd unit to m68k
+    * some bugfix of a_param_reg with LOC_CREFERENCE
+
+  Revision 1.1  2002/08/12 15:08:44  carl
     + stab register indexes for powerpc (moved from gdb to cpubase)
     + stab register indexes for powerpc (moved from gdb to cpubase)
     + tprocessor enumeration moved to cpuinfo
     + tprocessor enumeration moved to cpuinfo
     + linker in target_info is now a class
     + linker in target_info is now a class

+ 9 - 3
compiler/m68k/rasm.pas

@@ -1702,7 +1702,7 @@ type
     var
     var
       i : longint;
       i : longint;
     begin
     begin
-      for i:=1to max_operands do
+      for i:=1 to max_operands do
        Operands[i]:=TM68kOperand.Create;
        Operands[i]:=TM68kOperand.Create;
     end;
     end;
 
 
@@ -1752,7 +1752,7 @@ type
        case actasmtoken of
        case actasmtoken of
          { //  Operand delimiter // }
          { //  Operand delimiter // }
          AS_COMMA: Begin
          AS_COMMA: Begin
-                  if operandnum > MaxOperands then
+                  if operandnum > Max_Operands then
                     Message(asmr_e_too_many_operands)
                     Message(asmr_e_too_many_operands)
                   else
                   else
                     Inc(operandnum);
                     Inc(operandnum);
@@ -2197,7 +2197,13 @@ Begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.9  2002-11-30 23:33:03  carl
+  Revision 1.10  2002-12-14 15:02:03  carl
+    * maxoperands -> max_operands (for portability in rautils.pas)
+    * fix some range-check errors with loadconst
+    + add ncgadd unit to m68k
+    * some bugfix of a_param_reg with LOC_CREFERENCE
+
+  Revision 1.9  2002/11/30 23:33:03  carl
     * merges from Pierre's fixes in m68k fixes branch
     * merges from Pierre's fixes in m68k fixes branch
 
 
   Revision 1.8  2002/09/07 15:25:13  peter
   Revision 1.8  2002/09/07 15:25:13  peter

+ 8 - 3
compiler/ncgadd.pas

@@ -68,8 +68,7 @@ interface
       aasmbase,aasmtai,aasmcpu,defutil,htypechk,
       aasmbase,aasmtai,aasmcpu,defutil,htypechk,
       cgbase,cpuinfo,pass_1,pass_2,regvars,
       cgbase,cpuinfo,pass_1,pass_2,regvars,
       cpupara,
       cpupara,
-      ncon,nset,
-      cga,ncgutil,tgobj,rgobj,rgcpu,cgobj,cg64f32;
+      ncon,nset,ncgutil,tgobj,rgobj,rgcpu,cgobj,cg64f32;
 
 
 
 
 
 
@@ -1053,7 +1052,13 @@ interface
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.2  2002-12-08 15:02:17  carl
+  Revision 1.3  2002-12-14 15:02:03  carl
+    * maxoperands -> max_operands (for portability in rautils.pas)
+    * fix some range-check errors with loadconst
+    + add ncgadd unit to m68k
+    * some bugfix of a_param_reg with LOC_CREFERENCE
+
+  Revision 1.2  2002/12/08 15:02:17  carl
     + more fixes
     + more fixes
 
 
   Revision 1.1  2002/12/07 19:51:35  carl
   Revision 1.1  2002/12/07 19:51:35  carl

+ 1 - 466
compiler/powerpc/aasmcpu.pas

@@ -31,13 +31,6 @@ uses
   aasmbase,globals,verbose,
   aasmbase,globals,verbose,
   cpubase,cpuinfo;
   cpubase,cpuinfo;
 
 
-    const
-      { "mov reg,reg" source operand number }
-      O_MOV_SOURCE = 1;
-      { "mov reg,reg" source operand number }
-      O_MOV_DEST = 0;
-
-
     type
     type
       taicpu = class(taicpu_abstract)
       taicpu = class(taicpu_abstract)
          constructor op_none(op : tasmop);
          constructor op_none(op : tasmop);
@@ -63,7 +56,6 @@ uses
          constructor op_reg_bool_reg_reg(op : tasmop;_op1: tregister;_op2:boolean;_op3,_op4:tregister);
          constructor op_reg_bool_reg_reg(op : tasmop;_op1: tregister;_op2:boolean;_op3,_op4:tregister);
          constructor op_reg_bool_reg_const(op : tasmop;_op1: tregister;_op2:boolean;_op3:tregister;_op4: longint);
          constructor op_reg_bool_reg_const(op : tasmop;_op1: tregister;_op2:boolean;_op3:tregister;_op4: longint);
 
 
-         constructor op_reg_reg_reg_const_const(op : tasmop;_op1,_op2,_op3 : tregister;_op4,_op5 : Longint);
          constructor op_reg_reg_const_const_const(op : tasmop;_op1,_op2 : tregister;_op3,_op4,_op5 : Longint);
          constructor op_reg_reg_const_const_const(op : tasmop;_op1,_op2 : tregister;_op3,_op4,_op5 : Longint);
 
 
 
 
@@ -78,18 +70,6 @@ uses
          constructor op_sym_ofs_ref(op : tasmop;_op1 : tasmsymbol;_op1ofs:longint;const _op2 : treference);
          constructor op_sym_ofs_ref(op : tasmop;_op1 : tasmsymbol;_op1ofs:longint;const _op2 : treference);
 
 
          procedure loadbool(opidx:longint;_b:boolean);
          procedure loadbool(opidx:longint;_b:boolean);
-
-
-         function is_nop: boolean; override;
-         function is_move:boolean; override;
-         function spill_registers(list:Taasmoutput;
-                                  rgget:Trggetproc;
-                                  rgunget:Trgungetproc;
-                                  r:Tsupregset;
-                                  var unusedregsint:Tsupregset;
-                                  const spilltemplist:Tspill_temp_list):boolean; override;
-
-
       end;
       end;
 
 
       tai_align = class(tai_align_abstract)
       tai_align = class(tai_align_abstract)
@@ -102,8 +82,6 @@ uses
 
 
 implementation
 implementation
 
 
-uses cutils,rgobj;
-
 {*****************************************************************************
 {*****************************************************************************
                                  taicpu Constructors
                                  taicpu Constructors
 *****************************************************************************}
 *****************************************************************************}
@@ -131,8 +109,6 @@ uses cutils,rgobj;
     constructor taicpu.op_reg(op : tasmop;_op1 : tregister);
     constructor taicpu.op_reg(op : tasmop;_op1 : tregister);
       begin
       begin
          inherited create(op);
          inherited create(op);
-         if (_op1.enum = R_INTREGISTER) and (_op1.number = NR_NO) then
-           internalerror(2003031207);
          ops:=1;
          ops:=1;
          loadreg(0,_op1);
          loadreg(0,_op1);
       end;
       end;
@@ -149,10 +125,6 @@ uses cutils,rgobj;
     constructor taicpu.op_reg_reg(op : tasmop;_op1,_op2 : tregister);
     constructor taicpu.op_reg_reg(op : tasmop;_op1,_op2 : tregister);
       begin
       begin
          inherited create(op);
          inherited create(op);
-         if (_op1.enum = R_INTREGISTER) and (_op1.number = NR_NO) then
-           internalerror(2003031205);
-         if (_op2.enum = R_INTREGISTER) and (_op2.number = NR_NO) then
-           internalerror(2003031206);
          ops:=2;
          ops:=2;
          loadreg(0,_op1);
          loadreg(0,_op1);
          loadreg(1,_op2);
          loadreg(1,_op2);
@@ -161,8 +133,6 @@ uses cutils,rgobj;
     constructor taicpu.op_reg_const(op:tasmop; _op1: tregister; _op2: longint);
     constructor taicpu.op_reg_const(op:tasmop; _op1: tregister; _op2: longint);
       begin
       begin
          inherited create(op);
          inherited create(op);
-         if (_op1.enum = R_INTREGISTER) and (_op1.number = NR_NO) then
-           internalerror(2003031208);
          ops:=2;
          ops:=2;
          loadreg(0,_op1);
          loadreg(0,_op1);
          loadconst(1,aword(_op2));
          loadconst(1,aword(_op2));
@@ -171,8 +141,6 @@ uses cutils,rgobj;
      constructor taicpu.op_const_reg(op:tasmop; _op1: longint; _op2: tregister);
      constructor taicpu.op_const_reg(op:tasmop; _op1: longint; _op2: tregister);
       begin
       begin
          inherited create(op);
          inherited create(op);
-         if (_op2.enum = R_INTREGISTER) and (_op2.number = NR_NO) then
-           internalerror(2003031209);
          ops:=2;
          ops:=2;
          loadconst(0,aword(_op1));
          loadconst(0,aword(_op1));
          loadreg(1,_op2);
          loadreg(1,_op2);
@@ -182,8 +150,6 @@ uses cutils,rgobj;
     constructor taicpu.op_reg_ref(op : tasmop;_op1 : tregister;const _op2 : treference);
     constructor taicpu.op_reg_ref(op : tasmop;_op1 : tregister;const _op2 : treference);
       begin
       begin
          inherited create(op);
          inherited create(op);
-         if (_op1.enum = R_INTREGISTER) and (_op1.number = NR_NO) then
-           internalerror(2003031210);
          ops:=2;
          ops:=2;
          loadreg(0,_op1);
          loadreg(0,_op1);
          loadref(1,_op2);
          loadref(1,_op2);
@@ -202,12 +168,6 @@ uses cutils,rgobj;
     constructor taicpu.op_reg_reg_reg(op : tasmop;_op1,_op2,_op3 : tregister);
     constructor taicpu.op_reg_reg_reg(op : tasmop;_op1,_op2,_op3 : tregister);
       begin
       begin
          inherited create(op);
          inherited create(op);
-         if (_op1.enum = R_INTREGISTER) and (_op1.number = NR_NO) then
-           internalerror(2003031211);
-         if (_op2.enum = R_INTREGISTER) and (_op2.number = NR_NO) then
-           internalerror(2003031212);
-         if (_op3.enum = R_INTREGISTER) and (_op3.number = NR_NO) then
-           internalerror(2003031213);
          ops:=3;
          ops:=3;
          loadreg(0,_op1);
          loadreg(0,_op1);
          loadreg(1,_op2);
          loadreg(1,_op2);
@@ -217,10 +177,6 @@ uses cutils,rgobj;
      constructor taicpu.op_reg_reg_const(op : tasmop;_op1,_op2 : tregister; _op3: Longint);
      constructor taicpu.op_reg_reg_const(op : tasmop;_op1,_op2 : tregister; _op3: Longint);
        begin
        begin
          inherited create(op);
          inherited create(op);
-         if (_op1.enum = R_INTREGISTER) and (_op1.number = NR_NO) then
-           internalerror(2003031214);
-         if (_op2.enum = R_INTREGISTER) and (_op2.number = NR_NO) then
-           internalerror(2003031215);
          ops:=3;
          ops:=3;
          loadreg(0,_op1);
          loadreg(0,_op1);
          loadreg(1,_op2);
          loadreg(1,_op2);
@@ -230,10 +186,6 @@ uses cutils,rgobj;
      constructor taicpu.op_reg_reg_sym_ofs(op : tasmop;_op1,_op2 : tregister; _op3: tasmsymbol;_op3ofs: longint);
      constructor taicpu.op_reg_reg_sym_ofs(op : tasmop;_op1,_op2 : tregister; _op3: tasmsymbol;_op3ofs: longint);
        begin
        begin
          inherited create(op);
          inherited create(op);
-         if (_op1.enum = R_INTREGISTER) and (_op1.number = NR_NO) then
-           internalerror(2003031216);
-         if (_op2.enum = R_INTREGISTER) and (_op2.number = NR_NO) then
-           internalerror(2003031217);
          ops:=3;
          ops:=3;
          loadreg(0,_op1);
          loadreg(0,_op1);
          loadreg(1,_op2);
          loadreg(1,_op2);
@@ -243,10 +195,6 @@ uses cutils,rgobj;
      constructor taicpu.op_reg_reg_ref(op : tasmop;_op1,_op2 : tregister; const _op3: treference);
      constructor taicpu.op_reg_reg_ref(op : tasmop;_op1,_op2 : tregister; const _op3: treference);
        begin
        begin
          inherited create(op);
          inherited create(op);
-         if (_op1.enum = R_INTREGISTER) and (_op1.number = NR_NO) then
-           internalerror(2003031218);
-         if (_op2.enum = R_INTREGISTER) and (_op2.number = NR_NO) then
-           internalerror(2003031219);
          ops:=3;
          ops:=3;
          loadreg(0,_op1);
          loadreg(0,_op1);
          loadreg(1,_op2);
          loadreg(1,_op2);
@@ -256,10 +204,6 @@ uses cutils,rgobj;
     constructor taicpu.op_const_reg_reg(op : tasmop;_op1 : longint;_op2, _op3 : tregister);
     constructor taicpu.op_const_reg_reg(op : tasmop;_op1 : longint;_op2, _op3 : tregister);
       begin
       begin
          inherited create(op);
          inherited create(op);
-         if (_op2.enum = R_INTREGISTER) and (_op2.number = NR_NO) then
-           internalerror(2003031221);
-         if (_op3.enum = R_INTREGISTER) and (_op3.number = NR_NO) then
-           internalerror(2003031220);
          ops:=3;
          ops:=3;
          loadconst(0,aword(_op1));
          loadconst(0,aword(_op1));
          loadreg(1,_op2);
          loadreg(1,_op2);
@@ -269,8 +213,6 @@ uses cutils,rgobj;
      constructor taicpu.op_const_reg_const(op : tasmop;_op1 : longint;_op2 : tregister;_op3 : longint);
      constructor taicpu.op_const_reg_const(op : tasmop;_op1 : longint;_op2 : tregister;_op3 : longint);
       begin
       begin
          inherited create(op);
          inherited create(op);
-         if (_op2.enum = R_INTREGISTER) and (_op2.number = NR_NO) then
-           internalerror(2003031222);
          ops:=3;
          ops:=3;
          loadconst(0,aword(_op1));
          loadconst(0,aword(_op1));
          loadreg(1,_op2);
          loadreg(1,_op2);
@@ -281,14 +223,6 @@ uses cutils,rgobj;
      constructor taicpu.op_reg_reg_reg_reg(op : tasmop;_op1,_op2,_op3,_op4 : tregister);
      constructor taicpu.op_reg_reg_reg_reg(op : tasmop;_op1,_op2,_op3,_op4 : tregister);
       begin
       begin
          inherited create(op);
          inherited create(op);
-         if (_op1.enum = R_INTREGISTER) and (_op1.number = NR_NO) then
-           internalerror(2003031223);
-         if (_op2.enum = R_INTREGISTER) and (_op2.number = NR_NO) then
-           internalerror(2003031224);
-         if (_op3.enum = R_INTREGISTER) and (_op3.number = NR_NO) then
-           internalerror(2003031225);
-         if (_op4.enum = R_INTREGISTER) and (_op4.number = NR_NO) then
-           internalerror(2003031226);
          ops:=4;
          ops:=4;
          loadreg(0,_op1);
          loadreg(0,_op1);
          loadreg(1,_op2);
          loadreg(1,_op2);
@@ -299,12 +233,6 @@ uses cutils,rgobj;
      constructor taicpu.op_reg_bool_reg_reg(op : tasmop;_op1: tregister;_op2:boolean;_op3,_op4:tregister);
      constructor taicpu.op_reg_bool_reg_reg(op : tasmop;_op1: tregister;_op2:boolean;_op3,_op4:tregister);
       begin
       begin
          inherited create(op);
          inherited create(op);
-         if (_op1.enum = R_INTREGISTER) and (_op1.number = NR_NO) then
-           internalerror(2003031227);
-         if (_op3.enum = R_INTREGISTER) and (_op3.number = NR_NO) then
-           internalerror(2003031228);
-         if (_op4.enum = R_INTREGISTER) and (_op4.number = NR_NO) then
-           internalerror(2003031229);
          ops:=4;
          ops:=4;
          loadreg(0,_op1);
          loadreg(0,_op1);
          loadbool(1,_op2);
          loadbool(1,_op2);
@@ -315,10 +243,6 @@ uses cutils,rgobj;
      constructor taicpu.op_reg_bool_reg_const(op : tasmop;_op1: tregister;_op2:boolean;_op3:tregister;_op4: longint);
      constructor taicpu.op_reg_bool_reg_const(op : tasmop;_op1: tregister;_op2:boolean;_op3:tregister;_op4: longint);
       begin
       begin
          inherited create(op);
          inherited create(op);
-         if (_op1.enum = R_INTREGISTER) and (_op1.number = NR_NO) then
-           internalerror(2003031230);
-         if (_op3.enum = R_INTREGISTER) and (_op3.number = NR_NO) then
-           internalerror(2003031231);
          ops:=4;
          ops:=4;
          loadreg(0,_op1);
          loadreg(0,_op1);
          loadbool(0,_op2);
          loadbool(0,_op2);
@@ -326,31 +250,9 @@ uses cutils,rgobj;
          loadconst(0,cardinal(_op4));
          loadconst(0,cardinal(_op4));
       end;
       end;
 
 
-
-     constructor taicpu.op_reg_reg_reg_const_const(op : tasmop;_op1,_op2,_op3 : tregister;_op4,_op5 : Longint);
-      begin
-         inherited create(op);
-         if (_op1.enum = R_INTREGISTER) and (_op1.number = NR_NO) then
-           internalerror(2003031232);
-         if (_op2.enum = R_INTREGISTER) and (_op2.number = NR_NO) then
-           internalerror(2003031233);
-         if (_op3.enum = R_INTREGISTER) and (_op3.number = NR_NO) then
-           internalerror(2003031233);
-         ops:=5;
-         loadreg(0,_op1);
-         loadreg(1,_op2);
-         loadreg(2,_op3);
-         loadconst(3,cardinal(_op4));
-         loadconst(4,cardinal(_op5));
-      end;
-
      constructor taicpu.op_reg_reg_const_const_const(op : tasmop;_op1,_op2 : tregister;_op3,_op4,_op5 : Longint);
      constructor taicpu.op_reg_reg_const_const_const(op : tasmop;_op1,_op2 : tregister;_op3,_op4,_op5 : Longint);
       begin
       begin
          inherited create(op);
          inherited create(op);
-         if (_op1.enum = R_INTREGISTER) and (_op1.number = NR_NO) then
-           internalerror(2003031232);
-         if (_op2.enum = R_INTREGISTER) and (_op2.number = NR_NO) then
-           internalerror(2003031233);
          ops:=5;
          ops:=5;
          loadreg(0,_op1);
          loadreg(0,_op1);
          loadreg(1,_op2);
          loadreg(1,_op2);
@@ -411,349 +313,6 @@ uses cutils,rgobj;
       end;
       end;
 
 
 
 
-{ ****************************** newra stuff *************************** }
-
-    function taicpu.is_nop: boolean;
-      begin
-        { we don't insert any more nops than necessary }
-        is_nop :=
-          ((opcode=A_MR) and (oper[0].typ=top_reg) and (oper[1].typ=top_reg) and (oper[0].reg.number=oper[1].reg.number));
-      end;
-
-
-    function taicpu.is_move:boolean;
-      begin
-        is_move := opcode = A_MR;
-      end;
-
-
-    function taicpu.spill_registers(list:Taasmoutput; 
-                             rgget:Trggetproc; 
-                             rgunget:Trgungetproc; 
-                             r:Tsupregset; 
-                             var unusedregsint:Tsupregset; 
-                              const spilltemplist:Tspill_temp_list): boolean;
-
-      function get_insert_pos(p:Tai;huntfor1,huntfor2,huntfor3:Tsuperregister):Tai;
-
-      var back:Tsupregset;
-
-      begin
-        back:=unusedregsint;
-        get_insert_pos:=p;
-        while (p<>nil) and (p.typ=ait_regalloc) do
-          begin
-            {Rewind the register allocation.}
-            if Tai_regalloc(p).allocation then
-              include(unusedregsint,Tai_regalloc(p).reg.number shr 8)
-            else
-              begin
-                exclude(unusedregsint,Tai_regalloc(p).reg.number shr 8);
-                if Tai_regalloc(p).reg.number shr 8=huntfor1 then
-                  begin
-                    get_insert_pos:=Tai(p.previous);
-                    back:=unusedregsint;
-                  end;
-                if Tai_regalloc(p).reg.number shr 8=huntfor2 then
-                  begin
-                    get_insert_pos:=Tai(p.previous);
-                    back:=unusedregsint;
-                  end;
-                if Tai_regalloc(p).reg.number shr 8=huntfor3 then
-                  begin
-                    get_insert_pos:=Tai(p.previous);
-                    back:=unusedregsint;
-                  end;
-              end;
-            p:=Tai(p.previous);
-          end;
-        unusedregsint:=back;
-      end;
-
-      procedure forward_allocation(p:Tai);
-
-      begin
-        {Forward the register allocation again.}
-        while (p<>self) do
-          begin
-            if p.typ<>ait_regalloc then
-              internalerror(200305311);
-            if Tai_regalloc(p).allocation then
-              exclude(unusedregsint,Tai_regalloc(p).reg.number shr 8)
-            else
-              include(unusedregsint,Tai_regalloc(p).reg.number shr 8);
-            p:=Tai(p.next);
-          end;
-      end;
-
-
-      function decode_loadstore(op: tasmop; var counterpart: tasmop; wasload: boolean): boolean;
-     
-        begin
-          result := true;
-          wasload := true;
-          case op of
-            A_LBZ:
-              begin
-                counterpart := A_STB;
-              end;
-            A_LBZX:
-              begin
-                counterpart := A_STBX;
-              end;
-            A_LHZ,A_LHA:
-              begin
-                counterpart := A_STH;
-              end;
-            A_LHZX,A_LHAX:
-              begin
-                counterpart := A_STHX;
-              end;
-            A_LWZ:
-              begin
-                counterpart := A_STW;
-              end;
-            A_LWZX:
-              begin
-                counterpart := A_STWX;
-              end;
-            A_STB:
-              begin
-                counterpart := A_LBZ;
-                wasload := false;
-              end;
-            A_STBX:
-              begin
-                counterpart := A_LBZX;
-                wasload := false;
-              end;
-            A_STH:
-              begin
-                counterpart := A_LHZ;
-                wasload := false;
-              end;
-            A_STHX:
-              begin
-                counterpart := A_LHZX;
-                wasload := false;
-              end;
-            A_STW:
-              begin
-                counterpart := A_LWZ;
-                wasload := false;
-              end;
-            A_STWX:
-              begin
-                counterpart := A_LWZX;
-                wasload := false;
-              end;
-            A_LBZU,A_LBZUX,A_LHZU,A_LHZUX,A_LHAU,A_LHAUX,
-            A_LWZU,A_LWZUX,A_STBU,A_STBUX,A_STHU,A_STHUX,
-            A_STWU,A_STWUX:
-              internalerror(2003070602);
-            else
-              result := false;
-          end;
-       end;
-
-
-    var i:byte;
-        supreg, reg1, reg2, reg3: Tsuperregister;
-        helpreg:Tregister;
-        helpins:Taicpu;
-        op:Tasmop;
-        pos:Tai;
-        wasload: boolean;
-
-      begin
-        spill_registers:=false;
-        if (ops = 2) and
-           (oper[1].typ=top_ref) and
-           { oper[1] can also be ref in case of "lis r3,symbol@ha" or so }
-           decode_loadstore(opcode,op,wasload) then
-          begin
-            { the register that's being stored/loaded }
-            supreg:=oper[0].reg.number shr 8;
-            if supreg in r then
-              begin
-                // Example:
-                //   l?? r20d, 8(r1)   ; r20d must be spilled into -60(r1)
-                //
-                //   Change into:
-                //
-                //   l?? r21d, 8(r1)
-                //   st? r21d, -60(r1)
-                //
-                // And:
-                //
-                //   st? r20d, 8(r1)   ; r20d must be spilled into -60(r1)
-                //
-                //   Change into:
-                //
-                //   l?? r21d, -60(r1)
-                //   st? r21d, 8(r1)
-  
-                pos := get_insert_pos(Tai(previous),oper[0].reg.number shr 8,
-                                      oper[1].ref^.base.number shr 8,oper[1].ref^.index.number shr 8);
-                rgget(list,pos,0,helpreg);
-                spill_registers := true;
-                if wasload then
-                  begin
-                    helpins := taicpu.op_reg_ref(opcode,helpreg,oper[1].ref^);
-                    loadref(1,spilltemplist[supreg]);
-                    opcode := op;
-                  end
-                else
-                  helpins := taicpu.op_reg_ref(op,helpreg,spilltemplist[supreg]);
-                if pos=nil then
-                  list.insertafter(helpins,list.first)
-                else
-                  list.insertafter(helpins,pos.next);
-                loadreg(0,helpreg);
-                rgunget(list,helpins,helpreg);
-                forward_allocation(tai(helpins.next));
-{
-                writeln('spilling!');
-                list.insertafter(tai_comment.Create(strpnew('Spilling!')),helpins);
-}
-              end;
-
-            { now the registers used in the reference }
-            { a) base                                 }
-            supreg := oper[1].ref^.base.number shr 8;
-            if supreg in r then
-              begin
-                if wasload then
-                  pos:=get_insert_pos(Tai(previous),oper[1].ref^.index.number shr 8,oper[0].reg.number shr 8,0)
-                else
-                  pos:=get_insert_pos(Tai(previous),oper[1].ref^.index.number shr 8,0,0);
-                rgget(list,pos,0,helpreg);
-                spill_registers:=true;
-                helpins:=Taicpu.op_reg_ref(A_LWZ,helpreg,spilltemplist[supreg]);
-                if pos=nil then
-                  list.insertafter(helpins,list.first)
-                else
-                  list.insertafter(helpins,pos.next);
-                oper[1].ref^.base:=helpreg;
-                rgunget(list,helpins,helpreg);
-                forward_allocation(Tai(helpins.next));
-{
-                writeln('spilling!');
-                list.insertafter(tai_comment.Create(strpnew('Spilling!')),helpins);
-}
-              end;
-
-            { b) index }
-            supreg := oper[1].ref^.index.number shr 8;
-            if supreg in r then
-              begin
-                if wasload then
-                  pos:=get_insert_pos(Tai(previous),oper[1].ref^.base.number shr 8,oper[0].reg.number shr 8,0)
-                else
-                  pos:=get_insert_pos(Tai(previous),oper[1].ref^.base.number shr 8,0,0);
-                rgget(list,pos,0,helpreg);
-                spill_registers:=true;
-                helpins:=Taicpu.op_reg_ref(A_LWZ,helpreg,spilltemplist[supreg]);
-                if pos=nil then
-                  list.insertafter(helpins,list.first)
-                else
-                  list.insertafter(helpins,pos.next);
-                oper[1].ref^.index:=helpreg;
-                rgunget(list,helpins,helpreg);
-                forward_allocation(Tai(helpins.next));
-{
-                writeln('spilling!');
-                list.insertafter(tai_comment.Create(strpnew('Spilling!')),helpins);
-}
-              end;
-            { load/store is done }
-            exit;
-          end;
-
-        { all other instructions the compiler generates are the same (I hope):   }
-        { operand 0 is a register and is the destination, the others are sources }
-        { and can be either registers or constants                               }
-        { exception: branches (is_jmp isn't always set for them)                 }
-        if oper[0].typ <> top_reg then
-          exit;
-        reg1 := oper[0].reg.number shr 8;
-        if oper[1].typ = top_reg then
-          reg2 := oper[1].reg.number shr 8
-        else
-          reg2 := 0;
-        if (ops >= 3) and
-           (oper[2].typ = top_reg) then
-          reg3 := oper[2].reg.number shr 8
-        else
-          reg3 := 0;
-
-        supreg:=reg1;
-        if supreg in r then
-          begin
-            // Example:
-            //   add r20d, r21d, r22d   ; r20d must be spilled into -60(r1)
-            //
-            //   Change into:
-            //
-            //   lwz r23d, -60(r1)
-            //   add r23d, r21d, r22d
-            //   stw r23d, -60(r1)
-
-            pos := get_insert_pos(Tai(previous),reg1,reg2,reg3);
-            rgget(list,pos,0,helpreg);
-            spill_registers := true;
-            helpins := taicpu.op_reg_ref(A_STW,helpreg,spilltemplist[supreg]);
-            list.insertafter(helpins,self);
-            helpins := taicpu.op_reg_ref(A_LWZ,helpreg,spilltemplist[supreg]);
-            if pos=nil then
-              list.insertafter(helpins,list.first)
-            else
-              list.insertafter(helpins,pos.next);
-            loadreg(0,helpreg);
-            rgunget(list,helpins,helpreg);
-            forward_allocation(tai(helpins.next));
-{
-            writeln('spilling!');
-            list.insertafter(tai_comment.Create(strpnew('Spilling!')),helpins);
-}
-          end;
-
-        for i := 1 to 2 do
-          if (oper[i].typ = top_reg) then
-            begin
-              supreg:=oper[i].reg.number;
-              if supreg in r then
-                begin
-                  // Example:
-                  //   add r20d, r21d, r22d   ; r20d must be spilled into -60(r1)
-                  //
-                  //   Change into:
-                  //
-                  //   lwz r23d, -60(r1)
-                  //   add r23d, r21d, r22d
-                  //   stw r23d, -60(r1)
-      
-                  pos := get_insert_pos(Tai(previous),reg1,reg2,reg3);
-                  rgget(list,pos,0,helpreg);
-                  spill_registers := true;
-                  helpins := taicpu.op_reg_ref(A_LWZ,helpreg,spilltemplist[supreg]);
-                  if pos=nil then
-                    list.insertafter(helpins,list.first)
-                  else
-                    list.insertafter(helpins,pos.next);
-                  loadreg(i,helpreg);
-                  rgunget(list,helpins,helpreg);
-                  forward_allocation(tai(helpins.next));
-{
-                  writeln('spilling!');
-                  list.insertafter(tai_comment.Create(strpnew('Spilling!')),helpins);
-}
-                end;
-            end;
-      end;
-
-
-
     procedure InitAsm;
     procedure InitAsm;
       begin
       begin
       end;
       end;
@@ -766,31 +325,7 @@ uses cutils,rgobj;
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.12  2002-09-30 23:16:49  jonas
-    * is_nop() now identifies "mr rA,rA" instructions for removal
-
-  Revision 1.11  2003/07/23 10:58:06  jonas
-    - disabled some debugging code
-
-  Revision 1.10  2003/07/06 21:26:06  jonas
-    * committed wrong file previously :(
-
-  Revision 1.8  2003/06/14 22:32:43  jonas
-    * ppc compiles with -dnewra, haven't tried to compile anything with it
-      yet though
-
-  Revision 1.7  2003/06/14 14:53:50  jonas
-    * fixed newra cycle for x86
-    * added constants for indicating source and destination operands of the
-      "move reg,reg" instruction to aasmcpu (and use those in rgobj)
-
-  Revision 1.6  2003/05/11 11:08:25  jonas
-    + op_reg_reg_reg_const_const (for rlwnm)
-
-  Revision 1.5  2003/03/12 22:43:38  jonas
-    * more powerpc and generic fixes related to the new register allocator
-
-  Revision 1.4  2002/12/14 15:02:03  carl
+  Revision 1.4  2002-12-14 15:02:03  carl
     * maxoperands -> max_operands (for portability in rautils.pas)
     * maxoperands -> max_operands (for portability in rautils.pas)
     * fix some range-check errors with loadconst
     * fix some range-check errors with loadconst
     + add ncgadd unit to m68k
     + add ncgadd unit to m68k

+ 8 - 3
compiler/rautils.pas

@@ -35,7 +35,6 @@ Const
   RPNMax = 10;             { I think you only need 4, but just to be safe }
   RPNMax = 10;             { I think you only need 4, but just to be safe }
   OpMax  = 25;
   OpMax  = 25;
 
 
-  maxoperands = 3;         { Maximum operands for assembler instructions }
 
 
 
 
 {---------------------------------------------------------------------
 {---------------------------------------------------------------------
@@ -109,7 +108,7 @@ type
     condition : tasmcond;
     condition : tasmcond;
     ops       : byte;
     ops       : byte;
     labeled   : boolean;
     labeled   : boolean;
-    operands  : array[1..maxoperands] of toperand;
+    operands  : array[1..max_operands] of toperand;
     constructor create;
     constructor create;
     destructor  destroy;override;
     destructor  destroy;override;
     Procedure InitOperands;virtual;
     Procedure InitOperands;virtual;
@@ -1592,7 +1591,13 @@ end;
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.50  2002-11-25 17:43:23  peter
+  Revision 1.51  2002-12-14 15:02:03  carl
+    * maxoperands -> max_operands (for portability in rautils.pas)
+    * fix some range-check errors with loadconst
+    + add ncgadd unit to m68k
+    * some bugfix of a_param_reg with LOC_CREFERENCE
+
+  Revision 1.50  2002/11/25 17:43:23  peter
     * splitted defbase in defutil,symutil,defcmp
     * splitted defbase in defutil,symutil,defcmp
     * merged isconvertable and is_equal into compare_defs(_ext)
     * merged isconvertable and is_equal into compare_defs(_ext)
     * made operator search faster by walking the list only once
     * made operator search faster by walking the list only once

+ 12 - 6
compiler/sparc/aasmcpu.pas

@@ -137,7 +137,7 @@ constructor taicpu.op_const(op:tasmop;_op1:aword);
      inherited create(op);
      inherited create(op);
      init(_size);
      init(_size);
      ops:=1;
      ops:=1;
-     loadconst(0,_op1);
+     loadconst(0,aword(_op1));
   end;
   end;
 constructor taicpu.op_ref(op:tasmop;const _op1:treference);
 constructor taicpu.op_ref(op:tasmop;const _op1:treference);
   begin
   begin
@@ -160,7 +160,7 @@ constructor taicpu.op_reg_const(op:tasmop;_op1:tregister; _op2:aword);
      init(_size);
      init(_size);
      ops:=2;
      ops:=2;
      loadreg(0,_op1);
      loadreg(0,_op1);
-     loadconst(1,_op2);
+     loadconst(1,aword(_op2));
   end;
   end;
 constructor taicpu.op_reg_ref(Op:TAsmOp;Reg:TRegister;const Ref:TReference);
 constructor taicpu.op_reg_ref(Op:TAsmOp;Reg:TRegister;const Ref:TReference);
   begin
   begin
@@ -178,7 +178,7 @@ constructor taicpu.op_const_reg(op:tasmop;_op1:aword;_op2:tregister);
      inherited create(op);
      inherited create(op);
      init(_size);
      init(_size);
      ops:=2;
      ops:=2;
-     loadconst(0,_op1);
+     loadconst(0,aword(_op1));
      loadreg(1,_op2);
      loadreg(1,_op2);
   end;
   end;
 constructor TAiCpu.op_ref_reg(Op:TAsmOp;const Ref:TReference;Reg:TRegister);
 constructor TAiCpu.op_ref_reg(Op:TAsmOp;const Ref:TReference;Reg:TRegister);
@@ -223,7 +223,7 @@ constructor taicpu.op_const_ref_reg(op:tasmop;_size:topsize;_op1:aword;const _op
      inherited create(op);
      inherited create(op);
      init(_size);
      init(_size);
      ops:=3;
      ops:=3;
-     loadconst(0,_op1);
+     loadconst(0,aword(_op1));
      loadref(1,_op2);
      loadref(1,_op2);
      loadreg(2,_op3);
      loadreg(2,_op3);
   end;
   end;
@@ -232,7 +232,7 @@ constructor taicpu.op_const_reg_ref(op:tasmop;_size:topsize;_op1:aword;_op2:treg
      inherited create(op);
      inherited create(op);
      init(_size);
      init(_size);
      ops:=3;
      ops:=3;
-     loadconst(0,_op1);
+     loadconst(0,aword(_op1));
      loadreg(1,_op2);
      loadreg(1,_op2);
      loadref(2,_op3);
      loadref(2,_op3);
   end;
   end;
@@ -1083,7 +1083,13 @@ procedure InitAsm;
 end.
 end.
 {
 {
     $Log$
     $Log$
-    Revision 1.13  2002-11-17 16:32:04  carl
+    Revision 1.14  2002-12-14 15:02:03  carl
+      * maxoperands -> max_operands (for portability in rautils.pas)
+      * fix some range-check errors with loadconst
+      + add ncgadd unit to m68k
+      * some bugfix of a_param_reg with LOC_CREFERENCE
+
+    Revision 1.13  2002/11/17 16:32:04  carl
       * memory optimization (3-4%) : cleanup of tai fields,
       * memory optimization (3-4%) : cleanup of tai fields,
          cleanup of tdef and tsym fields.
          cleanup of tdef and tsym fields.
       * make it work for m68k
       * make it work for m68k