fpc/compiler/nasmconv.pas
peter 611da2d24e * merged nasm compiler
* old asm moved to oldasm/
1999-05-01 13:23:57 +00:00

280 lines
6.3 KiB
ObjectPascal

program nasmconv;
var
infile,outfile : text;
s : string;
i : longint;
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.11');
insns:=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);
if 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.