mkppcreg.pp 9.4 KB

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