mkarmreg.pp 6.2 KB

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