mkspreg.pp 6.8 KB

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