Browse Source

+ support adding an OPR_REFERENCE to a OPR_LOCAL in the x86 intel syntax asm
reader; this fixes stuff like 'mov ax,cs:localvar[5]'

git-svn-id: trunk@38457 -

nickysn 7 years ago
parent
commit
68be282507
2 changed files with 39 additions and 0 deletions
  1. 38 0
      compiler/x86/rax86int.pas
  2. 1 0
      tests/test/tasm23.pp

+ 38 - 0
compiler/x86/rax86int.pas

@@ -898,6 +898,44 @@ Unit Rax86int;
                   internalerror(2018030701);
               end;
             end;
+          OPR_LOCAL:
+            begin
+              case src.opr.typ of
+                OPR_REFERENCE:
+                  begin
+                    if src.opr.ref.base<>NR_NO then
+                      begin
+                        if dest.opr.localindexreg=NR_NO then
+                          begin
+                            dest.opr.localindexreg:=src.opr.ref.base;
+                            dest.opr.localscale:=0;
+                          end
+                        else if dest.opr.localindexreg=src.opr.ref.base then
+                          dest.opr.localscale:=Min(dest.opr.localscale,1)+1
+                        else
+                          Message(asmr_e_multiple_index);
+                      end;
+                    if src.opr.ref.index<>NR_NO then
+                      begin
+                        if dest.opr.localindexreg=NR_NO then
+                          begin
+                            dest.opr.localindexreg:=src.opr.ref.index;
+                            dest.opr.localscale:=src.opr.ref.scalefactor;
+                          end
+                        else if dest.opr.localindexreg=src.opr.ref.index then
+                          dest.opr.localscale:=Min(dest.opr.localscale,1)+Min(src.opr.ref.scalefactor,1)
+                        else
+                          Message(asmr_e_multiple_index);
+                      end;
+                    Inc(dest.opr.localconstoffset,src.opr.constoffset);
+                    Inc(dest.opr.localsymofs,src.opr.constoffset);
+                    if src.opr.ref.segment<>NR_NO then
+                      SetSegmentOverride(dest,src.opr.ref.segment);
+                  end;
+                else
+                  internalerror(2018030703);
+              end;
+            end;
           else
             internalerror(2018030702);
         end;

+ 1 - 0
tests/test/tasm23.pp

@@ -18,6 +18,7 @@ asm
   mov ax, cs:locl                          { mov ax, cs:[bp-02] }
   mov ax, [cs:locl]                        { mov ax, cs:[bp-02] }
   mov ax, [cs:[locl]]                      { mov ax, cs:[bp-02] }
+  mov ax, cs:locl[5]                       { mov ax, cs:[bp+03] }
 end;
 
 begin