Quellcode durchsuchen

+ implements tcgavr.a_loadaddr_ref_reg

git-svn-id: branches/avr@17101 -
florian vor 14 Jahren
Ursprung
Commit
1cc956afc8
2 geänderte Dateien mit 45 neuen und 7 gelöschten Zeilen
  1. 1 0
      compiler/avr/agavrgas.pas
  2. 44 7
      compiler/avr/cgcpu.pas

+ 1 - 0
compiler/avr/agavrgas.pas

@@ -169,6 +169,7 @@ unit agavrgas;
               internalerror(2002070604);
           end;
         end;
+
     var op: TAsmOp;
         s: string;
         i: byte;

+ 44 - 7
compiler/avr/cgcpu.pas

@@ -34,11 +34,7 @@ unit cgcpu;
        parabase,
        cpubase,cpuinfo,node,cg64f32,rgcpu;
 
-
     type
-
-      { tcgavr }
-
       tcgavr = class(tcg)
         { true, if the next arithmetic operation should modify the flags }
         cgsetflags : boolean;
@@ -560,8 +556,8 @@ unit cgcpu;
               end;
             if (ref.index<>NR_NO) then
               begin
-                list.concat(taicpu.op_reg_reg(A_ADD,tmpreg,ref.base));
-                list.concat(taicpu.op_reg_reg(A_ADC,GetNextReg(tmpreg),GetNextReg(ref.base)));
+                list.concat(taicpu.op_reg_reg(A_ADD,tmpreg,ref.index));
+                list.concat(taicpu.op_reg_reg(A_ADC,GetNextReg(tmpreg),GetNextReg(ref.index)));
               end;
             ref.symbol:=nil;
             ref.offset:=0;
@@ -1004,6 +1000,7 @@ unit cgcpu;
         { TODO : implement g_flags2reg }
       end;
 
+
     procedure tcgavr.a_adjust_sp(list : TAsmList; value : longint);
       var
         i : integer;
@@ -1126,8 +1123,47 @@ unit cgcpu;
 
 
     procedure tcgavr.a_loadaddr_ref_reg(list : TAsmList;const ref : treference;r : tregister);
+      var
+        tmpref : treference;
       begin
-        { TODO : a_loadaddr_ref_reg }
+         if ref.addressmode<>AM_UNCHANGED then
+           internalerror(2011021701);
+
+        if assigned(ref.symbol) or (ref.offset<>0) then
+          begin
+            reference_reset(tmpref,0);
+            tmpref.symbol:=ref.symbol;
+            tmpref.offset:=ref.offset;
+            tmpref.refaddr:=addr_lo8;
+            list.concat(taicpu.op_reg_ref(A_LDI,r,tmpref));
+            tmpref.refaddr:=addr_hi8;
+            list.concat(taicpu.op_reg_ref(A_LDI,GetNextReg(r),tmpref));
+            if (ref.base<>NR_NO) then
+              begin
+                list.concat(taicpu.op_reg_reg(A_ADD,r,ref.base));
+                list.concat(taicpu.op_reg_reg(A_ADC,GetNextReg(r),GetNextReg(ref.base)));
+              end;
+            if (ref.index<>NR_NO) then
+              begin
+                list.concat(taicpu.op_reg_reg(A_ADD,r,ref.index));
+                list.concat(taicpu.op_reg_reg(A_ADC,GetNextReg(r),GetNextReg(ref.index)));
+              end;
+          end
+        else if (ref.base<>NR_NO)then
+          begin
+            emit_mov(list,r,ref.base);
+            emit_mov(list,GetNextReg(r),GetNextReg(ref.base));
+            if (ref.index<>NR_NO) then
+              begin
+                list.concat(taicpu.op_reg_reg(A_ADD,r,ref.index));
+                list.concat(taicpu.op_reg_reg(A_ADC,GetNextReg(r),GetNextReg(ref.index)));
+              end;
+          end
+        else if (ref.index<>NR_NO) then
+          begin
+            emit_mov(list,r,ref.index);
+            emit_mov(list,GetNextReg(r),GetNextReg(ref.index));
+          end;
       end;
 
 
@@ -1167,6 +1203,7 @@ unit cgcpu;
         internalerror(2011021321);
       end;
 
+
     procedure tcgavr.g_concatcopy_unaligned(list : TAsmList;const source,dest : treference;len : aint);
       begin
         g_concatcopy_internal(list,source,dest,len,false);