mkmpsreg.pp 7.9 KB

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