2
0

mkspreg.pp 6.2 KB

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