ソースを参照

* due to avr's harvard architecture, loads of code labels need to use the gs(...) macro

git-svn-id: trunk@30559 -
florian 10 年 前
コミット
4d01271944
3 ファイル変更27 行追加4 行削除
  1. 4 0
      compiler/avr/agavrgas.pas
  2. 21 4
      compiler/avr/cgcpu.pas
  3. 2 0
      compiler/cgbase.pas

+ 4 - 0
compiler/avr/agavrgas.pas

@@ -128,8 +128,12 @@ unit agavrgas;
                   case refaddr of
                     addr_hi8:
                       s:='hi8('+s+')';
+                    addr_hi8_gs:
+                      s:='hi8(gs('+s+'))';
                     addr_lo8:
                       s:='lo8('+s+')';
+                    addr_lo8_gs:
+                      s:='lo8(gs('+s+'))';
                     else
                       s:='('+s+')';
                   end;

+ 21 - 4
compiler/avr/cgcpu.pas

@@ -843,12 +843,20 @@ unit cgcpu;
             reference_reset(tmpref,0);
             tmpref.symbol:=ref.symbol;
             tmpref.offset:=ref.offset;
-            tmpref.refaddr:=addr_lo8;
+            if assigned(ref.symbol) and (ref.symbol.typ in [AT_FUNCTION,AT_LABEL]) then
+              tmpref.refaddr:=addr_lo8_gs
+            else
+              tmpref.refaddr:=addr_lo8;
             maybegetcpuregister(list,tmpreg);
             list.concat(taicpu.op_reg_ref(A_LDI,tmpreg,tmpref));
-            tmpref.refaddr:=addr_hi8;
+
+            if assigned(ref.symbol) and (ref.symbol.typ in [AT_FUNCTION,AT_LABEL]) then
+              tmpref.refaddr:=addr_hi8_gs
+            else
+              tmpref.refaddr:=addr_hi8;
             maybegetcpuregister(list,GetNextReg(tmpreg));
             list.concat(taicpu.op_reg_ref(A_LDI,GetNextReg(tmpreg),tmpref));
+
             if (ref.base<>NR_NO) then
               begin
                 list.concat(taicpu.op_reg_reg(A_ADD,tmpreg,ref.base));
@@ -1623,10 +1631,19 @@ unit cgcpu;
             reference_reset(tmpref,0);
             tmpref.symbol:=ref.symbol;
             tmpref.offset:=ref.offset;
-            tmpref.refaddr:=addr_lo8;
+
+            if assigned(ref.symbol) and (ref.symbol.typ in [AT_FUNCTION,AT_LABEL]) then
+              tmpref.refaddr:=addr_lo8_gs
+            else
+              tmpref.refaddr:=addr_lo8;
             list.concat(taicpu.op_reg_ref(A_LDI,r,tmpref));
-            tmpref.refaddr:=addr_hi8;
+
+            if assigned(ref.symbol) and (ref.symbol.typ in [AT_FUNCTION,AT_LABEL]) then
+              tmpref.refaddr:=addr_hi8_gs
+            else
+              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));

+ 2 - 0
compiler/cgbase.pas

@@ -95,7 +95,9 @@ interface
          {$ENDIF}
          {$IFDEF AVR}
          ,addr_lo8
+         ,addr_lo8_gs
          ,addr_hi8
+         ,addr_hi8_gs
          {$ENDIF}
          {$IFDEF i8086}
          ,addr_dgroup      // the data segment group