Prechádzať zdrojové kódy

* updated for new layout

peter 26 rokov pred
rodič
commit
63158d246c
2 zmenil súbory, kde vykonal 532 pridanie a 341 odobranie
  1. 84 0
      compiler/utils/fixnasm.pp
  2. 448 341
      compiler/utils/nasmconv.pp

+ 84 - 0
compiler/utils/fixnasm.pp

@@ -0,0 +1,84 @@
+program fixnasm;
+
+{$ifndef FPC}
+  procedure readln(var t:text;var s:string);
+  var
+    c : char;
+    i : longint;
+  begin
+    c:=#0;
+    i:=0;
+    while (not eof(t)) and (c<>#10) do
+     begin
+       read(t,c);
+       if c<>#10 then
+        begin
+          inc(i);
+          s[i]:=c;
+        end;
+     end;
+    if (i>0) and (s[i]=#13) then
+     dec(i);
+    s[0]:=chr(i);
+  end;
+{$endif}
+
+const
+  spaces='                                                       ';
+var
+  t,f : text;
+  para,bytes,flags,
+  opcode,lastop,
+  s : string;
+  i,j : longint;
+begin
+  writeln('Fixing insns.dat -> insns.new');
+  assign(t,'insns.dat');
+  reset(t);
+  assign(f,'insns.new');
+  rewrite(f);
+  lastop:='';
+  while not eof(t) do
+   begin
+     readln(t,s);
+     if (s<>'') and (s[1]<>';') then
+      begin
+        i:=pos(' ',s);
+        j:=pos(',',s);
+        if (j>0) and (j<i) then
+         opcode:=Copy(s,1,j-1)
+        else
+         opcode:=Copy(s,1,i-1);
+        if opcode<>lastop then
+         begin
+           writeln(f,'');
+           writeln(f,'[',Copy(s,1,i-1),']');
+           lastop:=opcode;
+         end;
+        while (i<length(s)) and (s[i+1]=' ') do
+         inc(i);
+        Delete(s,1,i);
+        i:=pos(' ',s);
+        para:=Copy(s,1,i-1);
+        para:=para+Copy(spaces,1,22-length(para));
+        while (i<length(s)) and (s[i+1]=' ') do
+         inc(i);
+        Delete(s,1,i);
+        i:=pos(' ',s);
+        bytes:=Copy(s,1,i-1);
+        bytes:=bytes+Copy(spaces,1,32-length(bytes));
+        while (i<length(s)) and (s[i+1]=' ') do
+         inc(i);
+        Delete(s,1,i);
+        i:=pos(' ',s);
+        if i=0 then
+         i:=255;
+        flags:=Copy(s,1,i-1);
+        writeln(f,para,bytes,flags);
+      end
+     else
+      writeln(f,s);
+   end;
+  close(f);
+  close(t);
+end.

+ 448 - 341
compiler/utils/nasmconv.pp

@@ -1,342 +1,449 @@
-{
-    $Id$
-    Copyright (c) 1999 by Peter Vreman and Florian Klaempfl
-
-    Convert insns.dat from Nasm to a .inc file for usage with
-    the Free pascal compiler
-
-    See the file COPYING.FPC, included in this distribution,
-    for details about the copyright.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
- **********************************************************************}
-program nasmconv;
-
-var
-   infile,outfile : text;
-   s : string;
-   i : longint;
-
-{$ifndef FPC}
-  procedure readln(var t:text;var s:string);
-  var
-    c : char;
-    i : longint;
-  begin
-    c:=#0;
-    i:=0;
-    while (not eof(t)) and (c<>#10) do
-     begin
-       read(t,c);
-       if c<>#10 then
-        begin
-          inc(i);
-          s[i]:=c;
-        end;
-     end;
-    if (i>0) and (s[i]=#13) then
-     dec(i);
-    s[0]:=chr(i);
-  end;
-{$endif}
-
-      function Replace(var s:string;const s1,s2:string):boolean;
-      var
-        i  : longint;
-      begin
-        i:=pos(s1,s);
-        if i>0 then
-         begin
-           Delete(s,i,length(s1));
-           Insert(s2,s,i);
-           Replace:=true;
-         end
-        else
-         Replace:=false;
-      end;
-
-
-function formatop(s:string):string;
-   const
-     replaces=19;
-     replacetab : array[1..replaces,1..2] of string[32]=(
-       (':',' or ot_colon'),
-       ('mem8','mem or ot_bits8'),
-       ('mem16','mem or ot_bits16'),
-       ('mem32','mem or ot_bits32'),
-       ('mem64','mem or ot_bits64'),
-       ('mem80','mem or ot_bits80'),
-       ('mem','memory'),
-       ('memory_offs','mem_offs'),
-       ('imm8','imm or ot_bits8'),
-       ('imm16','imm or ot_bits16'),
-       ('imm32','imm or ot_bits32'),
-       ('imm64','imm or ot_bits64'),
-       ('imm80','imm or ot_bits80'),
-       ('imm','immediate'),
-       ('rm8','regmem or ot_bits8'),
-       ('rm16','regmem or ot_bits16'),
-       ('rm32','regmem or ot_bits32'),
-       ('rm64','regmem or ot_bits64'),
-       ('rm80','regmem or ot_bits80')
-     );
-  var
-    i : longint;
-  begin
-    for i:=1to replaces do
-     replace(s,replacetab[i,1],replacetab[i,2]);
-    formatop:=s;
-  end;
-
-
-procedure maybe_newline;
-
-  begin
-     if s[i]=#10 then
-       begin
-          readln(infile,s);
-          i:=1;
-       end;
-     while s[1]=';' do
-       begin
-          readln(infile,s);
-          i:=1;
-       end;
-  end;
-
-function readnumber : longint;
-
-  var
-     base : longint;
-     result : longint;
-
-  begin
-     result:=0;
-     if s[i]='\' then
-       begin
-          base:=8;
-          inc(i);
-          if s[i]='x' then
-            begin
-               base:=16;
-               inc(i);
-            end;
-       end
-     else
-       base:=10;
-     s[i]:=upcase(s[i]);
-     while s[i] in ['0'..'9','A'..'F'] do
-       begin
-          case s[i] of
-             '0'..'9':
-               result:=result*base+ord(s[i])-ord('0');
-
-             'A'..'F':
-               result:=result*base+ord(s[i])-ord('A')+10;
-          end;
-          inc(i);
-       end;
-     readnumber:=result;
-  end;
-
-function tostr(l : longint) : string;
-
-  var
-     hs : string;
-
-  begin
-     str(l,hs);
-     tostr:=hs;
-  end;
-
-function readstr : string;
-
-  var
-     result : string;
-
-  begin
-     result:='';
-     while (s[i] in ['0'..'9','A'..'Z','a'..'z','_']) and (i<=length(s)) do
-       begin
-          result:=result+s[i];
-          inc(i);
-       end;
-     readstr:=result;
-  end;
-
-procedure skipspace;
-
-  begin
-     while (s[i] in [' ',#9]) do
-       inc(i);
-  end;
-
-var
-   hs : string;
-   j : longint;
-   first : boolean;
-   maxinfolen,
-   code : byte;
-   insns : longint;
-   { instruction fields }
-   last,
-   ops    : longint;
-   opcode,
-   codes,
-   flags   : string;
-   optypes : array[1..3] of string;
-begin
-   writeln('Nasm Instruction Table Converter Version 0.99.13');
-   insns:=0;
-   maxinfolen:=0;
-   assign(infile,'insns.dat');
-   reset(infile);
-   assign(outfile,'i386tab.inc');
-   rewrite(outfile);
-   writeln(outfile,'(');
-   first:=true;
-   while not(eof(infile)) do
-     begin
-        { handle comment }
-        readln(infile,s);
-        while (s[1]=' ') do
-         delete(s,1,1);
-        if (s='') or (s[1]=';') then
-          continue;
-        { clear }
-        opcode:='';
-        ops:=0;
-        optypes[1]:='';
-        optypes[2]:='';
-        optypes[3]:='';
-        codes:='';
-        flags:='';
-        { opcode }
-        opcode:='A_';
-        i:=1;
-        while not(s[i] in [' ',#9]) do
-          begin
-            opcode:=opcode+s[i];
-            inc(i);
-          end;
-        skipspace;
-        { ops and optypes }
-        repeat
-          hs:=readstr;
-          if (hs='void') or (hs='ignore') then
-            break;
-          inc(ops);
-          optypes[ops]:=optypes[ops]+'ot_'+formatop(hs);
-          if s[i]=':' then
-            begin
-               inc(i);
-               optypes[ops]:=optypes[ops]+' or ot_'+formatop(readstr);
-            end;
-          while s[i]='|' do
-            begin
-               inc(i);
-               optypes[ops]:=optypes[ops]+' or ot_'+formatop(readstr);
-            end;
-          if s[i]=',' then
-            inc(i)
-          else
-            break;
-        until false;
-        for j:=1 to 3-ops do
-          optypes[3-j+1]:='ot_none';
-        { codes }
-        skipspace;
-        j:=0;
-        last:=0;
-        if s[i] in ['\','0'..'9'] then
-          begin
-             while not(s[i] in [' ',#9]) do
-               begin
-                 code:=readnumber;
-                 { for some codes we want also to change the optypes, but not
-                   if the last byte was a 1 then this byte belongs to a direct
-                   copy }
-                 if last<>1 then
-                  begin
-                    case code of
-                      12,13,14 :
-                        optypes[code-11]:=optypes[code-11]+' or ot_signed';
-                    end;
-                  end;
-                 codes:=codes+'#'+tostr(code);
-                 last:=code;
-                 inc(j);
-               end;
-          end
-        else
-          codes:='#0';
-        if j>maxinfolen then
-         maxinfolen:=j;
-        { flags }
-        skipspace;
-        while not(s[i] in [' ',#9,#13,#10]) and (i<=length(s)) do
-          begin
-             hs:=readstr;
-             if hs='ignore' then
-              begin
-                flags:='0';
-                break;
-              end;
-             if hs<>'ND' then
-              begin
-                if flags<>'' then
-                 flags:=flags+' or ';
-                flags:=flags+'if_'+hs;
-              end;
-             if (s[i]=',') and (i<=length(s)) then
-              inc(i)
-             else
-              break;
-          end;
-      { write instruction }
-        if not(first) then
-          writeln(outfile,',')
-        else
-          first:=false;
-        writeln(outfile,'  (');
-        writeln(outfile,'    opcode  : ',opcode,';');
-        writeln(outfile,'    ops     : ',ops,';');
-        writeln(outfile,'    optypes : (',optypes[1],',',optypes[2],',',optypes[3],');');
-        writeln(outfile,'    code    : ',codes,';');
-        writeln(outfile,'    flags   : ',flags);
-        write(outfile,'  )');
-        maybe_newline;
-        inc(insns);
-     end;
-   writeln(outfile);
-   writeln(outfile,');');
-   close(infile);
-   close(outfile);
-   writeln(insns,' nodes procesed (maxinfolen=',maxinfolen,')');
-end.
-{
+{
+    $Id$
+    Copyright (c) 1999 by Peter Vreman and Florian Klaempfl
+
+    Convert insns.dat from Nasm to a .inc file for usage with
+    the Free pascal compiler
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+program nasmconv;
+
+const
+  Version = '0.99.13';
+
+var
+   s : string;
+   i : longint;
+
+{$ifndef FPC}
+  procedure readln(var t:text;var s:string);
+  var
+    c : char;
+    i : longint;
+  begin
+    c:=#0;
+    i:=0;
+    while (not eof(t)) and (c<>#10) do
+     begin
+       read(t,c);
+       if c<>#10 then
+        begin
+          inc(i);
+          s[i]:=c;
+        end;
+     end;
+    if (i>0) and (s[i]=#13) then
+     dec(i);
+    s[0]:=chr(i);
+  end;
+{$endif}
+
+    function lower(const s : string) : string;
+    {
+      return lowercased string of s
+    }
+      var
+         i : longint;
+      begin
+         for i:=1 to length(s) do
+          if s[i] in ['A'..'Z'] then
+           lower[i]:=char(byte(s[i])+32)
+          else
+           lower[i]:=s[i];
+         lower[0]:=s[0];
+      end;
+
+      function Replace(var s:string;const s1,s2:string):boolean;
+      var
+        i  : longint;
+      begin
+        i:=pos(s1,s);
+        if i>0 then
+         begin
+           Delete(s,i,length(s1));
+           Insert(s2,s,i);
+           Replace:=true;
+         end
+        else
+         Replace:=false;
+      end;
+
+
+function formatop(s:string):string;
+   const
+     replaces=19;
+     replacetab : array[1..replaces,1..2] of string[32]=(
+       (':',' or ot_colon'),
+       ('mem8','mem or ot_bits8'),
+       ('mem16','mem or ot_bits16'),
+       ('mem32','mem or ot_bits32'),
+       ('mem64','mem or ot_bits64'),
+       ('mem80','mem or ot_bits80'),
+       ('mem','memory'),
+       ('memory_offs','mem_offs'),
+       ('imm8','imm or ot_bits8'),
+       ('imm16','imm or ot_bits16'),
+       ('imm32','imm or ot_bits32'),
+       ('imm64','imm or ot_bits64'),
+       ('imm80','imm or ot_bits80'),
+       ('imm','immediate'),
+       ('rm8','regmem or ot_bits8'),
+       ('rm16','regmem or ot_bits16'),
+       ('rm32','regmem or ot_bits32'),
+       ('rm64','regmem or ot_bits64'),
+       ('rm80','regmem or ot_bits80')
+     );
+  var
+    i : longint;
+  begin
+    for i:=1to replaces do
+     replace(s,replacetab[i,1],replacetab[i,2]);
+    formatop:=s;
+  end;
+
+
+function readnumber : longint;
+
+  var
+     base : longint;
+     result : longint;
+
+  begin
+     result:=0;
+     if s[i]='\' then
+       begin
+          base:=8;
+          inc(i);
+          if s[i]='x' then
+            begin
+               base:=16;
+               inc(i);
+            end;
+       end
+     else
+       base:=10;
+     s[i]:=upcase(s[i]);
+     while s[i] in ['0'..'9','A'..'F'] do
+       begin
+          case s[i] of
+             '0'..'9':
+               result:=result*base+ord(s[i])-ord('0');
+
+             'A'..'F':
+               result:=result*base+ord(s[i])-ord('A')+10;
+          end;
+          inc(i);
+       end;
+     readnumber:=result;
+  end;
+
+function tostr(l : longint) : string;
+
+  var
+     hs : string;
+
+  begin
+     str(l,hs);
+     tostr:=hs;
+  end;
+
+function readstr : string;
+
+  var
+     result : string;
+
+  begin
+     result:='';
+     while (s[i] in ['0'..'9','A'..'Z','a'..'z','_']) and (i<=length(s)) do
+       begin
+          result:=result+s[i];
+          inc(i);
+       end;
+     readstr:=result;
+  end;
+
+procedure skipspace;
+
+  begin
+     while (s[i] in [' ',#9]) do
+       inc(i);
+  end;
+
+var
+   hs : string;
+   j : longint;
+   firstopcode,attsuffix,
+   first : boolean;
+   maxinfolen,
+   code : byte;
+   insns : longint;
+   attsuffile,propfile,opfile,attfile,intfile,
+   infile,insfile : text;
+   { instruction fields }
+   last,
+   ops    : longint;
+   intopcode,
+   attopcode,
+   opcode,
+   codes,
+   flags   : string;
+   optypes : array[1..3] of string;
+begin
+   writeln('Nasm Instruction Table Converter Version ',Version);
+   insns:=0;
+   maxinfolen:=0;
+   assign(infile,'insns.dat');
+   reset(infile);
+   assign(insfile,'i386tab.inc');
+   rewrite(insfile);
+   writeln(insfile,'{ don''t edit, this file is generated from insns.dat }');
+   writeln(insfile,'(');
+   assign(opfile,'i386op.inc');
+   rewrite(opfile);
+   writeln(opfile,'{ don''t edit, this file is generated from insns.dat }');
+   writeln(opfile,'(');
+   assign(attfile,'i386att.inc');
+   rewrite(attfile);
+   writeln(attfile,'{ don''t edit, this file is generated from insns.dat }');
+   writeln(attfile,'(');
+   assign(attsuffile,'i386atts.inc');
+   rewrite(attsuffile);
+   writeln(attsuffile,'{ don''t edit, this file is generated from insns.dat }');
+   writeln(attsuffile,'(');
+   assign(intfile,'i386int.inc');
+   rewrite(intfile);
+   writeln(intfile,'{ don''t edit, this file is generated from insns.dat }');
+   writeln(intfile,'(');
+   assign(propfile,'i386prop.inc');
+   rewrite(propfile);
+   writeln(propfile,'{ don''t edit, this file is generated from insns.dat }');
+   writeln(propfile,'(');
+   first:=true;
+   opcode:='';
+   firstopcode:=true;
+   while not(eof(infile)) do
+     begin
+        { handle comment }
+        readln(infile,s);
+        while (s[1]=' ') do
+         delete(s,1,1);
+        if (s='') or (s[1]=';') then
+          continue;
+        if (s[1]='[') then
+         begin
+           i:=pos(',',s);
+           j:=pos(']',s);
+           if i=0 then
+            begin
+              opcode:='A_'+Copy(s,2,j-2);
+              intopcode:=Copy(s,2,j-2);
+              { Conditional }
+              if (intopcode[length(intopcode)]='c') and
+                 (intopcode[length(intopcode)-1]='c') then
+                dec(byte(intopcode[0]),2);
+              attopcode:=intopcode;
+              attsuffix:=false;
+            end
+           else
+            begin
+              opcode:='A_'+Copy(s,2,i-2);
+              intopcode:=Copy(s,2,i-2);
+              { intel conditional }
+              if (intopcode[length(intopcode)]='c') and
+                 (intopcode[length(intopcode)-1]='c') then
+                dec(byte(intopcode[0]),2);
+              attopcode:=Copy(s,i+1,j-i-1);
+              { att Suffix }
+              if attopcode[length(attopcode)]='X' then
+               begin
+                 dec(attopcode[0]);
+                 attsuffix:=true;
+               end
+              else
+               attsuffix:=false;
+              { att Conditional }
+              if (attopcode[length(attopcode)]='C') and
+                 (attopcode[length(attopcode)-1]='C') then
+                dec(byte(attopcode[0]),2);
+            end;
+           intopcode:=Lower(intopcode);
+           attopcode:=Lower(attopcode);
+           if firstopcode then
+            firstopcode:=false
+           else
+            begin
+              writeln(opfile,',');
+              writeln(attfile,',');
+              writeln(attsuffile,',');
+              writeln(intfile,',');
+              writeln(propfile,',');
+            end;
+           write(opfile,opcode);
+           write(intfile,'''',intopcode,'''');
+           write(attfile,'''',attopcode,'''');
+           if attsuffix then
+            write(attsuffile,'true')
+           else
+            write(attsuffile,'false');
+           { read the next line which contains the Change options }
+           repeat
+             readln(infile,s);
+           until eof(infile) or ((s<>'') and (s[1]<>';'));
+           write(propfile,'(Ch: ',s,')');
+           continue;
+         end;
+        { we must have an opcode }
+        if opcode='' then
+         runerror(234);
+        { clear }
+        ops:=0;
+        optypes[1]:='';
+        optypes[2]:='';
+        optypes[3]:='';
+        codes:='';
+        flags:='';
+        { ops and optypes }
+        i:=1;
+        repeat
+          hs:=readstr;
+          if (hs='void') or (hs='ignore') then
+            break;
+          inc(ops);
+          optypes[ops]:=optypes[ops]+'ot_'+formatop(hs);
+          if s[i]=':' then
+            begin
+               inc(i);
+               optypes[ops]:=optypes[ops]+' or ot_'+formatop(readstr);
+            end;
+          while s[i]='|' do
+            begin
+               inc(i);
+               optypes[ops]:=optypes[ops]+' or ot_'+formatop(readstr);
+            end;
+          if s[i]=',' then
+            inc(i)
+          else
+            break;
+        until false;
+        for j:=1 to 3-ops do
+          optypes[3-j+1]:='ot_none';
+        { codes }
+        skipspace;
+        j:=0;
+        last:=0;
+        if s[i] in ['\','0'..'9'] then
+          begin
+             while not(s[i] in [' ',#9]) do
+               begin
+                 code:=readnumber;
+                 { for some codes we want also to change the optypes, but not
+                   if the last byte was a 1 then this byte belongs to a direct
+                   copy }
+                 if last<>1 then
+                  begin
+                    case code of
+                      12,13,14 :
+                        optypes[code-11]:=optypes[code-11]+' or ot_signed';
+                    end;
+                  end;
+                 codes:=codes+'#'+tostr(code);
+                 last:=code;
+                 inc(j);
+               end;
+          end
+        else
+          begin
+            readstr;
+            codes:='#0';
+          end;
+        if j>maxinfolen then
+         maxinfolen:=j;
+        { flags }
+        skipspace;
+        while not(s[i] in [' ',#9,#13,#10]) and (i<=length(s)) do
+          begin
+             hs:=readstr;
+             if hs='ignore' then
+              begin
+                flags:='0';
+                break;
+              end;
+             if hs<>'ND' then
+              begin
+                if flags<>'' then
+                 flags:=flags+' or ';
+                flags:=flags+'if_'+lower(hs);
+              end;
+             if (s[i]=',') and (i<=length(s)) then
+              inc(i)
+             else
+              break;
+          end;
+      { write instruction }
+        if not(first) then
+          writeln(insfile,',')
+        else
+          first:=false;
+        writeln(insfile,'  (');
+        writeln(insfile,'    opcode  : ',opcode,';');
+        writeln(insfile,'    ops     : ',ops,';');
+        writeln(insfile,'    optypes : (',optypes[1],',',optypes[2],',',optypes[3],');');
+        writeln(insfile,'    code    : ',codes,';');
+        writeln(insfile,'    flags   : ',flags);
+        write(insfile,'  )');
+        inc(insns);
+     end;
+   writeln(insfile);
+   writeln(insfile,');');
+   writeln(attfile);
+   writeln(attfile,');');
+   writeln(attsuffile);
+   writeln(attsuffile,');');
+   writeln(intfile);
+   writeln(intfile,');');
+   writeln(opfile);
+   writeln(opfile,');');
+   writeln(propfile);
+   writeln(propfile,');');
+   close(infile);
+   close(insfile);
+   close(intfile);
+   close(attfile);
+   close(attsuffile);
+   close(opfile);
+   close(propfile);
+   writeln(insns,' nodes procesed (maxinfolen=',maxinfolen,')');
+end.
+{
   $Log$
-  Revision 1.3  1999-08-12 14:36:09  peter
-    + KNI instructions
-
-  Revision 1.2  1999/05/23 18:42:24  florian
-    * better error recovering in typed constants
-    * some problems with arrays of const fixed, some problems
-      due my previous
-       - the location type of array constructor is now LOC_MEM
-       - the pushing of high fixed
-       - parameter copying fixed
-       - zero temp. allocation removed
-    * small problem in the assembler writers fixed:
-      ref to nil wasn't written correctly
-
-  Revision 1.1  1999/05/12 16:17:10  peter
-    * init
-
-  Revision 1.1  1999/05/12 16:08:27  peter
-    + moved compiler utils
-
-}
+  Revision 1.4  1999-10-27 16:06:52  peter
+    * updated for new layout
+
+  Revision 1.3  1999/08/12 14:36:09  peter
+    + KNI instructions
+
+  Revision 1.2  1999/05/23 18:42:24  florian
+    * better error recovering in typed constants
+    * some problems with arrays of const fixed, some problems
+      due my previous
+       - the location type of array constructor is now LOC_MEM
+       - the pushing of high fixed
+       - parameter copying fixed
+       - zero temp. allocation removed
+    * small problem in the assembler writers fixed:
+      ref to nil wasn't written correctly
+
+  Revision 1.1  1999/05/12 16:17:10  peter
+    * init
+
+  Revision 1.1  1999/05/12 16:08:27  peter
+    + moved compiler utils
+
+}