mkmpsreg.pp 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  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. subregs,
  24. numbers,
  25. stdnames,
  26. gasnames,
  27. dwarfs,
  28. stabs : array[0..max_regcount-1] of string[63];
  29. regnumber_index,
  30. std_regname_index,
  31. gas_regname_index : array[0..max_regcount-1] of byte;
  32. function tostr(l : longint) : string;
  33. begin
  34. str(l,tostr);
  35. end;
  36. function readstr : string;
  37. begin
  38. result:='';
  39. while (s[i]<>',') and (i<=length(s)) do
  40. begin
  41. result:=result+s[i];
  42. inc(i);
  43. end;
  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(out 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 mipsreg.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 build_gas_regname_index;
  129. var h,i,j,p,t:byte;
  130. begin
  131. {Build the registernumber2regindex index.
  132. Step 1: Fill.}
  133. for i:=0 to regcount-1 do
  134. gas_regname_index[i]:=i;
  135. {Step 2: Sort. We use a Shell-Metzner sort.}
  136. p:=regcount_bsstart;
  137. repeat
  138. for h:=0 to regcount-p-1 do
  139. begin
  140. i:=h;
  141. repeat
  142. j:=i+p;
  143. if gasnames[gas_regname_index[j]]>=gasnames[gas_regname_index[i]] then
  144. break;
  145. t:=gas_regname_index[i];
  146. gas_regname_index[i]:=gas_regname_index[j];
  147. gas_regname_index[j]:=t;
  148. if i<p then
  149. break;
  150. dec(i,p);
  151. until false;
  152. end;
  153. p:=p shr 1;
  154. until p=0;
  155. end;
  156. procedure read_mipsreg_file;
  157. var infile:text;
  158. begin
  159. { open dat file }
  160. assign(infile,'mipsreg.dat');
  161. reset(infile);
  162. while not(eof(infile)) do
  163. begin
  164. { handle comment }
  165. readln(infile,s);
  166. inc(line);
  167. while (s[1]=' ') do
  168. delete(s,1,1);
  169. if (s='') or (s[1]=';') then
  170. continue;
  171. i:=1;
  172. names[regcount]:=readstr;
  173. readcomma;
  174. regtypes[regcount]:=readstr;
  175. readcomma;
  176. subregs[regcount]:=readstr;
  177. readcomma;
  178. supregs[regcount]:=readstr;
  179. readcomma;
  180. stdnames[regcount]:=readstr;
  181. readcomma;
  182. gasnames[regcount]:=readstr;
  183. readcomma;
  184. stabs[regcount]:=readstr;
  185. readcomma;
  186. dwarfs[regcount]:=readstr;
  187. { Create register number }
  188. if supregs[regcount][1]<>'$' then
  189. begin
  190. writeln('Missing $ before number, at line ',line);
  191. writeln('Line: "',s,'"');
  192. halt(1);
  193. end;
  194. numbers[regcount]:=regtypes[regcount]+copy(subregs[regcount],2,255)+'00'+copy(supregs[regcount],2,255);
  195. if i<length(s) then
  196. begin
  197. writeln('Extra chars at end of line, at line ',line);
  198. writeln('Line: "',s,'"');
  199. halt(1);
  200. end;
  201. inc(regcount);
  202. if regcount>max_regcount then
  203. begin
  204. writeln('Error: Too much registers, please increase maxregcount in source');
  205. halt(2);
  206. end;
  207. end;
  208. close(infile);
  209. end;
  210. procedure write_inc_files;
  211. var
  212. norfile,stdfile,supfile,
  213. numfile,stabfile,confile,gasfile,dwarffile,
  214. rnifile,srifile,grifile : text;
  215. first:boolean;
  216. begin
  217. { create inc files }
  218. openinc(confile,'rmipscon.inc');
  219. openinc(supfile,'rmipssup.inc');
  220. openinc(numfile,'rmipsnum.inc');
  221. openinc(stdfile,'rmipsstd.inc');
  222. openinc(gasfile,'rmipsgas.inc');
  223. openinc(stabfile,'rmipssta.inc');
  224. openinc(dwarffile,'rmipsdwf.inc');
  225. openinc(norfile,'rmipsnor.inc');
  226. openinc(rnifile,'rmipsrni.inc');
  227. openinc(srifile,'rmipssri.inc');
  228. openinc(grifile,'rmipsgri.inc');
  229. first:=true;
  230. for i:=0 to regcount-1 do
  231. begin
  232. if not first then
  233. begin
  234. writeln(numfile,',');
  235. writeln(stdfile,',');
  236. writeln(gasfile,',');
  237. writeln(stabfile,',');
  238. writeln(dwarffile,',');
  239. writeln(rnifile,',');
  240. writeln(srifile,',');
  241. writeln(grifile,',');
  242. end
  243. else
  244. first:=false;
  245. writeln(confile,'NR_'+names[i],' = ','tregister(',numbers[i],')',';');
  246. writeln(supfile,'RS_',names[i],' = ',supregs[i],';');
  247. write(numfile,'NR_',names[i]);
  248. write(stdfile,'''',stdnames[i],'''');
  249. write(gasfile,'''',gasnames[i],'''');
  250. write(stabfile,stabs[i]);
  251. write(dwarffile,dwarfs[i]);
  252. write(rnifile,regnumber_index[i]);
  253. write(srifile,std_regname_index[i]);
  254. write(grifile,gas_regname_index[i]);
  255. end;
  256. write(norfile,regcount);
  257. close(confile);
  258. close(supfile);
  259. closeinc(numfile);
  260. closeinc(stdfile);
  261. closeinc(gasfile);
  262. closeinc(stabfile);
  263. closeinc(dwarffile);
  264. closeinc(norfile);
  265. closeinc(rnifile);
  266. closeinc(srifile);
  267. closeinc(grifile);
  268. writeln('Done!');
  269. writeln(regcount,' registers processed');
  270. end;
  271. begin
  272. writeln('Register Table Converter Version ',Version);
  273. line:=0;
  274. regcount:=0;
  275. read_mipsreg_file;
  276. regcount_bsstart:=1;
  277. while 2*regcount_bsstart<regcount do
  278. regcount_bsstart:=regcount_bsstart*2;
  279. build_regnum_index;
  280. build_std_regname_index;
  281. build_gas_regname_index;
  282. write_inc_files;
  283. end.