瀏覽代碼

* fixing index overflow in handling new registers arrays.

mazen 22 年之前
父節點
當前提交
a33dd56d81

+ 12 - 6
compiler/sparc/aasmcpu.pas

@@ -761,17 +761,20 @@ begin
   LastInsOffset:=-1;
 end;
 procedure TAiCpu.SetCondition(const c:TAsmCond);
+  const
+    AsmCond2OpCode:array[TAsmCond]of TAsmOp=
+      (A_BN,A_BNE,A_BE,A_BG,A_BLE,A_BGE,A_BI,A_BGU,A_BLEU,A_BCC,
+A_BCS,A_BPOS,A_NEG,A_BVC,A_BVS,A_BA,A_NONE,A_NONE,A_NONE,A_NONE,A_NONE,A_NONE,A_NONE,A_NONE,A_NONE,A_NONE,A_NONE,A_NONE,A_NONE,A_NONE,A_NONE);
   begin
     inherited SetCondition(c);
     if Opcode=A_BA
     then
       begin
         is_jmp:=true;
-        case c of
-          C_NE:Opcode:=A_BNE;
-        else
-          InternalError(2003021800);
-        end;
+        Opcode:=AsmCond2OpCode[c];
+      {$IFDEF EXTDEBUG}
+        WriteLn('In TAiCpu.SetCondition TAsmCond=',Byte(Opcode),'==>',std_op2str[AsmCond2OpCode[c]]);
+      {$ENDIF EXTDEBUG}
       end;
   end;
 function taicpu.NeedAddrPrefix(opidx:byte):boolean;
