mkspreg.pp 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. {
  2. $Id$
  3. Copyright (c) 1998-2002 by Peter Vreman and Florian Klaempfl
  4. Convert spreg.dat to several .inc files for usage with
  5. the Free pascal compiler
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. program mkspreg;
  13. const Version = '1.00';
  14. max_regcount = 200;
  15. var s : string;
  16. i : longint;
  17. line : longint;
  18. regcount:byte;
  19. regcount_bsstart:byte;
  20. supregs,
  21. subregs,
  22. names,
  23. regtypes,
  24. numbers,
  25. stdnames,
  26. stabs,
  27. dwarfs : array[0..max_regcount-1] of string[63];
  28. regnumber_index,
  29. std_regname_index : array[0..max_regcount-1] of byte;
  30. {$ifndef FPC}
  31. procedure readln(var t:text;var s:string);
  32. var
  33. c : char;
  34. i : longint;
  35. begin
  36. c:=#0;
  37. i:=0;
  38. while (not eof(t)) and (c<>#10) do
  39. begin
  40. read(t,c);
  41. if c<>#10 then
  42. begin
  43. inc(i);
  44. s[i]:=c;
  45. end;
  46. end;
  47. if (i>0) and (s[i]=#13) then
  48. dec(i);
  49. s[0]:=chr(i);
  50. end;
  51. {$endif}
  52. function tostr(l : longint) : string;
  53. begin
  54. str(l,tostr);
  55. end;
  56. function readstr : string;
  57. var
  58. result : string;
  59. begin
  60. result:='';
  61. while (s[i]<>',') and (i<=length(s)) do
  62. begin
  63. result:=result+s[i];
  64. inc(i);
  65. end;
  66. readstr:=result;
  67. end;
  68. procedure readcomma;
  69. begin
  70. if s[i]<>',' then
  71. begin
  72. writeln('Missing "," at line ',line);
  73. writeln('Line: "',s,'"');
  74. halt(1);
  75. end;
  76. inc(i);
  77. end;
  78. procedure skipspace;
  79. begin
  80. while (s[i] in [' ',#9]) do
  81. inc(i);
  82. end;
  83. procedure openinc(var f:text;const fn:string);
  84. begin
  85. writeln('creating ',fn);
  86. assign(f,fn);
  87. rewrite(f);
  88. writeln(f,'{ don''t edit, this file is generated from spreg.dat }');
  89. end;
  90. procedure closeinc(var f:text);
  91. begin
  92. writeln(f);
  93. close(f);
  94. end;
  95. procedure build_regnum_index;
  96. var h,i,j,p,t:byte;
  97. begin
  98. {Build the registernumber2regindex index.
  99. Step 1: Fill.}
  100. for i:=0 to regcount-1 do
  101. regnumber_index[i]:=i;
  102. {Step 2: Sort. We use a Shell-Metzner sort.}
  103. p:=regcount_bsstart;
  104. repeat
  105. for h:=0 to regcount-p-1 do
  106. begin
  107. i:=h;
  108. repeat
  109. j:=i+p;
  110. if numbers[regnumber_index[j]]>=numbers[regnumber_index[i]] then
  111. break;
  112. t:=regnumber_index[i];
  113. regnumber_index[i]:=regnumber_index[j];
  114. regnumber_index[j]:=t;
  115. if i<p then
  116. break;
  117. dec(i,p);
  118. until false;
  119. end;
  120. p:=p shr 1;
  121. until p=0;
  122. end;
  123. procedure build_std_regname_index;
  124. var h,i,j,p,t:byte;
  125. begin
  126. {Build the registernumber2regindex index.
  127. Step 1: Fill.}
  128. for i:=0 to regcount-1 do
  129. std_regname_index[i]:=i;
  130. {Step 2: Sort. We use a Shell-Metzner sort.}
  131. p:=regcount_bsstart;
  132. repeat
  133. for h:=0 to regcount-p-1 do
  134. begin
  135. i:=h;
  136. repeat
  137. j:=i+p;
  138. if stdnames[std_regname_index[j]]>=stdnames[std_regname_index[i]] then
  139. break;
  140. t:=std_regname_index[i];
  141. std_regname_index[i]:=std_regname_index[j];
  142. std_regname_index[j]:=t;
  143. if i<p then
  144. break;
  145. dec(i,p);
  146. until false;
  147. end;
  148. p:=p shr 1;
  149. until p=0;
  150. end;
  151. procedure read_spreg_file;
  152. var
  153. infile:text;
  154. begin
  155. { open dat file }
  156. assign(infile,'spreg.dat');
  157. reset(infile);
  158. while not(eof(infile)) do
  159. begin
  160. { handle comment }
  161. readln(infile,s);
  162. inc(line);
  163. while (s[1]=' ') do
  164. delete(s,1,1);
  165. if (s='') or (s[1]=';') then
  166. continue;
  167. i:=1;
  168. names[regcount]:=readstr;
  169. readcomma;
  170. regtypes[regcount]:=readstr;
  171. readcomma;
  172. subregs[regcount]:=readstr;
  173. readcomma;
  174. supregs[regcount]:=readstr;
  175. readcomma;
  176. stdnames[regcount]:=readstr;
  177. readcomma;
  178. stabs[regcount]:=readstr;
  179. readcomma;
  180. dwarfs[regcount]:=readstr;
  181. { Create register number }
  182. if supregs[regcount][1]<>'$' then
  183. begin
  184. writeln('Missing $ before number, at line ',line);
  185. writeln('Line: "',s,'"');
  186. halt(1);
  187. end;
  188. numbers[regcount]:=regtypes[regcount]+copy(subregs[regcount],2,255)+'00'+copy(supregs[regcount],2,255);
  189. if i<length(s) then
  190. begin
  191. writeln('Extra chars at end of line, at line ',line);
  192. writeln('Line: "',s,'"');
  193. halt(1);
  194. end;
  195. inc(regcount);
  196. if regcount>max_regcount then
  197. begin
  198. writeln('Error: Too much registers, please increase maxregcount in source');
  199. halt(2);
  200. end;
  201. end;
  202. close(infile);
  203. end;
  204. procedure write_inc_files;
  205. var
  206. norfile,stdfile,supfile,
  207. numfile,stabfile,dwarffile,confile,
  208. rnifile,srifile:text;
  209. first:boolean;
  210. begin
  211. { create inc files }
  212. openinc(confile,'rspcon.inc');
  213. openinc(supfile,'rspsup.inc');
  214. openinc(numfile,'rspnum.inc');
  215. openinc(stdfile,'rspstd.inc');
  216. openinc(stabfile,'rspstab.inc');
  217. openinc(dwarffile,'rspdwrf.inc');
  218. openinc(norfile,'rspnor.inc');
  219. openinc(rnifile,'rsprni.inc');
  220. openinc(srifile,'rspsri.inc');
  221. first:=true;
  222. for i:=0 to regcount-1 do
  223. begin
  224. if not first then
  225. begin
  226. writeln(numfile,',');
  227. writeln(stdfile,',');
  228. writeln(stabfile,',');
  229. writeln(dwarffile,',');
  230. writeln(rnifile,',');
  231. writeln(srifile,',');
  232. end
  233. else
  234. first:=false;
  235. writeln(confile,'NR_',names[i],' = tregister(',numbers[i],');');
  236. writeln(supfile,'RS_',names[i],' = ',supregs[i],';');
  237. write(numfile,'NR_',names[i]);
  238. write(stdfile,'''',stdnames[i],'''');
  239. write(stabfile,stabs[i]);
  240. write(dwarffile,dwarfs[i]);
  241. write(rnifile,regnumber_index[i]);
  242. write(srifile,std_regname_index[i]);
  243. end;
  244. write(norfile,regcount);
  245. close(confile);
  246. close(supfile);
  247. closeinc(numfile);
  248. closeinc(stdfile);
  249. closeinc(stabfile);
  250. closeinc(dwarffile);
  251. closeinc(norfile);
  252. closeinc(rnifile);
  253. closeinc(srifile);
  254. writeln('Done!');
  255. writeln(regcount,' registers procesed');
  256. end;
  257. begin
  258. writeln('Register Table Converter Version ',Version);
  259. line:=0;
  260. regcount:=0;
  261. read_spreg_file;
  262. regcount_bsstart:=1;
  263. while 2*regcount_bsstart<regcount do
  264. regcount_bsstart:=regcount_bsstart*2;
  265. build_regnum_index;
  266. build_std_regname_index;
  267. write_inc_files;
  268. end.
  269. {
  270. $Log$
  271. Revision 1.7 2005-02-14 17:13:10 peter
  272. * truncate log
  273. }