mkia64reg.pp 6.1 KB

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