Forráskód Böngészése

+ partial support for BP7 reference-like inline asm constants

git-svn-id: trunk@38850 -
nickysn 7 éve
szülő
commit
16e0172021
3 módosított fájl, 53 hozzáadás és 2 törlés
  1. 1 0
      .gitattributes
  2. 23 2
      compiler/x86/rax86int.pas
  3. 29 0
      tests/test/tasm27.pp

+ 1 - 0
.gitattributes

@@ -12578,6 +12578,7 @@ tests/test/tasm25ss1.pp svneol=native#text/plain
 tests/test/tasm25ss2.pp svneol=native#text/plain
 tests/test/tasm25ss3.pp svneol=native#text/plain
 tests/test/tasm26.pp svneol=native#text/plain
+tests/test/tasm27.pp svneol=native#text/plain
 tests/test/tasm2a.pp svneol=native#text/plain
 tests/test/tasm3.pp svneol=native#text/plain
 tests/test/tasm4.pp svneol=native#text/plain

+ 23 - 2
compiler/x86/rax86int.pas

@@ -52,7 +52,11 @@ Unit Rax86int;
        tconstsymbolexpressioninputflag = (
          cseif_needofs,
          cseif_isref,
-         cseif_startingminus
+         cseif_startingminus,
+         { allows using full reference-like syntax for constsymbol expressions,
+           for example:
+           Rec.Str[5]  ->  Rec.Str+5 }
+         cseif_referencelike
        );
        tconstsymbolexpressioninputflags = set of tconstsymbolexpressioninputflag;
        { output flags for BuildConstSymbolExpression }
@@ -1063,6 +1067,23 @@ Unit Rax86int;
           { Support ugly delphi constructs like: [ECX].1+2[EDX] }
           if (cseif_isref in in_flags) and (actasmtoken=AS_LBRACKET) then
             break;
+          if (cseif_referencelike in in_flags) and
+             (actasmtoken in [AS_LBRACKET,AS_RBRACKET]) then
+            case actasmtoken of
+              AS_LBRACKET:
+                begin
+                  Consume(AS_LBRACKET);
+                  if (length(expr)>0) and
+                     not (expr[length(expr)] in ['+','-']) then
+                    expr:=expr+'+';
+                  expr:=expr+'[';
+                end;
+              AS_RBRACKET:
+                begin
+                  Consume(AS_RBRACKET);
+                  expr:=expr+']';
+                end;
+            end;
           Case actasmtoken of
             AS_LPAREN:
               Begin
@@ -2760,7 +2781,7 @@ Unit Rax86int;
 {$endif i8086}
             AS_ID :
               Begin
-                BuildConstSymbolExpression([],value,asmsym,asmsymtyp,size,cse_out_flags);
+                BuildConstSymbolExpression([cseif_referencelike],value,asmsym,asmsymtyp,size,cse_out_flags);
                 if asmsym<>'' then
                  begin
                    if not (cseof_isseg in cse_out_flags) and

+ 29 - 0
tests/test/tasm27.pp

@@ -0,0 +1,29 @@
+{ %CPU=i8086 }
+
+{$IFDEF FPC}
+{$MODE TP}
+{$ENDIF}
+program tasm27;
+
+type
+  TRec = record
+    Str: String[8];
+    Arr: array [-5..10] of Integer;
+  end;
+
+var
+  Rec: TRec;
+
+procedure x; assembler;
+asm
+  dd Rec.Str                    { dd Rec.Str }
+  dd Rec.Str[0]                 { dd Rec.Str }
+  dd Rec.Arr                    { dd Rec.Arr }
+  dd Rec.Arr[2]                 { dd Rec.Arr+2 }
+  dd 5[7]                       { dd 12 }
+  dd 5+[7]                      { dd 12 }
+  dd 5-[7]                      { dd -2 }
+end;
+
+begin
+end.