mkmpsreg.pp 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  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. function tostr(l : longint) : string;
  32. begin
  33. str(l,tostr);
  34. end;
  35. function readstr : string;
  36. var
  37. result : 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. readstr:=result;
  46. end;
  47. procedure readcomma;
  48. begin
  49. if s[i]<>',' then
  50. begin
  51. writeln('Missing "," at line ',line);
  52. writeln('Line: "',s,'"');
  53. halt(1);
  54. end;
  55. inc(i);
  56. end;
  57. procedure skipspace;
  58. begin
  59. while (s[i] in [' ',#9]) do
  60. inc(i);
  61. end;
  62. procedure openinc(var f:text;const fn:string);
  63. begin
  64. writeln('creating ',fn);
  65. assign(f,fn);
  66. rewrite(f);
  67. writeln(f,'{ don''t edit, this file is generated from mipsreg.dat }');
  68. end;
  69. procedure closeinc(var f:text);
  70. begin
  71. writeln(f);
  72. close(f);
  73. end;
  74. procedure build_regnum_index;
  75. var h,i,j,p,t:byte;
  76. begin
  77. {Build the registernumber2regindex index.
  78. Step 1: Fill.}
  79. for i:=0 to regcount-1 do
  80. regnumber_index[i]:=i;
  81. {Step 2: Sort. We use a Shell-Metzner sort.}
  82. p:=regcount_bsstart;
  83. repeat
  84. for h:=0 to regcount-p-1 do
  85. begin
  86. i:=h;
  87. repeat
  88. j:=i+p;
  89. if numbers[regnumber_index[j]]>=numbers[regnumber_index[i]] then
  90. break;
  91. t:=regnumber_index[i];
  92. regnumber_index[i]:=regnumber_index[j];
  93. regnumber_index[j]:=t;
  94. if i<p then
  95. break;
  96. dec(i,p);
  97. until false;
  98. end;
  99. p:=p shr 1;
  100. until p=0;
  101. end;
  102. procedure build_std_regname_index;
  103. var h,i,j,p,t:byte;
  104. begin
  105. {Build the registernumber2regindex index.
  106. Step 1: Fill.}
  107. for i:=0 to regcount-1 do
  108. std_regname_index[i]:=i;
  109. {Step 2: Sort. We use a Shell-Metzner sort.}
  110. p:=regcount_bsstart;
  111. repeat
  112. for h:=0 to regcount-p-1 do
  113. begin
  114. i:=h;
  115. repeat
  116. j:=i+p;
  117. if stdnames[std_regname_index[j]]>=stdnames[std_regname_index[i]] then
  118. break;
  119. t:=std_regname_index[i];
  120. std_regname_index[i]:=std_regname_index[j];
  121. std_regname_index[j]:=t;
  122. if i<p then
  123. break;
  124. dec(i,p);
  125. until false;
  126. end;
  127. p:=p shr 1;
  128. until p=0;
  129. end;
  130. procedure build_gas_regname_index;
  131. var h,i,j,p,t:byte;
  132. begin
  133. {Build the registernumber2regindex index.
  134. Step 1: Fill.}
  135. for i:=0 to regcount-1 do
  136. gas_regname_index[i]:=i;
  137. {Step 2: Sort. We use a Shell-Metzner sort.}
  138. p:=regcount_bsstart;
  139. repeat
  140. for h:=0 to regcount-p-1 do
  141. begin
  142. i:=h;
  143. repeat
  144. j:=i+p;
  145. if gasnames[gas_regname_index[j]]>=gasnames[gas_regname_index[i]] then
  146. break;
  147. t:=gas_regname_index[i];
  148. gas_regname_index[i]:=gas_regname_index[j];
  149. gas_regname_index[j]:=t;
  150. if i<p then
  151. break;
  152. dec(i,p);
  153. until false;
  154. end;
  155. p:=p shr 1;
  156. until p=0;
  157. end;
  158. procedure read_mipsreg_file;
  159. var infile:text;
  160. begin
  161. { open dat file }
  162. assign(infile,'mipsreg.dat');
  163. reset(infile);
  164. while not(eof(infile)) do
  165. begin
  166. { handle comment }
  167. readln(infile,s);
  168. inc(line);
  169. while (s[1]=' ') do
  170. delete(s,1,1);
  171. if (s='') or (s[1]=';') then
  172. continue;
  173. i:=1;
  174. names[regcount]:=readstr;
  175. readcomma;
  176. regtypes[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]+'0000'+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,mrifile,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. openinc(mrifile,'rmipsmri.inc');
  230. first:=true;
  231. for i:=0 to regcount-1 do
  232. begin
  233. if not first then
  234. begin
  235. writeln(numfile,',');
  236. writeln(stdfile,',');
  237. writeln(gasfile,',');
  238. writeln(stabfile,',');
  239. writeln(dwarffile,',');
  240. writeln(rnifile,',');
  241. writeln(srifile,',');
  242. writeln(grifile,',');
  243. writeln(mrifile,',');
  244. end
  245. else
  246. first:=false;
  247. writeln(supfile,'RS_',names[i],' = ',supregs[i],';');
  248. writeln(confile,'NR_'+names[i],' = ','tregister(',numbers[i],')',';');
  249. write(numfile,'tregister(',numbers[i],')');
  250. write(stdfile,'''',stdnames[i],'''');
  251. write(gasfile,'''',gasnames[i],'''');
  252. write(stabfile,stabs[i]);
  253. write(dwarffile,dwarfs[i]);
  254. write(rnifile,regnumber_index[i]);
  255. write(srifile,std_regname_index[i]);
  256. write(grifile,gas_regname_index[i]);
  257. write(mrifile,mot_regname_index[i]);
  258. end;
  259. write(norfile,regcount);
  260. close(confile);
  261. close(supfile);
  262. closeinc(numfile);
  263. closeinc(stdfile);
  264. closeinc(gasfile);
  265. closeinc(stabfile);
  266. closeinc(dwarffile);
  267. closeinc(norfile);
  268. closeinc(rnifile);
  269. closeinc(srifile);
  270. closeinc(grifile);
  271. closeinc(mrifile);
  272. writeln('Done!');
  273. writeln(regcount,' registers procesed');
  274. end;
  275. begin
  276. writeln('Register Table Converter Version ',Version);
  277. line:=0;
  278. regcount:=0;
  279. read_mipsreg_file;
  280. regcount_bsstart:=1;
  281. while 2*regcount_bsstart<regcount do
  282. regcount_bsstart:=regcount_bsstart*2;
  283. build_regnum_index;
  284. build_std_regname_index;
  285. build_gas_regname_index;
  286. write_inc_files;
  287. end.