mkjvmreg.pp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. {
  2. Copyright (c) 1998-2002 by Peter Vreman and Florian Klaempfl
  3. Convert jvmreg.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. names,
  20. regtypes,
  21. subtypes,
  22. supregs,
  23. numbers,
  24. stdnames : array[0..max_regcount-1] of string[63];
  25. regnumber_index,
  26. std_regname_index : array[0..max_regcount-1] of byte;
  27. function tostr(l : longint) : string;
  28. begin
  29. str(l,tostr);
  30. end;
  31. function readstr : string;
  32. var
  33. result : string;
  34. begin
  35. result:='';
  36. while (s[i]<>',') and (i<=length(s)) do
  37. begin
  38. result:=result+s[i];
  39. inc(i);
  40. end;
  41. readstr:=result;
  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(var 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 jvmreg.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 infile:text;
  128. begin
  129. { open dat file }
  130. assign(infile,'jvmreg.dat');
  131. reset(infile);
  132. while not(eof(infile)) do
  133. begin
  134. { handle comment }
  135. readln(infile,s);
  136. inc(line);
  137. while (s[1]=' ') do
  138. delete(s,1,1);
  139. if (s='') or (s[1]=';') then
  140. continue;
  141. i:=1;
  142. names[regcount]:=readstr;
  143. readcomma;
  144. regtypes[regcount]:=readstr;
  145. readcomma;
  146. subtypes[regcount]:=readstr;
  147. readcomma;
  148. supregs[regcount]:=readstr;
  149. readcomma;
  150. stdnames[regcount]:=readstr;
  151. { Create register number }
  152. if supregs[regcount][1]<>'$' then
  153. begin
  154. writeln('Missing $ before number, at line ',line);
  155. writeln('Line: "',s,'"');
  156. halt(1);
  157. end;
  158. numbers[regcount]:=regtypes[regcount]+copy(subtypes[regcount],2,255)+'00'+copy(supregs[regcount],2,255);
  159. if i<length(s) then
  160. begin
  161. writeln('Extra chars at end of line, at line ',line);
  162. writeln('Line: "',s,'"');
  163. halt(1);
  164. end;
  165. inc(regcount);
  166. if regcount>max_regcount then
  167. begin
  168. writeln('Error: Too much registers, please increase maxregcount in source');
  169. halt(2);
  170. end;
  171. end;
  172. close(infile);
  173. end;
  174. procedure write_inc_files;
  175. var
  176. norfile,stdfile,supfile,
  177. numfile,confile,
  178. rnifile,srifile:text;
  179. first:boolean;
  180. begin
  181. { create inc files }
  182. openinc(confile,'rjvmcon.inc');
  183. openinc(supfile,'rjvmsup.inc');
  184. openinc(numfile,'rjvmnum.inc');
  185. openinc(stdfile,'rjvmstd.inc');
  186. openinc(norfile,'rjvmnor.inc');
  187. openinc(rnifile,'rjvmrni.inc');
  188. openinc(srifile,'rjvmsri.inc');
  189. first:=true;
  190. for i:=0 to regcount-1 do
  191. begin
  192. if not first then
  193. begin
  194. writeln(numfile,',');
  195. writeln(stdfile,',');
  196. writeln(rnifile,',');
  197. writeln(srifile,',');
  198. end
  199. else
  200. first:=false;
  201. writeln(supfile,'RS_',names[i],' = ',supregs[i],';');
  202. writeln(confile,'NR_'+names[i],' = ','tregister(',numbers[i],')',';');
  203. write(numfile,'tregister(',numbers[i],')');
  204. write(stdfile,'''',stdnames[i],'''');
  205. write(rnifile,regnumber_index[i]);
  206. write(srifile,std_regname_index[i]);
  207. end;
  208. write(norfile,regcount);
  209. close(confile);
  210. close(supfile);
  211. closeinc(numfile);
  212. closeinc(stdfile);
  213. closeinc(norfile);
  214. closeinc(rnifile);
  215. closeinc(srifile);
  216. writeln('Done!');
  217. writeln(regcount,' registers procesed');
  218. end;
  219. begin
  220. writeln('Register Table Converter Version ',Version);
  221. line:=0;
  222. regcount:=0;
  223. read_spreg_file;
  224. regcount_bsstart:=1;
  225. while 2*regcount_bsstart<regcount do
  226. regcount_bsstart:=regcount_bsstart*2;
  227. build_regnum_index;
  228. build_std_regname_index;
  229. write_inc_files;
  230. end.