2
$Id: mkx86reg.pp,v 1.4 2003/12/15 21:25:49 peter Exp $
3
Copyright (c) 1998-2002 by Peter Vreman and Florian Klaempfl
5
Convert i386reg.dat to several .inc files for usage with
6
the Free pascal compiler
8
See the file COPYING.FPC, included in this distribution,
9
for details about the copyright.
11
This program is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15
**********************************************************************}
20
const Version = '1.00';
27
regcount_bsstart:byte;
28
names,numbers,stdnames,intnames,nasmnames,attnames,stabs,ots,ops:
29
array[0..max_regcount-1] of string[63];
30
regnumber_index,std_regname_index,int_regname_index,att_regname_index,
31
nasm_regname_index:array[0..max_regcount-1] of byte;
36
procedure readln(var t:text;var s:string);
43
while (not eof(t)) and (c<>#10) do
52
if (i>0) and (s[i]=#13) then
58
function tostr(l : longint) : string;
64
function readstr : string;
67
while (s[i]<>',') and (i<=length(s)) do
80
writeln('Missing "," at line ',line);
81
writeln('Line: "',s,'"');
91
while (s[i] in [' ',#9]) do
95
procedure openinc(var f:text;const fn:string);
97
writeln('creating ',fn);
100
writeln(f,'{ don''t edit, this file is generated from x86reg.dat }');
104
procedure closeinc(var f:text);
110
procedure build_regnum_index;
115
{Build the registernumber2regindex index.
117
for i:=0 to regcount-1 do
118
regnumber_index[i]:=i;
119
{Step 2: Sort. We use a Shell-Metzner sort.}
122
for h:=0 to regcount-p-1 do
127
if numbers[regnumber_index[j]]>=numbers[regnumber_index[i]] then
129
t:=regnumber_index[i];
130
regnumber_index[i]:=regnumber_index[j];
131
regnumber_index[j]:=t;
141
procedure build_std_regname_index;
146
{Build the registernumber2regindex index.
148
for i:=0 to regcount-1 do
149
std_regname_index[i]:=i;
150
{Step 2: Sort. We use a Shell-Metzner sort.}
153
for h:=0 to regcount-p-1 do
158
if stdnames[std_regname_index[j]]>=stdnames[std_regname_index[i]] then
160
t:=std_regname_index[i];
161
std_regname_index[i]:=std_regname_index[j];
162
std_regname_index[j]:=t;
172
procedure build_int_regname_index;
177
{Build the registernumber2regindex index.
179
for i:=0 to regcount-1 do
180
int_regname_index[i]:=i;
181
{Step 2: Sort. We use a Shell-Metzner sort.}
184
for h:=0 to regcount-p-1 do
189
if intnames[int_regname_index[j]]>=intnames[int_regname_index[i]] then
191
t:=int_regname_index[i];
192
int_regname_index[i]:=int_regname_index[j];
193
int_regname_index[j]:=t;
203
procedure build_att_regname_index;
208
{Build the registernumber2regindex index.
210
for i:=0 to regcount-1 do
211
att_regname_index[i]:=i;
212
{Step 2: Sort. We use a Shell-Metzner sort.}
215
for h:=0 to regcount-p-1 do
220
if attnames[att_regname_index[j]]>=attnames[att_regname_index[i]] then
222
t:=att_regname_index[i];
223
att_regname_index[i]:=att_regname_index[j];
224
att_regname_index[j]:=t;
234
procedure build_nasm_regname_index;
239
{Build the registernumber2regindex index.
241
for i:=0 to regcount-1 do
242
nasm_regname_index[i]:=i;
243
{Step 2: Sort. We use a Shell-Metzner sort.}
246
for h:=0 to regcount-p-1 do
251
if nasmnames[nasm_regname_index[j]]>=nasmnames[nasm_regname_index[i]] then
253
t:=nasm_regname_index[i];
254
nasm_regname_index[i]:=nasm_regname_index[j];
255
nasm_regname_index[j]:=t;
265
procedure read_x86reg_file;
272
assign(infile,'x86reg.dat');
274
while not(eof(infile)) do
281
if (s='') or (s[1]=';') then
285
names[regcount]:=readstr;
287
numbers[regcount]:=readstr;
289
stdnames[regcount]:=readstr;
291
attnames[regcount]:=readstr;
293
intnames[regcount]:=readstr;
295
nasmnames[regcount]:=readstr;
297
stabs[regcount]:=readstr;
299
ots[regcount]:=readstr;
301
ops[regcount]:=readstr;
311
writeln('Extra chars at end of line, at line ',line);
312
writeln('Line: "',s,'"');
315
if (cpustr<>'64') or x86_64 then
318
if regcount>max_regcount then
320
writeln('Error: Too much registers, please increase maxregcount in source');
328
procedure write_inc_files;
330
var attfile,intfile,otfile,opfile,
331
norfile,nasmfile,stdfile,
332
numfile,stabfile,confile,
333
rnifile,irifile,srifile,
334
arifile,nrifile:text;
339
openinc(confile,fileprefix+'con.inc');
340
openinc(numfile,fileprefix+'num.inc');
341
openinc(stdfile,fileprefix+'std.inc');
342
openinc(attfile,fileprefix+'att.inc');
345
openinc(intfile,fileprefix+'int.inc');
346
openinc(nasmfile,fileprefix+'nasm.inc');
348
openinc(stabfile,fileprefix+'stab.inc');
349
openinc(otfile,fileprefix+'ot.inc');
350
openinc(opfile,fileprefix+'op.inc');
351
openinc(norfile,fileprefix+'nor.inc');
352
openinc(rnifile,fileprefix+'rni.inc');
353
openinc(srifile,fileprefix+'sri.inc');
354
openinc(arifile,fileprefix+'ari.inc');
357
openinc(nrifile,fileprefix+'nri.inc');
358
openinc(irifile,fileprefix+'iri.inc');
361
for i:=0 to regcount-1 do
365
writeln(numfile,',');
366
writeln(stdfile,',');
367
writeln(attfile,',');
370
writeln(intfile,',');
371
writeln(nasmfile,',');
373
writeln(stabfile,',');
376
writeln(rnifile,',');
377
writeln(srifile,',');
378
writeln(arifile,',');
381
writeln(irifile,',');
382
writeln(nrifile,',');
387
writeln(confile,names[i],' = ','tregister(',numbers[i],')',';');
388
write(numfile,'tregister(',numbers[i],')');
389
write(stdfile,'''',stdnames[i],'''');
390
write(attfile,'''',attnames[i],'''');
393
write(intfile,'''',intnames[i],'''');
394
write(nasmfile,'''',nasmnames[i],'''');
396
write(stabfile,stabs[i]);
397
write(otfile,ots[i]);
398
write(opfile,ops[i]);
399
write(rnifile,regnumber_index[i]);
400
write(srifile,std_regname_index[i]);
401
write(arifile,att_regname_index[i]);
405
write(irifile,int_regname_index[i]);
406
write(nrifile,nasm_regname_index[i]);
409
write(norfile,regcount);
432
writeln(regcount,' registers procesed');
437
writeln('Register Table Converter Version ',Version);
438
x86_64:=paramstr(1)='x86_64';
447
while 2*regcount_bsstart<regcount do
448
regcount_bsstart:=regcount_bsstart*2;
452
build_int_regname_index;
453
build_nasm_regname_index;
455
build_std_regname_index;
456
build_att_regname_index;
460
$Log: mkx86reg.pp,v $
461
Revision 1.4 2003/12/15 21:25:49 peter
462
* reg allocations for imaginary register are now inserted just
463
before reg allocation
464
* tregister changed to enum to allow compile time check
465
* fixed several tregister-tsuperregister errors
467
Revision 1.3 2003/09/24 17:11:33 florian
468
* x86_64 support; turn on by passing x86_64
470
Revision 1.2 2003/09/03 15:55:02 peter
471
* NEWRA branch merged
473
Revision 1.1.2.4 2003/08/31 18:46:57 peter
476
Revision 1.1.2.3 2003/08/29 09:41:25 daniel
477
* Further mkx86reg development
479
Revision 1.1.2.2 2003/08/27 20:30:46 peter
482
Revision 1.1.2.1 2003/08/27 19:13:10 peter