mkppcreg.pp 8.5 KB

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