Browse Source

* refactored tx86intreader.AddReferences to use a pair of case statements,
depending on the combination of operand types; this is done, so that adding
OPR_LOCAL with OPR_REFERENCE operands can be supported later.

git-svn-id: trunk@38443 -

nickysn 7 years ago
parent
commit
d3cb61b651
1 changed files with 37 additions and 25 deletions
  1. 37 25
      compiler/x86/rax86int.pas

+ 37 - 25
compiler/x86/rax86int.pas

@@ -828,31 +828,43 @@ Unit Rax86int;
         end;
 
       begin
-        if (dest.opr.typ<>OPR_REFERENCE) or (src.opr.typ<>OPR_REFERENCE) then
-          internalerror(2018022601);
-        AddRegister(src.opr.ref.base,1);
-        AddRegister(src.opr.ref.index,src.opr.ref.scalefactor);
-        if src.opr.ref.segment<>NR_NO then
-          SetSegmentOverride(dest,src.opr.ref.segment);
-        Inc(dest.opr.ref.offset,src.opr.ref.offset);
-        Inc(dest.opr.constoffset,src.opr.constoffset);
-        dest.haslabelref:=dest.haslabelref or src.haslabelref;
-        dest.hasproc:=dest.hasproc or src.hasproc;
-        dest.hasvar:=dest.hasvar or src.hasvar;
-        if assigned(src.opr.ref.symbol) then
-          begin
-            if assigned(dest.opr.ref.symbol) then
-              Message(asmr_e_cant_have_multiple_relocatable_symbols);
-            dest.opr.ref.symbol:=src.opr.ref.symbol;
-          end;
-        if assigned(src.opr.ref.relsymbol) then
-          begin
-            if assigned(dest.opr.ref.relsymbol) then
-              Message(asmr_e_cant_have_multiple_relocatable_symbols);
-            dest.opr.ref.relsymbol:=src.opr.ref.relsymbol;
-          end;
-        if dest.opr.ref.refaddr=addr_no then
-          dest.opr.ref.refaddr:=src.opr.ref.refaddr;
+        case dest.opr.typ of
+          OPR_REFERENCE:
+            begin
+              case src.opr.typ of
+                OPR_REFERENCE:
+                  begin
+                    AddRegister(src.opr.ref.base,1);
+                    AddRegister(src.opr.ref.index,src.opr.ref.scalefactor);
+                    if src.opr.ref.segment<>NR_NO then
+                      SetSegmentOverride(dest,src.opr.ref.segment);
+                    Inc(dest.opr.ref.offset,src.opr.ref.offset);
+                    Inc(dest.opr.constoffset,src.opr.constoffset);
+                    dest.haslabelref:=dest.haslabelref or src.haslabelref;
+                    dest.hasproc:=dest.hasproc or src.hasproc;
+                    dest.hasvar:=dest.hasvar or src.hasvar;
+                    if assigned(src.opr.ref.symbol) then
+                      begin
+                        if assigned(dest.opr.ref.symbol) then
+                          Message(asmr_e_cant_have_multiple_relocatable_symbols);
+                        dest.opr.ref.symbol:=src.opr.ref.symbol;
+                      end;
+                    if assigned(src.opr.ref.relsymbol) then
+                      begin
+                        if assigned(dest.opr.ref.relsymbol) then
+                          Message(asmr_e_cant_have_multiple_relocatable_symbols);
+                        dest.opr.ref.relsymbol:=src.opr.ref.relsymbol;
+                      end;
+                    if dest.opr.ref.refaddr=addr_no then
+                      dest.opr.ref.refaddr:=src.opr.ref.refaddr;
+                  end;
+                else
+                  internalerror(2018030701);
+              end;
+            end;
+          else
+            internalerror(2018030702);
+        end;
       end;