mkmpsreg.pp 7.8 KB

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