浏览代码

* forgotten file in previous commit

git-svn-id: branches/avr@17107 -
florian 14 年之前
父节点
当前提交
d4ff3b2eb6
共有 1 个文件被更改,包括 68 次插入19 次删除
  1. 68 19
      compiler/avr/cgcpu.pas

+ 68 - 19
compiler/avr/cgcpu.pas

@@ -552,15 +552,15 @@ unit cgcpu;
           end;
         if assigned(ref.symbol) or (ref.offset<>0) then
           begin
-            getcpuregister(list,NR_R30);
-            getcpuregister(list,NR_R31);
             tmpreg:=NR_R30;
             reference_reset(tmpref,0);
             tmpref.symbol:=ref.symbol;
             tmpref.offset:=ref.offset;
             tmpref.refaddr:=addr_lo8;
+            getcpuregister(list,tmpreg);
             list.concat(taicpu.op_reg_ref(A_LDI,tmpreg,tmpref));
             tmpref.refaddr:=addr_hi8;
+            getcpuregister(list,GetNextReg(tmpreg));
             list.concat(taicpu.op_reg_ref(A_LDI,GetNextReg(tmpreg),tmpref));
             if (ref.base<>NR_NO) then
               begin
@@ -579,10 +579,10 @@ unit cgcpu;
           end
         else if (ref.base<>NR_NO) and (ref.index<>NR_NO) then
           begin
-            getcpuregister(list,NR_R30);
-            getcpuregister(list,NR_R31);
             tmpreg:=NR_R30;
+            getcpuregister(list,tmpreg);
             emit_mov(list,tmpreg,ref.index);
+            getcpuregister(list,GetNextReg(tmpreg));
             emit_mov(list,GetNextReg(tmpreg),GetNextReg(ref.index));
             list.concat(taicpu.op_reg_reg(A_ADD,tmpreg,ref.base));
             list.concat(taicpu.op_reg_reg(A_ADC,GetNextReg(tmpreg),GetNextReg(ref.base)));
@@ -591,20 +591,20 @@ unit cgcpu;
           end
         else if (ref.base<>NR_NO) then
           begin
-            getcpuregister(list,NR_R30);
-            getcpuregister(list,NR_R31);
             tmpreg:=NR_R30;
+            getcpuregister(list,tmpreg);
             emit_mov(list,tmpreg,ref.base);
+            getcpuregister(list,GetNextReg(tmpreg));
             emit_mov(list,GetNextReg(tmpreg),GetNextReg(ref.base));
             ref.base:=tmpreg;
             ref.index:=NR_NO;
           end
         else if (ref.index<>NR_NO) then
           begin
-            getcpuregister(list,NR_R30);
-            getcpuregister(list,NR_R31);
             tmpreg:=NR_R30;
+            getcpuregister(list,tmpreg);
             emit_mov(list,tmpreg,ref.index);
+            getcpuregister(list,GetNextReg(tmpreg));
             emit_mov(list,GetNextReg(tmpreg),GetNextReg(ref.index));
             ref.base:=tmpreg;
             ref.index:=NR_NO;
@@ -621,6 +621,7 @@ unit cgcpu;
          i : integer;
          QuickRef : Boolean;
        begin
+         QuickRef:=false;
          if not((Ref.addressmode=AM_UNCHANGED) and
                 (Ref.symbol=nil) and
                 ((Ref.base=NR_R28) or
@@ -774,6 +775,12 @@ unit cgcpu;
                  reg:=GetNextReg(reg);
                end;
            end;
+
+         if not(QuickRef) then
+           begin
+             ungetcpuregister(list,href.base);
+             ungetcpuregister(list,GetNextReg(href.base));
+           end;
        end;
 
 
@@ -786,6 +793,7 @@ unit cgcpu;
          i : integer;
          QuickRef : boolean;
        begin
+         QuickRef:=false;
          if not((Ref.addressmode=AM_UNCHANGED) and
                 (Ref.symbol=nil) and
                 ((Ref.base=NR_R28) or
@@ -902,6 +910,12 @@ unit cgcpu;
                  reg:=GetNextReg(reg);
                end;
            end;
+
+         if not(QuickRef) then
+           begin
+             ungetcpuregister(list,href.base);
+             ungetcpuregister(list,GetNextReg(href.base));
+           end;
        end;
 
 
@@ -1250,6 +1264,7 @@ unit cgcpu;
         copysize,countregsize : tcgsize;
         l : TAsmLabel;
         i : longint;
+        SrcQuickRef, DestQuickRef : Boolean;
       begin
         if len>16 then
           begin
@@ -1294,29 +1309,63 @@ unit cgcpu;
           end
         else
           begin
+            SrcQuickRef:=false;
+            DestQuickRef:=false;
+            if not((source.addressmode=AM_UNCHANGED) and
+                   (source.symbol=nil) and
+                   ((source.base=NR_R28) or
+                    (source.base=NR_R29)) and
+                    (source.Index=NR_No) and
+                    (source.Offset in [0..64-len])) and
+              not((source.Base=NR_NO) and (source.Index=NR_NO)) then
+              srcref:=normalize_ref(list,source)
+            else
+              begin
+                SrcQuickRef:=true;
+                srcref:=source;
+              end;
+
+            if not((dest.addressmode=AM_UNCHANGED) and
+                   (dest.symbol=nil) and
+                   ((dest.base=NR_R28) or
+                    (dest.base=NR_R29)) and
+                    (dest.Index=NR_No) and
+                    (dest.Offset in [0..64-len])) and
+              not((dest.Base=NR_NO) and (dest.Index=NR_NO)) then
+              dstref:=normalize_ref(list,dest)
+            else
+              begin
+                DestQuickRef:=true;
+                dstref:=dest;
+              end;
+
             for i:=1 to len do
               begin
-                srcref:=normalize_ref(list,source);
-                dstref:=normalize_ref(list,source);
                 copysize:=OS_8;
                 tmpreg:=getintregister(list,copysize);
-                if (srcref.base<>NR_NO) and (i<len) then
+
+                if not(SrcQuickRef) and (i<len) then
                   srcref.addressmode:=AM_POSTINCREMENT
                 else
                   srcref.addressmode:=AM_UNCHANGED;
-                if (dstref.base<>NR_NO) and (i<len) then
+
+                if not(DestQuickRef) and (i<len) then
                   dstref.addressmode:=AM_POSTINCREMENT
                 else
                   dstref.addressmode:=AM_UNCHANGED;
 
-              list.concat(taicpu.op_reg_ref(GetLoad(srcref),tmpreg,srcref));
-              list.concat(taicpu.op_ref_reg(GetStore(dstref),dstref,tmpreg));
-
-              if (dstref.offset<>0) or assigned(dstref.symbol) then
-                inc(dstref.offset);
-              if (srcref.offset<>0) or assigned(srcref.symbol) then
-                inc(srcref.offset);
+                list.concat(taicpu.op_reg_ref(GetLoad(srcref),tmpreg,srcref));
+                list.concat(taicpu.op_ref_reg(GetStore(dstref),dstref,tmpreg));
 
+                if SrcQuickRef then
+                  inc(srcref.offset);
+                if DestQuickRef then
+                  inc(dstref.offset);
+              end;
+            if not(SrcQuickRef) then
+              begin
+                ungetcpuregister(list,srcref.base);
+                ungetcpuregister(list,GetNextReg(srcref.base));
               end;
           end;
       end;