mkspreg.pp 6.2 KB

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