mkarmreg.pp 6.3 KB

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