123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272 |
- {
- Copyright (c) 1998-2002 by Peter Vreman and Florian Klaempfl
- Convert ia64reg.dat to several .inc files 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.
- **********************************************************************}
- {$mode objfpc}
- program mkia64reg;
- const Version = '1.00';
- max_regcount = 256;
- var s : string;
- i : longint;
- line : longint;
- regcount:byte;
- regcount_bsstart:byte;
- names,
- regtypes,
- supregs,
- numbers,
- stdnames,
- stabs,dwarf : array[0..max_regcount-1] of string[63];
- regnumber_index,
- std_regname_index : array[0..max_regcount-1] of byte;
- function tostr(l : longint) : string;
- begin
- str(l,tostr);
- end;
- function readstr : string;
- begin
- result:='';
- while (s[i]<>',') and (i<=length(s)) do
- begin
- result:=result+s[i];
- inc(i);
- end;
- end;
- procedure readcomma;
- begin
- if s[i]<>',' then
- begin
- writeln('Missing "," at line ',line);
- writeln('Line: "',s,'"');
- halt(1);
- end;
- inc(i);
- end;
- procedure skipspace;
- begin
- while (s[i] in [' ',#9]) do
- inc(i);
- end;
- procedure openinc(out f:text;const fn:string);
- begin
- writeln('creating ',fn);
- assign(f,fn);
- rewrite(f);
- writeln(f,'{ don''t edit, this file is generated from ia64reg.dat }');
- end;
- procedure closeinc(var f:text);
- begin
- writeln(f);
- close(f);
- end;
- procedure build_regnum_index;
- var h,i,j,p,t:byte;
- begin
- {Build the registernumber2regindex index.
- Step 1: Fill.}
- for i:=0 to regcount-1 do
- regnumber_index[i]:=i;
- {Step 2: Sort. We use a Shell-Metzner sort.}
- p:=regcount_bsstart;
- repeat
- for h:=0 to regcount-p-1 do
- begin
- i:=h;
- repeat
- j:=i+p;
- if numbers[regnumber_index[j]]>=numbers[regnumber_index[i]] then
- break;
- t:=regnumber_index[i];
- regnumber_index[i]:=regnumber_index[j];
- regnumber_index[j]:=t;
- if i<p then
- break;
- dec(i,p);
- until false;
- end;
- p:=p shr 1;
- until p=0;
- end;
- procedure build_std_regname_index;
- var h,i,j,p,t:byte;
- begin
- {Build the registernumber2regindex index.
- Step 1: Fill.}
- for i:=0 to regcount-1 do
- std_regname_index[i]:=i;
- {Step 2: Sort. We use a Shell-Metzner sort.}
- p:=regcount_bsstart;
- repeat
- for h:=0 to regcount-p-1 do
- begin
- i:=h;
- repeat
- j:=i+p;
- if stdnames[std_regname_index[j]]>=stdnames[std_regname_index[i]] then
- break;
- t:=std_regname_index[i];
- std_regname_index[i]:=std_regname_index[j];
- std_regname_index[j]:=t;
- if i<p then
- break;
- dec(i,p);
- until false;
- end;
- p:=p shr 1;
- until p=0;
- end;
- procedure read_spreg_file;
- var infile:text;
- begin
- { open dat file }
- assign(infile,'ia64reg.dat');
- reset(infile);
- while not(eof(infile)) do
- begin
- { handle comment }
- readln(infile,s);
- inc(line);
- while (s[1]=' ') do
- delete(s,1,1);
- if (s='') or (s[1]=';') then
- continue;
- i:=1;
- names[regcount]:=readstr;
- readcomma;
- regtypes[regcount]:=readstr;
- readcomma;
- supregs[regcount]:=readstr;
- readcomma;
- stdnames[regcount]:=readstr;
- readcomma;
- stabs[regcount]:=readstr;
- readcomma;
- dwarf[regcount]:=readstr;
- { Create register number }
- if supregs[regcount][1]<>'$' then
- begin
- writeln('Missing $ before number, at line ',line);
- writeln('Line: "',s,'"');
- halt(1);
- end;
- numbers[regcount]:=regtypes[regcount]+'0000'+copy(supregs[regcount],2,255);
- if i<length(s) then
- begin
- writeln('Extra chars at end of line, at line ',line);
- writeln('Line: "',s,'"');
- halt(1);
- end;
- inc(regcount);
- if regcount>max_regcount then
- begin
- writeln('Error: Too much registers, please increase maxregcount in source');
- halt(2);
- end;
- end;
- close(infile);
- end;
- procedure write_inc_files;
- var
- norfile,stdfile,supfile,
- numfile,stabfile,dwarffile,confile,
- rnifile,srifile:text;
- first:boolean;
- begin
- { create inc files }
- openinc(confile,'ria64con.inc');
- openinc(supfile,'ria64sup.inc');
- openinc(numfile,'ria64num.inc');
- openinc(stdfile,'ria64std.inc');
- openinc(stabfile,'ria64sta.inc');
- openinc(dwarffile,'ria64dwa.inc');
- openinc(norfile,'ria64nor.inc');
- openinc(rnifile,'ria64rni.inc');
- openinc(srifile,'ria64sri.inc');
- first:=true;
- for i:=0 to regcount-1 do
- begin
- if not first then
- begin
- writeln(numfile,',');
- writeln(stdfile,',');
- writeln(stabfile,',');
- writeln(dwarffile,',');
- writeln(rnifile,',');
- writeln(srifile,',');
- end
- else
- first:=false;
- writeln(supfile,'RS_',names[i],' = ',supregs[i],';');
- writeln(confile,'NR_'+names[i],' = ','tregister(',numbers[i],')',';');
- write(numfile,'tregister(',numbers[i],')');
- write(stdfile,'''',stdnames[i],'''');
- write(stabfile,stabs[i]);
- write(dwarffile,dwarf[i]);
- write(rnifile,regnumber_index[i]);
- write(srifile,std_regname_index[i]);
- end;
- write(norfile,regcount);
- close(confile);
- close(supfile);
- closeinc(numfile);
- closeinc(stdfile);
- closeinc(stabfile);
- closeinc(dwarffile);
- closeinc(norfile);
- closeinc(rnifile);
- closeinc(srifile);
- writeln('Done!');
- writeln(regcount,' registers processed');
- end;
- begin
- writeln('Register Table Converter Version ',Version);
- line:=0;
- regcount:=0;
- read_spreg_file;
- regcount_bsstart:=1;
- while 2*regcount_bsstart<regcount do
- regcount_bsstart:=regcount_bsstart*2;
- build_regnum_index;
- build_std_regname_index;
- write_inc_files;
- end.
|