mkspreg.pp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. {
  2. Copyright (c) 1998-2002 by Peter Vreman and Florian Klaempfl
  3. Convert spreg.dat to several .inc files for usage with
  4. the Free pascal compiler
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. program mkspreg;
  12. const Version = '1.00';
  13. max_regcount = 200;
  14. var s : string;
  15. i : longint;
  16. line : longint;
  17. regcount:byte;
  18. regcount_bsstart:byte;
  19. supregs,
  20. subregs,
  21. names,
  22. regtypes,
  23. numbers,
  24. stdnames,
  25. stabs,
  26. dwarfs : 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. readcomma;
  179. dwarfs[regcount]:=readstr;
  180. { Create register number }
  181. if supregs[regcount][1]<>'$' then
  182. begin
  183. writeln('Missing $ before number, at line ',line);
  184. writeln('Line: "',s,'"');
  185. halt(1);
  186. end;
  187. numbers[regcount]:=regtypes[regcount]+copy(subregs[regcount],2,255)+'00'+copy(supregs[regcount],2,255);
  188. if i<length(s) then
  189. begin
  190. writeln('Extra chars at end of line, at line ',line);
  191. writeln('Line: "',s,'"');
  192. halt(1);
  193. end;
  194. inc(regcount);
  195. if regcount>max_regcount then
  196. begin
  197. writeln('Error: Too much registers, please increase maxregcount in source');
  198. halt(2);
  199. end;
  200. end;
  201. close(infile);
  202. end;
  203. procedure write_inc_files;
  204. var
  205. norfile,stdfile,supfile,
  206. numfile,stabfile,dwarffile,confile,
  207. rnifile,srifile:text;
  208. first:boolean;
  209. begin
  210. { create inc files }
  211. openinc(confile,'rspcon.inc');
  212. openinc(supfile,'rspsup.inc');
  213. openinc(numfile,'rspnum.inc');
  214. openinc(stdfile,'rspstd.inc');
  215. openinc(stabfile,'rspstab.inc');
  216. openinc(dwarffile,'rspdwrf.inc');
  217. openinc(norfile,'rspnor.inc');
  218. openinc(rnifile,'rsprni.inc');
  219. openinc(srifile,'rspsri.inc');
  220. first:=true;
  221. for i:=0 to regcount-1 do
  222. begin
  223. if not first then
  224. begin
  225. writeln(numfile,',');
  226. writeln(stdfile,',');
  227. writeln(stabfile,',');
  228. writeln(dwarffile,',');
  229. writeln(rnifile,',');
  230. writeln(srifile,',');
  231. end
  232. else
  233. first:=false;
  234. writeln(confile,'NR_',names[i],' = tregister(',numbers[i],');');
  235. writeln(supfile,'RS_',names[i],' = ',supregs[i],';');
  236. write(numfile,'NR_',names[i]);
  237. write(stdfile,'''',stdnames[i],'''');
  238. write(stabfile,stabs[i]);
  239. write(dwarffile,dwarfs[i]);
  240. write(rnifile,regnumber_index[i]);
  241. write(srifile,std_regname_index[i]);
  242. end;
  243. write(norfile,regcount);
  244. close(confile);
  245. close(supfile);
  246. closeinc(numfile);
  247. closeinc(stdfile);
  248. closeinc(stabfile);
  249. closeinc(dwarffile);
  250. closeinc(norfile);
  251. closeinc(rnifile);
  252. closeinc(srifile);
  253. writeln('Done!');
  254. writeln(regcount,' registers procesed');
  255. end;
  256. begin
  257. writeln('Register Table Converter Version ',Version);
  258. line:=0;
  259. regcount:=0;
  260. read_spreg_file;
  261. regcount_bsstart:=1;
  262. while 2*regcount_bsstart<regcount do
  263. regcount_bsstart:=regcount_bsstart*2;
  264. build_regnum_index;
  265. build_std_regname_index;
  266. write_inc_files;
  267. end.