mkarmreg.pp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. {
  2. Copyright (c) 1998-2002 by Peter Vreman and Florian Klaempfl
  3. Convert spreg.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 mkspreg;
  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. stabs,dwarf : array[0..max_regcount-1] of string[63];
  25. regnumber_index,
  26. std_regname_index : array[0..max_regcount-1] of byte;
  27. {$ifndef FPC}
  28. procedure readln(var t:text;var s:string);
  29. var
  30. c : char;
  31. i : longint;
  32. begin
  33. c:=#0;
  34. i:=0;
  35. while (not eof(t)) and (c<>#10) do
  36. begin
  37. read(t,c);
  38. if c<>#10 then
  39. begin
  40. inc(i);
  41. s[i]:=c;
  42. end;
  43. end;
  44. if (i>0) and (s[i]=#13) then
  45. dec(i);
  46. s[0]:=chr(i);
  47. end;
  48. {$endif}
  49. function tostr(l : longint) : string;
  50. begin
  51. str(l,tostr);
  52. end;
  53. function readstr : string;
  54. var
  55. result : string;
  56. begin
  57. result:='';
  58. while (s[i]<>',') and (i<=length(s)) do
  59. begin
  60. result:=result+s[i];
  61. inc(i);
  62. end;
  63. readstr:=result;
  64. end;
  65. procedure readcomma;
  66. begin
  67. if s[i]<>',' then
  68. begin
  69. writeln('Missing "," at line ',line);
  70. writeln('Line: "',s,'"');
  71. halt(1);
  72. end;
  73. inc(i);
  74. end;
  75. procedure skipspace;
  76. begin
  77. while (s[i] in [' ',#9]) do
  78. inc(i);
  79. end;
  80. procedure openinc(var f:text;const fn:string);
  81. begin
  82. writeln('creating ',fn);
  83. assign(f,fn);
  84. rewrite(f);
  85. writeln(f,'{ don''t edit, this file is generated from armreg.dat }');
  86. end;
  87. procedure closeinc(var f:text);
  88. begin
  89. writeln(f);
  90. close(f);
  91. end;
  92. procedure build_regnum_index;
  93. var h,i,j,p,t:byte;
  94. begin
  95. {Build the registernumber2regindex index.
  96. Step 1: Fill.}
  97. for i:=0 to regcount-1 do
  98. regnumber_index[i]:=i;
  99. {Step 2: Sort. We use a Shell-Metzner sort.}
  100. p:=regcount_bsstart;
  101. repeat
  102. for h:=0 to regcount-p-1 do
  103. begin
  104. i:=h;
  105. repeat
  106. j:=i+p;
  107. if numbers[regnumber_index[j]]>=numbers[regnumber_index[i]] then
  108. break;
  109. t:=regnumber_index[i];
  110. regnumber_index[i]:=regnumber_index[j];
  111. regnumber_index[j]:=t;
  112. if i<p then
  113. break;
  114. dec(i,p);
  115. until false;
  116. end;
  117. p:=p shr 1;
  118. until p=0;
  119. end;
  120. procedure build_std_regname_index;
  121. var h,i,j,p,t:byte;
  122. begin
  123. {Build the registernumber2regindex index.
  124. Step 1: Fill.}
  125. for i:=0 to regcount-1 do
  126. std_regname_index[i]:=i;
  127. {Step 2: Sort. We use a Shell-Metzner sort.}
  128. p:=regcount_bsstart;
  129. repeat
  130. for h:=0 to regcount-p-1 do
  131. begin
  132. i:=h;
  133. repeat
  134. j:=i+p;
  135. if stdnames[std_regname_index[j]]>=stdnames[std_regname_index[i]] then
  136. break;
  137. t:=std_regname_index[i];
  138. std_regname_index[i]:=std_regname_index[j];
  139. std_regname_index[j]:=t;
  140. if i<p then
  141. break;
  142. dec(i,p);
  143. until false;
  144. end;
  145. p:=p shr 1;
  146. until p=0;
  147. end;
  148. procedure read_spreg_file;
  149. var infile:text;
  150. begin
  151. { open dat file }
  152. assign(infile,'armreg.dat');
  153. reset(infile);
  154. while not(eof(infile)) do
  155. begin
  156. { handle comment }
  157. readln(infile,s);
  158. inc(line);
  159. while (s[1]=' ') do
  160. delete(s,1,1);
  161. if (s='') or (s[1]=';') then
  162. continue;
  163. i:=1;
  164. names[regcount]:=readstr;
  165. readcomma;
  166. regtypes[regcount]:=readstr;
  167. readcomma;
  168. supregs[regcount]:=readstr;
  169. readcomma;
  170. stdnames[regcount]:=readstr;
  171. readcomma;
  172. stabs[regcount]:=readstr;
  173. readcomma;
  174. dwarf[regcount]:=readstr;
  175. { Create register number }
  176. if supregs[regcount][1]<>'$' then
  177. begin
  178. writeln('Missing $ before number, at line ',line);
  179. writeln('Line: "',s,'"');
  180. halt(1);
  181. end;
  182. numbers[regcount]:=regtypes[regcount]+'0000'+copy(supregs[regcount],2,255);
  183. if i<length(s) then
  184. begin
  185. writeln('Extra chars at end of line, at line ',line);
  186. writeln('Line: "',s,'"');
  187. halt(1);
  188. end;
  189. inc(regcount);
  190. if regcount>max_regcount then
  191. begin
  192. writeln('Error: Too much registers, please increase maxregcount in source');
  193. halt(2);
  194. end;
  195. end;
  196. close(infile);
  197. end;
  198. procedure write_inc_files;
  199. var
  200. norfile,stdfile,supfile,
  201. numfile,stabfile,dwarffile,confile,
  202. rnifile,srifile:text;
  203. first:boolean;
  204. begin
  205. { create inc files }
  206. openinc(confile,'rarmcon.inc');
  207. openinc(supfile,'rarmsup.inc');
  208. openinc(numfile,'rarmnum.inc');
  209. openinc(stdfile,'rarmstd.inc');
  210. openinc(stabfile,'rarmsta.inc');
  211. openinc(dwarffile,'rarmdwa.inc');
  212. openinc(norfile,'rarmnor.inc');
  213. openinc(rnifile,'rarmrni.inc');
  214. openinc(srifile,'rarmsri.inc');
  215. first:=true;
  216. for i:=0 to regcount-1 do
  217. begin
  218. if not first then
  219. begin
  220. writeln(numfile,',');
  221. writeln(stdfile,',');
  222. writeln(stabfile,',');
  223. writeln(dwarffile,',');
  224. writeln(rnifile,',');
  225. writeln(srifile,',');
  226. end
  227. else
  228. first:=false;
  229. writeln(supfile,'RS_',names[i],' = ',supregs[i],';');
  230. writeln(confile,'NR_'+names[i],' = ','tregister(',numbers[i],')',';');
  231. write(numfile,'tregister(',numbers[i],')');
  232. write(stdfile,'''',stdnames[i],'''');
  233. write(stabfile,stabs[i]);
  234. write(dwarffile,dwarf[i]);
  235. write(rnifile,regnumber_index[i]);
  236. write(srifile,std_regname_index[i]);
  237. end;
  238. write(norfile,regcount);
  239. close(confile);
  240. close(supfile);
  241. closeinc(numfile);
  242. closeinc(stdfile);
  243. closeinc(stabfile);
  244. closeinc(dwarffile);
  245. closeinc(norfile);
  246. closeinc(rnifile);
  247. closeinc(srifile);
  248. writeln('Done!');
  249. writeln(regcount,' registers procesed');
  250. end;
  251. begin
  252. writeln('Register Table Converter Version ',Version);
  253. line:=0;
  254. regcount:=0;
  255. read_spreg_file;
  256. regcount_bsstart:=1;
  257. while 2*regcount_bsstart<regcount do
  258. regcount_bsstart:=regcount_bsstart*2;
  259. build_regnum_index;
  260. build_std_regname_index;
  261. write_inc_files;
  262. end.