mkspreg.pp 6.8 KB

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