mkppcreg.pp 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  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. motnames,
  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 ppcreg.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 build_mot_regname_index;
  182. var h,i,j,p,t:byte;
  183. begin
  184. {Build the registernumber2regindex index.
  185. Step 1: Fill.}
  186. for i:=0 to regcount-1 do
  187. mot_regname_index[i]:=i;
  188. {Step 2: Sort. We use a Shell-Metzner sort.}
  189. p:=regcount_bsstart;
  190. repeat
  191. for h:=0 to regcount-p-1 do
  192. begin
  193. i:=h;
  194. repeat
  195. j:=i+p;
  196. if motnames[mot_regname_index[j]]>=motnames[mot_regname_index[i]] then
  197. break;
  198. t:=mot_regname_index[i];
  199. mot_regname_index[i]:=mot_regname_index[j];
  200. mot_regname_index[j]:=t;
  201. if i<p then
  202. break;
  203. dec(i,p);
  204. until false;
  205. end;
  206. p:=p shr 1;
  207. until p=0;
  208. end;
  209. procedure read_ppcreg_file;
  210. var infile:text;
  211. begin
  212. { open dat file }
  213. assign(infile,'ppcreg.dat');
  214. reset(infile);
  215. while not(eof(infile)) do
  216. begin
  217. { handle comment }
  218. readln(infile,s);
  219. inc(line);
  220. while (s[1]=' ') do
  221. delete(s,1,1);
  222. if (s='') or (s[1]=';') then
  223. continue;
  224. i:=1;
  225. names[regcount]:=readstr;
  226. readcomma;
  227. regtypes[regcount]:=readstr;
  228. readcomma;
  229. supregs[regcount]:=readstr;
  230. readcomma;
  231. stdnames[regcount]:=readstr;
  232. readcomma;
  233. gasnames[regcount]:=readstr;
  234. readcomma;
  235. motnames[regcount]:=readstr;
  236. readcomma;
  237. stabs[regcount]:=readstr;
  238. { Create register number }
  239. if supregs[regcount][1]<>'$' then
  240. begin
  241. writeln('Missing $ before number, at line ',line);
  242. writeln('Line: "',s,'"');
  243. halt(1);
  244. end;
  245. numbers[regcount]:=regtypes[regcount]+'0000'+copy(supregs[regcount],2,255);
  246. if i<length(s) then
  247. begin
  248. writeln('Extra chars at end of line, at line ',line);
  249. writeln('Line: "',s,'"');
  250. halt(1);
  251. end;
  252. inc(regcount);
  253. if regcount>max_regcount then
  254. begin
  255. writeln('Error: Too much registers, please increase maxregcount in source');
  256. halt(2);
  257. end;
  258. end;
  259. close(infile);
  260. end;
  261. procedure write_inc_files;
  262. var
  263. norfile,stdfile,motfile,supfile,
  264. numfile,stabfile,confile,gasfile,
  265. rnifile,srifile,mrifile,grifile : text;
  266. first:boolean;
  267. begin
  268. { create inc files }
  269. openinc(confile,'rppccon.inc');
  270. openinc(supfile,'rppcsup.inc');
  271. openinc(numfile,'rppcnum.inc');
  272. openinc(stdfile,'rppcstd.inc');
  273. openinc(gasfile,'rppcgas.inc');
  274. openinc(motfile,'rppcmot.inc');
  275. openinc(stabfile,'rppcstab.inc');
  276. openinc(norfile,'rppcnor.inc');
  277. openinc(rnifile,'rppcrni.inc');
  278. openinc(srifile,'rppcsri.inc');
  279. openinc(grifile,'rppcgri.inc');
  280. openinc(mrifile,'rppcmri.inc');
  281. first:=true;
  282. for i:=0 to regcount-1 do
  283. begin
  284. if not first then
  285. begin
  286. writeln(numfile,',');
  287. writeln(stdfile,',');
  288. writeln(gasfile,',');
  289. writeln(motfile,',');
  290. writeln(stabfile,',');
  291. writeln(rnifile,',');
  292. writeln(srifile,',');
  293. writeln(grifile,',');
  294. writeln(mrifile,',');
  295. end
  296. else
  297. first:=false;
  298. writeln(confile,'NR_',names[i],' = ',numbers[i],';');
  299. writeln(supfile,'RS_',names[i],' = ',supregs[i],';');
  300. write(numfile,'NR_',names[i]);
  301. write(stdfile,'''',stdnames[i],'''');
  302. write(gasfile,'''',gasnames[i],'''');
  303. write(motfile,'''',motnames[i],'''');
  304. write(stabfile,stabs[i]);
  305. write(rnifile,regnumber_index[i]);
  306. write(srifile,std_regname_index[i]);
  307. write(grifile,gas_regname_index[i]);
  308. write(mrifile,mot_regname_index[i]);
  309. end;
  310. write(norfile,regcount);
  311. close(confile);
  312. close(supfile);
  313. closeinc(numfile);
  314. closeinc(stdfile);
  315. closeinc(gasfile);
  316. closeinc(motfile);
  317. closeinc(stabfile);
  318. closeinc(norfile);
  319. closeinc(rnifile);
  320. closeinc(srifile);
  321. closeinc(grifile);
  322. closeinc(mrifile);
  323. writeln('Done!');
  324. writeln(regcount,' registers procesed');
  325. end;
  326. begin
  327. writeln('Register Table Converter Version ',Version);
  328. line:=0;
  329. regcount:=0;
  330. read_ppcreg_file;
  331. regcount_bsstart:=1;
  332. while 2*regcount_bsstart<regcount do
  333. regcount_bsstart:=regcount_bsstart*2;
  334. build_regnum_index;
  335. build_std_regname_index;
  336. build_gas_regname_index;
  337. build_mot_regname_index;
  338. write_inc_files;
  339. end.
  340. {
  341. $Log$
  342. Revision 1.5 2003-09-03 20:33:28 peter
  343. * fixed sorting of register number
  344. Revision 1.4 2003/09/03 19:37:07 peter
  345. * powerpc reg update
  346. Revision 1.2 2003/09/03 15:55:01 peter
  347. * NEWRA branch merged
  348. Revision 1.1.2.1 2003/09/02 20:48:22 peter
  349. * powerpc registers
  350. }