mkppcreg.pp 8.9 KB

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