truncate effective addresses in rv32
[riscv-isa-sim.git] / riscv / dispatch
1 #!/usr/bin/env python
2 import sys
3
4 if len(sys.argv) == 3:
5 numfiles = int(sys.argv[1])
6 tablesz = int(sys.argv[2])
7 filenum = numfiles+1
8 else:
9 filenum = int(sys.argv[1])
10 numfiles = int(sys.argv[2])
11 tablesz = int(sys.argv[3])
12
13 match = {}
14 mask = {}
15 seen = {}
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)
20
21 redundant = {}
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]
27
28 illegal = -1
29 for i in range(0, tablesz):
30 used = 0
31 for name in match.iterkeys():
32 if match[name] % tablesz == (i & mask[name]):
33 used = 1
34 if not used and illegal == -1:
35 illegal = i
36 elif not used:
37 redundant[i] = illegal
38
39 if filenum == numfiles:
40 print '#include "processor.h"'
41 print 'const insn_func_t processor_t::dispatch_table[%d] = {' % (2*tablesz)
42 for xl in [32, 64]:
43 for i in range(0, tablesz):
44 func = i
45 if i in redundant:
46 func = redundant[i]
47 print ' &processor_t::insn_func_%d_%d,' % (xl, func)
48 print '};'
49
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)
53
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
59 sys.exit(0)
60
61 print '#include "insn_header.h"'
62
63 for i in range(0, tablesz):
64 for xl in [32, 64]:
65 if i % numfiles != filenum or i in redundant:
66 continue
67
68 print 'reg_t processor_t::insn_func_%d_%d(insn_t insn, reg_t pc)' % (xl, i)
69 print '{'
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))
74 print ' {'
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
78 print ' return npc;'
79 print ' }'
80 print ' else',
81
82 print ' throw trap_illegal_instruction;'
83 print '}\n'