5 numfiles
= int(sys
.argv
[1])
6 tablesz
= int(sys
.argv
[2])
9 filenum
= int(sys
.argv
[1])
10 numfiles
= int(sys
.argv
[2])
11 tablesz
= int(sys
.argv
[3])
16 for line
in sys
.stdin
:
17 (name
, mtch
, msk
) = line
.split('(')[1].split(')')[0].split(',')
18 match
[name
] = int(mtch
,16)
19 mask
[name
] = int(msk
,16)
22 for name
in match
.iterkeys():
23 if (mask
[name
] & (tablesz
-1)) == mask
[name
]:
24 for i
in range(match
[name
]+1, tablesz
):
25 if (i
& mask
[name
]) == match
[name
]:
26 redundant
[i
] = match
[name
]
29 for i
in range(0, tablesz
):
31 for name
in match
.iterkeys():
32 if match
[name
] % tablesz
== (i
& mask
[name
]):
34 if not used
and illegal
== -1:
37 redundant
[i
] = illegal
39 if filenum
== numfiles
:
40 print '#include "processor.h"'
41 print 'const insn_func_t processor_t::dispatch_table[%d] = {' % (2*tablesz
)
43 for i
in range(0, tablesz
):
47 print ' &processor_t::insn_func_%d_%d,' % (xl
, func
)
50 if filenum
== numfiles
+1:
51 print '#define get_insn_func(insn, sr) \\'
52 print ' processor_t::dispatch_table[((((sr) & SR_S) ? (sr & SR_S64) : (SR_U64)) ? %d : 0) + ((insn).bits %% %d)]' % (tablesz
, tablesz
)
54 print 'static const insn_func_t dispatch_table[%d];' % (2*tablesz
)
55 for i
in range(0, tablesz
):
56 if i
not in redundant
:
57 print 'reg_t insn_func_32_%d(insn_t insn, reg_t reg);' % i
58 print 'reg_t insn_func_64_%d(insn_t insn, reg_t reg);' % i
61 print '#include "insn_header.h"'
63 for i
in range(0, tablesz
):
65 if i
% numfiles
!= filenum
or i
in redundant
:
68 print 'reg_t processor_t::insn_func_%d_%d(insn_t insn, reg_t pc)' % (xl
, i
)
70 for name
in match
.iterkeys():
71 if match
[name
] % tablesz
== (i
& mask
[name
]):
72 print ' if((insn.bits & 0x%x) == 0x%x)' % (mask
[name
] & ~
(tablesz
-1), \
73 match
[name
] & ~
(tablesz
-1))
75 print ' int xprlen = %d;' % xl
76 print ' reg_t npc = sext_xprlen(pc + insn_length(0x%x));' % match
[name
]
77 print ' #include "insns/%s.h"' % name
82 print ' throw trap_illegal_instruction;'