mkmpsreg.pp 7.2 KB

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