mkppcreg.pp 8.5 KB

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