Procházet zdrojové kódy

* a_loadaddr_ref_reg fixed

peter před 22 roky
rodič
revize
f50aba2839
1 změnil soubory, kde provedl 61 přidání a 20 odebrání
  1. 61 20
      compiler/sparc/cgcpu.pas

+ 61 - 20
compiler/sparc/cgcpu.pas

@@ -478,23 +478,23 @@ implementation
     procedure TCgSparc.a_loadaddr_ref_reg(list : TAasmOutput;const ref : TReference;r : tregister);
       var
          tmpref : treference;
+         zeroreg,
          hreg : tregister;
       begin
-        if (r.number=ref.index.number) or (r.number=ref.base.number) then
+        if (ref.base.number=NR_NO) and (ref.index.number<>NR_NO) then
+          internalerror(200306171);
+        zeroreg.enum:=R_INTREGISTER;
+        zeroreg.number:=NR_G0;
+        { At least big offset (need SETHI), maybe base and maybe index }
+        if assigned(ref.symbol) or
+           (ref.offset<simm13lo) or
+           (ref.offset>simm13hi) then
           begin
           {$ifdef newra}
             hreg:=rg.getaddressregister(list);
           {$else}
             hreg:=get_scratch_reg_address(list);
           {$endif}
-          end
-        else
-          hreg:=r;
-        { Need to use SETHI? }
-        if assigned(ref.symbol) or
-           (ref.offset<simm13lo) or
-           (ref.offset>simm13hi) then
-          begin
             reference_reset(tmpref);
             tmpref.symbol := ref.symbol;
             tmpref.offset := ref.offset;
@@ -503,20 +503,59 @@ implementation
             { Only the low part is left }
             tmpref.symaddr:=refs_lo;
             list.concat(taicpu.op_reg_ref_reg(A_OR,hreg,tmpref,hreg));
-          end;
-        if ref.base.number<>NR_NO then
-          list.concat(taicpu.op_reg_reg_reg(A_ADD,hreg,ref.base,hreg));
-        if ref.index.number<>NR_NO then
-          list.concat(taicpu.op_reg_reg_reg(A_ADD,hreg,ref.base,hreg));
-        if hreg.number<>r.number then
-          begin
-             a_load_reg_reg(list,OS_INT,OS_INT,hreg,r);
+            if ref.base.number<>NR_NO then
+              begin
+                if ref.index.number<>NR_NO then
+                  begin
+                    list.concat(taicpu.op_reg_reg_reg(A_ADD,hreg,ref.base,hreg));
+                    list.concat(taicpu.op_reg_reg_reg(A_ADD,hreg,ref.index,r));
+                  end
+                else
+                  list.concat(taicpu.op_reg_reg_reg(A_ADD,hreg,ref.base,r));
+              end;
            {$ifdef newra}
              rg.ungetaddressregister(list,hreg);
            {$else}
              free_scratch_reg(list,hreg);
            {$endif}
-          end;
+          end
+        else
+        { At least small offset, maybe base and maybe index }
+          if ref.offset<>0 then
+            begin
+              if ref.base.number<>NR_NO then
+                begin
+                  if ref.index.number<>NR_NO then
+                    begin
+                    {$ifdef newra}
+                      hreg:=rg.getaddressregister(list);
+                    {$else}
+                      hreg:=get_scratch_reg_address(list);
+                    {$endif}
+                      list.concat(taicpu.op_reg_const_reg(A_ADD,ref.base,aword(ref.offset),hreg));
+                      list.concat(taicpu.op_reg_reg_reg(A_ADD,hreg,ref.index,r));
+                    {$ifdef newra}
+                      rg.ungetaddressregister(list,hreg);
+                    {$else}
+                      free_scratch_reg(list,hreg);
+                    {$endif}
+                    end
+                  else
+                    list.concat(taicpu.op_reg_const_reg(A_ADD,ref.base,ref.offset,r));
+                end
+              else
+                list.concat(taicpu.op_reg_const_reg(A_ADD,zeroreg,ref.offset,r));
+            end
+        else
+        { Both base and index }
+          if ref.index.number<>NR_NO then
+            list.concat(taicpu.op_reg_reg_reg(A_ADD,ref.base,ref.index,r))
+        else
+        { Only base }
+          if ref.base.number<>NR_NO then
+            a_load_reg_reg(list,OS_INT,OS_INT,ref.base,r)
+        else
+          internalerror(200306172);
       end;
 
 
@@ -697,7 +736,6 @@ implementation
     procedure TCgSparc.g_overflowCheck(List:TAasmOutput;const Loc:TLocation;def:TDef);
       var
         hl : tasmlabel;
-        r  : Tregister;
       begin
         if not(cs_check_overflow in aktlocalswitches) then
           exit;
@@ -1092,7 +1130,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.59  2003-06-13 21:19:32  peter
+  Revision 1.60  2003-06-17 16:35:56  peter
+    * a_loadaddr_ref_reg fixed
+
+  Revision 1.59  2003/06/13 21:19:32  peter
     * current_procdef removed, use current_procinfo.procdef instead
 
   Revision 1.58  2003/06/12 16:43:07  peter