mkspreg.pp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  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. names,regtypes,numbers,stdnames,stabs:
  21. array[0..max_regcount-1] of string[63];
  22. regnumber_index,std_regname_index:array[0..max_regcount-1] of byte;
  23. {$ifndef FPC}
  24. procedure readln(var t:text;var s:string);
  25. var
  26. c : char;
  27. i : longint;
  28. begin
  29. c:=#0;
  30. i:=0;
  31. while (not eof(t)) and (c<>#10) do
  32. begin
  33. read(t,c);
  34. if c<>#10 then
  35. begin
  36. inc(i);
  37. s[i]:=c;
  38. end;
  39. end;
  40. if (i>0) and (s[i]=#13) then
  41. dec(i);
  42. s[0]:=chr(i);
  43. end;
  44. {$endif}
  45. function tostr(l : longint) : string;
  46. begin
  47. str(l,tostr);
  48. end;
  49. function readstr : string;
  50. var
  51. result : string;
  52. begin
  53. result:='';
  54. while (s[i]<>',') and (i<=length(s)) do
  55. begin
  56. result:=result+s[i];
  57. inc(i);
  58. end;
  59. readstr:=result;
  60. end;
  61. procedure readcomma;
  62. begin
  63. if s[i]<>',' then
  64. begin
  65. writeln('Missing "," at line ',line);
  66. writeln('Line: "',s,'"');
  67. halt(1);
  68. end;
  69. inc(i);
  70. end;
  71. procedure skipspace;
  72. begin
  73. while (s[i] in [' ',#9]) do
  74. inc(i);
  75. end;
  76. procedure openinc(var f:text;const fn:string);
  77. begin
  78. writeln('creating ',fn);
  79. assign(f,fn);
  80. rewrite(f);
  81. writeln(f,'{ don''t edit, this file is generated from spreg.dat }');
  82. end;
  83. procedure closeinc(var f:text);
  84. begin
  85. writeln(f);
  86. close(f);
  87. end;
  88. procedure build_regnum_index;
  89. var h,i,j,p,t:byte;
  90. begin
  91. {Build the registernumber2regindex index.
  92. Step 1: Fill.}
  93. for i:=0 to regcount-1 do
  94. regnumber_index[i]:=i;
  95. {Step 2: Sort. We use a Shell-Metzner sort.}
  96. p:=regcount_bsstart;
  97. repeat
  98. for h:=0 to regcount-p-1 do
  99. begin
  100. i:=h;
  101. repeat
  102. j:=i+p;
  103. if numbers[regnumber_index[j]]>=numbers[regnumber_index[i]] then
  104. break;
  105. t:=regnumber_index[i];
  106. regnumber_index[i]:=regnumber_index[j];
  107. regnumber_index[j]:=t;
  108. if i<p then
  109. break;
  110. dec(i,p);
  111. until false;
  112. end;
  113. p:=p shr 1;
  114. until p=0;
  115. end;
  116. procedure build_std_regname_index;
  117. var h,i,j,p,t:byte;
  118. begin
  119. {Build the registernumber2regindex index.
  120. Step 1: Fill.}
  121. for i:=0 to regcount-1 do
  122. std_regname_index[i]:=i;
  123. {Step 2: Sort. We use a Shell-Metzner sort.}
  124. p:=regcount_bsstart;
  125. repeat
  126. for h:=0 to regcount-p-1 do
  127. begin
  128. i:=h;
  129. repeat
  130. j:=i+p;
  131. if stdnames[std_regname_index[j]]>=stdnames[std_regname_index[i]] then
  132. break;
  133. t:=std_regname_index[i];
  134. std_regname_index[i]:=std_regname_index[j];
  135. std_regname_index[j]:=t;
  136. if i<p then
  137. break;
  138. dec(i,p);
  139. until false;
  140. end;
  141. p:=p shr 1;
  142. until p=0;
  143. end;
  144. procedure read_spreg_file;
  145. var infile:text;
  146. begin
  147. { open dat file }
  148. assign(infile,'spreg.dat');
  149. reset(infile);
  150. while not(eof(infile)) do
  151. begin
  152. { handle comment }
  153. readln(infile,s);
  154. inc(line);
  155. while (s[1]=' ') do
  156. delete(s,1,1);
  157. if (s='') or (s[1]=';') then
  158. continue;
  159. i:=1;
  160. names[regcount]:=readstr;
  161. readcomma;
  162. regtypes[regcount]:=readstr;
  163. readcomma;
  164. numbers[regcount]:=readstr;
  165. if numbers[regcount][1]<>'$' then
  166. begin
  167. writeln('Missing $ before number, at line ',line);
  168. writeln('Line: "',s,'"');
  169. halt(1);
  170. end;
  171. readcomma;
  172. stdnames[regcount]:=readstr;
  173. readcomma;
  174. stabs[regcount]:=readstr;
  175. if i<length(s) then
  176. begin
  177. writeln('Extra chars at end of line, at line ',line);
  178. writeln('Line: "',s,'"');
  179. halt(1);
  180. end;
  181. inc(regcount);
  182. if regcount>max_regcount then
  183. begin
  184. writeln('Error: Too much registers, please increase maxregcount in source');
  185. halt(2);
  186. end;
  187. end;
  188. close(infile);
  189. end;
  190. procedure write_inc_files;
  191. var
  192. norfile,stdfile,supfile,
  193. numfile,stabfile,confile,
  194. rnifile,srifile:text;
  195. first:boolean;
  196. begin
  197. { create inc files }
  198. openinc(confile,'rspcon.inc');
  199. openinc(supfile,'rspsup.inc');
  200. openinc(numfile,'rspnum.inc');
  201. openinc(stdfile,'rspstd.inc');
  202. openinc(stabfile,'rspstab.inc');
  203. openinc(norfile,'rspnor.inc');
  204. openinc(rnifile,'rsprni.inc');
  205. openinc(srifile,'rspsri.inc');
  206. first:=true;
  207. for i:=0 to regcount-1 do
  208. begin
  209. if not first then
  210. begin
  211. writeln(numfile,',');
  212. writeln(stdfile,',');
  213. writeln(stabfile,',');
  214. writeln(rnifile,',');
  215. writeln(srifile,',');
  216. end
  217. else
  218. first:=false;
  219. writeln(confile,'NR_',names[i],' = ',regtypes[i],'0000',copy(numbers[i],2,255),';');
  220. writeln(supfile,'RS_',names[i],' = ',numbers[i],';');
  221. write(numfile,'NR_',names[i]);
  222. write(stdfile,'''',stdnames[i],'''');
  223. write(stabfile,stabs[i]);
  224. write(rnifile,regnumber_index[i]);
  225. write(srifile,std_regname_index[i]);
  226. end;
  227. write(norfile,regcount);
  228. close(confile);
  229. close(supfile);
  230. closeinc(numfile);
  231. closeinc(stdfile);
  232. closeinc(stabfile);
  233. closeinc(norfile);
  234. closeinc(rnifile);
  235. closeinc(srifile);
  236. writeln('Done!');
  237. writeln(regcount,' registers procesed');
  238. end;
  239. begin
  240. writeln('Register Table Converter Version ',Version);
  241. line:=0;
  242. regcount:=0;
  243. read_spreg_file;
  244. regcount_bsstart:=1;
  245. while 2*regcount_bsstart<regcount do
  246. regcount_bsstart:=regcount_bsstart*2;
  247. build_regnum_index;
  248. build_std_regname_index;
  249. write_inc_files;
  250. end.
  251. {
  252. $Log$
  253. Revision 1.3 2003-09-03 16:28:16 peter
  254. * also generate superregisters
  255. Revision 1.2 2003/09/03 15:55:02 peter
  256. * NEWRA branch merged
  257. Revision 1.1.2.1 2003/08/31 21:08:16 peter
  258. * first batch of sparc fixes
  259. }