@@ -1093,7 +1096,10 @@ procedure InitAsm;
 end.
 {
     $Log$
-    Revision 1.17  2003-02-18 22:00:20  mazen
+    Revision 1.18  2003-03-10 21:59:54  mazen
+    * fixing index overflow in handling new registers arrays.
+
+    Revision 1.17  2003/02/18 22:00:20  mazen
     * asm condition generation modified by TAiCpu.SetCondition
 
     Revision 1.16  2003/01/08 18:43:58  daniel

+ 25 - 7
compiler/sparc/cgcpu.pas

@@ -408,12 +408,27 @@ procedure TCgSparc.a_loadfpu_reg_reg(list:TAasmOutput;reg1, reg2:tregister);
        end;
 
 
-    procedure TCgSparc.a_loadfpu_reg_ref(list:TAasmOutput;size:tcgsize;reg:tregister;CONST ref:TReference);
-
+    procedure TCgSparc.a_loadfpu_reg_ref(list:TAasmOutput;size:tcgsize;reg:tregister;const ref:TReference);
+       const
+         FpuStoreInstr: Array[OS_F32..OS_F64,boolean, boolean] of TAsmOp =
+                            { indexed? updating?}
+                    (((A_STF,A_STF),(A_STF,A_STF)),
+                     ((A_STDF,A_STDF),(A_STDF,A_STDF)));
+       var
+         op: tasmop;
+         ref2: treference;
+         freereg: boolean;
        begin
-{         if reg <> R_ST then
-           a_loadfpu_reg_reg(list,reg,R_ST);}
-         floatstore(list,size,ref);
+         if not(size in [OS_F32,OS_F64])
+         then
+           internalerror(200201122);
+{         ref2:=ref;
+         freereg:=fixref(list,ref2);
+         op:=fpustoreinstr[size,ref2.index.enum <> R_NO,false];
+         a_load_store(list,op,reg,ref2);
+         if freereg
+         then
+           cg.free_scratch_reg(list,ref2.base);}
        end;
 
 
@@ -1214,7 +1229,7 @@ procedure TCgSparc.g_concatcopy(list:taasmoutput;const source,dest:treference;le
           objectlibrary.getlabel(lab);
           a_label(list, lab);
           list.concat(taicpu.op_reg_const_reg(A_SUB,countreg,1,countreg));
-          list.concat(taicpu.op_reg_ref(A_LDF,r,src));
+          list.concat(taicpu.op_ref_reg(A_LDF,src,r));
           list.concat(taicpu.op_reg_ref(A_STD,r,dst));
           //a_jmp(list,A_BC,C_NE,0,lab);
           free_scratch_reg(list,countreg);
@@ -1410,7 +1425,10 @@ BEGIN
 END.
 {
   $Log$
-  Revision 1.40  2003-02-25 21:41:44  mazen
+  Revision 1.41  2003-03-10 21:59:54  mazen
+  * fixing index overflow in handling new registers arrays.
+
+  Revision 1.40  2003/02/25 21:41:44  mazen
   * code re-aligned 2 spaces
 
   Revision 1.39  2003/02/19 22:00:16  daniel

+ 8 - 5
compiler/sparc/cpubase.pas

@@ -207,8 +207,8 @@ TYPE
   Tsupregset=set of Tsuperregister;
 CONST
   R_NO=R_NONE;
-  firstreg = R_G0;
-  lastreg  = R_I7;
+  firstreg = Succ(R_NONE);
+  lastreg  = Pred(R_INTREGISTER);
 
 {General registers.}
 
@@ -466,8 +466,8 @@ const
   lastsaveintreg = RS_I7;
   firstsavefpureg = R_F0;
   lastsavefpureg = R_F31;
-  firstsavemmreg = R_I0;
-  lastsavemmreg = R_I7;
+  firstsavemmreg = R_NONE;
+  lastsavemmreg = R_NONE;
   lowsavereg = R_G0;
   highsavereg = R_I7;
 
@@ -676,7 +676,10 @@ END.
 
 {
   $Log$
-  Revision 1.24  2003-02-26 22:06:27  mazen
+  Revision 1.25  2003-03-10 21:59:54  mazen
+  * fixing index overflow in handling new registers arrays.
+
+  Revision 1.24  2003/02/26 22:06:27  mazen
   * FirstReg <-- R_G0 instead of Low(TOldRegister)=R_NONE
   * LastReg <-- R_L7 instead of High(R_ASR31)=High(TOldRegister)
   * FirstReg..LastReg rplaced by TOldRegister in several arrays declarions

+ 9 - 6
compiler/sparc/ncpuadd.pas

@@ -57,18 +57,18 @@ procedure TSparcAddNode.clear_left_right(cmpop:Boolean);
     if(right.location.loc in [LOC_REGISTER,LOC_FPUREGISTER])and(cmpop or(location.register.enum <> right.location.register.enum))
     then
       begin
-        rg.ungetregister(exprasmlist,right.location.register);
+        rg.UnGetRegisterInt(exprasmlist,right.location.register);
         if is_64bitint(right.resulttype.def)
         then
-          rg.ungetregister(exprasmlist,right.location.registerhigh);
+          rg.UnGetRegisterInt(exprasmlist,right.location.registerhigh);
         end;
     if(left.location.loc in [LOC_REGISTER,LOC_FPUREGISTER])and(cmpop or(location.register.enum <> left.location.register.enum))
     then
       begin
-        rg.ungetregister(exprasmlist,left.location.register);
+        rg.UnGetRegisterInt(exprasmlist,left.location.register);
         if is_64bitint(left.resulttype.def)
         then
-          rg.ungetregister(exprasmlist,left.location.registerhigh);
+          rg.UnGetRegisterInt(exprasmlist,left.location.registerhigh);
       end;
   end;
 procedure TSparcAddNode.second_addboolean;
@@ -930,7 +930,7 @@ procedure TSparcAddNode.second_addfloat;
               r,left.location.register,right.location.register))
           end;
 
-        clear_left_right(cmpop);
+//        clear_left_right(cmpop);
   end;
 procedure TSparcAddNode.set_result_location(cmpOp,unsigned:Boolean);
   begin
@@ -1111,7 +1111,10 @@ begin
 end.
 {
     $Log$
-    Revision 1.10  2003-02-19 22:00:17  daniel
+    Revision 1.11  2003-03-10 21:59:54  mazen
+    * fixing index overflow in handling new registers arrays.
+
+    Revision 1.10  2003/02/19 22:00:17  daniel
       * Code generator converted to new register notation
       - Horribily outdated todo.txt removed
 

+ 6 - 3
compiler/sparc/ncpucnv.pas

@@ -238,7 +238,7 @@ procedure TSparctypeconvnode.second_int_to_real;
       if(left.location.loc = LOC_REGISTER) or
         ((left.location.loc = LOC_CREGISTER) and not signed)
       then
-        rg.ungetregister(exprasmlist,leftreg)
+        rg.UnGetRegisterInt(exprasmlist,leftreg)
       else
         cg.free_scratch_reg(exprasmlist,valuereg);
       tmpfpureg := rg.getregisterfpu(exprasmlist);
@@ -300,7 +300,7 @@ procedure TSparctypeconvnode.second_int_to_bool;
             hreg1 := rg.getregisterint(exprasmlist,opsize);
             exprasmlist.concat(taicpu.op_reg_const_reg(A_SUB,hreg1,1,hreg2));
             exprasmlist.concat(taicpu.op_reg_reg_reg(A_SUB,hreg1,hreg1,hreg2));
-            rg.ungetregister(exprasmlist,hreg2);
+            rg.UnGetRegisterInt(exprasmlist,hreg2);
         end;
       LOC_FLAGS :
         begin
@@ -388,7 +388,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.12  2003-02-19 22:00:17  daniel
+  Revision 1.13  2003-03-10 21:59:54  mazen
+  * fixing index overflow in handling new registers arrays.
+
+  Revision 1.12  2003/02/19 22:00:17  daniel
     * Code generator converted to new register notation
     - Horribily outdated todo.txt removed
 

+ 9 - 6
compiler/sparc/ncpumat.pas

@@ -140,14 +140,14 @@ implementation
              begin
                exprasmlist.concat(taicpu.op_reg_reg_reg(A_SMUL,resultreg,
                  divider,resultreg));
-               rg.ungetregister(exprasmlist,divider);
+               rg.UnGetRegisterInt(exprasmlist,divider);
                exprasmlist.concat(taicpu.op_reg_reg_reg(A_SUB,location.register,
                  numerator,resultreg));
                cg.free_scratch_reg(exprasmlist,resultreg);
                resultreg := location.register;
              end
            else
-             rg.ungetregister(exprasmlist,divider);
+             rg.UnGetRegisterInt(exprasmlist,divider);
            end;
        { free used registers }
         if numerator.enum <> resultreg.enum then
@@ -263,12 +263,12 @@ procedure tSparcshlshrnode.pass_2;
             exprasmlist.concat(taicpu.op_reg_reg_reg(asmop1,R_0,hregisterlow,R_0));
             exprasmlist.concat(taicpu.op_reg_reg_reg(A_OR,location.registerhigh,location.registerhigh,R_0));
             exprasmlist.concat(taicpu.op_reg_reg_reg(asmop1,location.registerlow,hregisterlow,hregister1));}
-            rg.ungetregister(exprasmlist,r);
+            rg.UnGetRegisterInt(exprasmlist,r);
             if right.location.loc in [LOC_CREFERENCE,LOC_REFERENCE]
             then
               cg.free_scratch_reg(exprasmlist,hregister1)
             else
-              rg.ungetregister(exprasmlist,hregister1);
+              rg.UnGetRegisterInt(exprasmlist,hregister1);
           end
       end
     else
@@ -301,7 +301,7 @@ procedure tSparcshlshrnode.pass_2;
             location_force_reg(exprasmlist,right.location,def_cgsize(right.resulttype.def),true);
             hregister2 := right.location.register;
             cg.a_op_reg_reg_reg(exprasmlist,op,OS_32,hregister2,hregister1,resultreg);
-            rg.ungetregister(exprasmlist,hregister2);
+            rg.UnGetRegisterInt(exprasmlist,hregister2);
           end;
       end;
   end;
@@ -478,7 +478,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.5  2003-02-19 22:00:17  daniel
+  Revision 1.6  2003-03-10 21:59:54  mazen
+  * fixing index overflow in handling new registers arrays.
+
+  Revision 1.5  2003/02/19 22:00:17  daniel
     * Code generator converted to new register notation
     - Horribily outdated todo.txt removed
 

+ 7 - 5
compiler/sparc/rgcpu.pas

@@ -56,10 +56,10 @@ var r:Tregister;
     else result := inherited GetExplicitRegisterInt(list,reg);
   end;
 
-procedure trgcpu.UngetregisterInt(list: taasmoutput; reg: tregister);
-
+procedure trgcpu.UngetRegisterInt(list:taasmoutput;reg:tregister);
   begin
-    if reg.enum<>R_INTREGISTER then
+    if reg.enum<>R_INTREGISTER
+    then
       internalerror(200302191);
     if (reg.number=RS_O7) or (reg.number=NR_I7)
     then
@@ -67,13 +67,15 @@ procedure trgcpu.UngetregisterInt(list: taasmoutput; reg: tregister);
     else
       inherited ungetregisterint(list,reg);
   end;
-
 begin
   rg := trgcpu.create;
 end.
 {
   $Log$
-  Revision 1.6  2003-02-19 22:00:17  daniel
+  Revision 1.7  2003-03-10 21:59:54  mazen
+  * fixing index overflow in handling new registers arrays.
+
+  Revision 1.6  2003/02/19 22:00:17  daniel
     * Code generator converted to new register notation
     - Horribily outdated todo.txt removed