瀏覽代碼

* fix tavraddnode.second_cmp
* optimized register usage
+ implemented concatcopy for len<16

git-svn-id: branches/avr@17106 -

florian 14 年之前
父節點
當前提交
c7e6d07ff0
共有 2 個文件被更改,包括 13 次插入7 次删除
  1. 11 7
      compiler/avr/cgcpu.pas
  2. 2 0
      compiler/avr/navradd.pas

+ 11 - 7
compiler/avr/cgcpu.pas

@@ -516,7 +516,11 @@ unit cgcpu;
          shift:=0;
          for i:=1 to tcgsize2size[size] do
            begin
-             list.concat(taicpu.op_reg_const(A_LDI,reg,(qword(a) and mask) shr shift));
+             if ((qword(a) and mask) shr shift)=0 then
+               emit_mov(list,reg,NR_R1)
+             else
+               list.concat(taicpu.op_reg_const(A_LDI,reg,(qword(a) and mask) shr shift));
+
              mask:=mask shl 8;
              inc(shift,8);
              reg:=GetNextReg(reg);
@@ -578,8 +582,8 @@ unit cgcpu;
             getcpuregister(list,NR_R30);
             getcpuregister(list,NR_R31);
             tmpreg:=NR_R30;
-            list.concat(taicpu.op_reg_reg(A_MOV,tmpreg,ref.index));
-            list.concat(taicpu.op_reg_reg(A_MOV,GetNextReg(tmpreg),GetNextReg(ref.index)));
+            emit_mov(list,tmpreg,ref.index);
+            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)));
             ref.base:=tmpreg;
@@ -590,8 +594,8 @@ unit cgcpu;
             getcpuregister(list,NR_R30);
             getcpuregister(list,NR_R31);
             tmpreg:=NR_R30;
-            list.concat(taicpu.op_reg_reg(A_MOV,tmpreg,ref.base));
-            list.concat(taicpu.op_reg_reg(A_MOV,GetNextReg(tmpreg),GetNextReg(ref.base)));
+            emit_mov(list,tmpreg,ref.base);
+            emit_mov(list,GetNextReg(tmpreg),GetNextReg(ref.base));
             ref.base:=tmpreg;
             ref.index:=NR_NO;
           end
@@ -600,8 +604,8 @@ unit cgcpu;
             getcpuregister(list,NR_R30);
             getcpuregister(list,NR_R31);
             tmpreg:=NR_R30;
-            list.concat(taicpu.op_reg_reg(A_MOV,tmpreg,ref.index));
-            list.concat(taicpu.op_reg_reg(A_MOV,GetNextReg(tmpreg),GetNextReg(ref.index)));
+            emit_mov(list,tmpreg,ref.index);
+            emit_mov(list,GetNextReg(tmpreg),GetNextReg(ref.index));
             ref.base:=tmpreg;
             ref.index:=NR_NO;
           end;

+ 2 - 0
compiler/avr/navradd.pas

@@ -182,6 +182,8 @@ interface
 
         for i:=2 to tcgsize2size[left.location.size] do
           begin
+            tmpreg1:=GetNextReg(tmpreg1);
+            tmpreg2:=GetNextReg(tmpreg2);
             if i=5 then
               begin
                 tmpreg1:=left.location.registerhi;