mkppcreg.pp 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  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. 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. { Create register number }
  242. if supregs[regcount][1]<>'$' then
  243. begin
  244. writeln('Missing $ before number, at line ',line);
  245. writeln('Line: "',s,'"');
  246. halt(1);
  247. end;
  248. numbers[regcount]:=regtypes[regcount]+'0000'+copy(supregs[regcount],2,255);
  249. if i<length(s) then
  250. begin
  251. writeln('Extra chars at end of line, at line ',line);
  252. writeln('Line: "',s,'"');
  253. halt(1);
  254. end;
  255. inc(regcount);
  256. if regcount>max_regcount then
  257. begin
  258. writeln('Error: Too much registers, please increase maxregcount in source');
  259. halt(2);
  260. end;
  261. end;
  262. close(infile);
  263. end;
  264. procedure write_inc_files;
  265. var
  266. norfile,stdfile,motfile,supfile,
  267. numfile,stabfile,confile,gasfile,gssfile,
  268. rnifile,srifile,mrifile,grifile : text;
  269. first:boolean;
  270. begin
  271. { create inc files }
  272. openinc(confile,'rppccon.inc');
  273. openinc(supfile,'rppcsup.inc');
  274. openinc(numfile,'rppcnum.inc');
  275. openinc(stdfile,'rppcstd.inc');
  276. openinc(gasfile,'rppcgas.inc');
  277. openinc(gssfile,'rppcgss.inc');
  278. openinc(motfile,'rppcmot.inc');
  279. openinc(stabfile,'rppcstab.inc');
  280. openinc(norfile,'rppcnor.inc');
  281. openinc(rnifile,'rppcrni.inc');
  282. openinc(srifile,'rppcsri.inc');
  283. openinc(grifile,'rppcgri.inc');
  284. openinc(mrifile,'rppcmri.inc');
  285. first:=true;
  286. for i:=0 to regcount-1 do
  287. begin
  288. if not first then
  289. begin
  290. writeln(numfile,',');
  291. writeln(stdfile,',');
  292. writeln(gasfile,',');
  293. writeln(gssfile,',');
  294. writeln(motfile,',');
  295. writeln(stabfile,',');
  296. writeln(rnifile,',');
  297. writeln(srifile,',');
  298. writeln(grifile,',');
  299. writeln(mrifile,',');
  300. end
  301. else
  302. first:=false;
  303. writeln(supfile,'RS_',names[i],' = ',supregs[i],';');
  304. writeln(confile,'NR_'+names[i],' = ','tregister(',numbers[i],')',';');
  305. write(numfile,'tregister(',numbers[i],')');
  306. write(stdfile,'''',stdnames[i],'''');
  307. write(gasfile,'''',gasnames[i],'''');
  308. write(gssfile,'''',gssnames[i],'''');
  309. write(motfile,'''',motnames[i],'''');
  310. write(stabfile,stabs[i]);
  311. write(rnifile,regnumber_index[i]);
  312. write(srifile,std_regname_index[i]);
  313. write(grifile,gas_regname_index[i]);
  314. write(mrifile,mot_regname_index[i]);
  315. end;
  316. write(norfile,regcount);
  317. close(confile);
  318. close(supfile);
  319. closeinc(numfile);
  320. closeinc(stdfile);
  321. closeinc(gasfile);
  322. closeinc(gssfile);
  323. closeinc(motfile);
  324. closeinc(stabfile);
  325. closeinc(norfile);
  326. closeinc(rnifile);
  327. closeinc(srifile);
  328. closeinc(grifile);
  329. closeinc(mrifile);
  330. writeln('Done!');
  331. writeln(regcount,' registers procesed');
  332. end;
  333. begin
  334. writeln('Register Table Converter Version ',Version);
  335. line:=0;
  336. regcount:=0;
  337. read_ppcreg_file;
  338. regcount_bsstart:=1;
  339. while 2*regcount_bsstart<regcount do
  340. regcount_bsstart:=regcount_bsstart*2;
  341. build_regnum_index;
  342. build_std_regname_index;
  343. build_gas_regname_index;
  344. build_mot_regname_index;
  345. write_inc_files;
  346. end.
  347. {
  348. $Log$
  349. Revision 1.7 2003-12-16 21:49:47 florian
  350. * fixed ppc compilation
  351. Revision 1.6 2003/12/10 22:19:28 florian
  352. + short gas register names for smartlinking added
  353. Revision 1.5 2003/09/03 20:33:28 peter
  354. * fixed sorting of register number
  355. Revision 1.4 2003/09/03 19:37:07 peter
  356. * powerpc reg update
  357. Revision 1.2 2003/09/03 15:55:01 peter
  358. * NEWRA branch merged
  359. Revision 1.1.2.1 2003/09/02 20:48:22 peter
  360. * powerpc registers
  361. }