Browse Source

* Xtensa: improve tcgcpu.fixref

git-svn-id: trunk@44368 -
florian 5 years ago
parent
commit
47f6af4416
1 changed files with 27 additions and 1 deletions
  1. 27 1
      compiler/xtensa/cgcpu.pas

+ 27 - 1
compiler/xtensa/cgcpu.pas

@@ -292,7 +292,7 @@ implementation
         l : tasmlabel;
         l : tasmlabel;
       begin
       begin
         { create consts entry }
         { create consts entry }
-        if assigned(ref.symbol) or (ref.offset<>0) then
+        if assigned(ref.symbol) or (ref.offset<-2048) or (ref.offset>2047) then
           begin
           begin
             reference_reset(tmpref,4,[]);
             reference_reset(tmpref,4,[]);
             current_asmdata.getjumplabel(l);
             current_asmdata.getjumplabel(l);
@@ -321,7 +321,33 @@ implementation
               end
               end
             else
             else
               ref.base:=tmpreg;
               ref.base:=tmpreg;
+          end
+        else if ref.offset<>0 then
+          begin
+            tmpreg:=getintregister(list,OS_INT);
+            if (ref.offset>=-128) and (ref.offset<=127) then
+              begin
+                list.concat(taicpu.op_reg_reg_const(A_ADDI,tmpreg,ref.base,ref.offset));
+                ref.base:=tmpreg;
+              end
+            else
+              begin
+                list.concat(taicpu.op_reg_const(A_MOVI,tmpreg,ref.offset));
+                if ref.base<>NR_NO then
+                  begin
+                    if ref.index<>NR_NO then
+                      begin
+                        list.concat(taicpu.op_reg_reg_reg(A_ADD,tmpreg,ref.base,tmpreg));
+                        ref.base:=tmpreg;
+                      end
+                    else
+                      ref.index:=tmpreg;
+                  end
+                else
+                  ref.base:=tmpreg;
+              end;
           end;
           end;
+
         if ref.index<>NR_NO then
         if ref.index<>NR_NO then
           begin
           begin
             if ref.base<>NR_NO then
             if ref.base<>NR_NO then