-#!/usr/bin/env python
-import sys
-
-if len(sys.argv) == 3:
- numfiles = int(sys.argv[1])
- tablesz = int(sys.argv[2])
- filenum = numfiles+1
-else:
- filenum = int(sys.argv[1])
- numfiles = int(sys.argv[2])
- tablesz = int(sys.argv[3])
-
-match = {}
-mask = {}
-seen = {}
-for line in sys.stdin:
- (name, mtch, msk) = line.split('(')[1].split(')')[0].split(',')
- match[name] = int(mtch,16)
- mask[name] = int(msk,16)
-
-redundant = {}
-for name in match.iterkeys():
- if (mask[name] & (tablesz-1)) == mask[name]:
- for i in range(match[name]+1, tablesz):
- if (i & mask[name]) == match[name]:
- redundant[i] = match[name]
-
-illegal = -1
-for i in range(0, tablesz):
- used = 0
- for name in match.iterkeys():
- if match[name] % tablesz == (i & mask[name]):
- used = 1
- if not used and illegal == -1:
- illegal = i
- elif not used:
- redundant[i] = illegal
-
-if filenum == numfiles:
- print '#include "processor.h"'
- print 'const insn_func_t processor_t::dispatch_table[%d] = {' % (2*tablesz)
- for xl in [32, 64]:
- for i in range(0, tablesz):
- func = i
- if i in redundant:
- func = redundant[i]
- print ' &processor_t::insn_func_%d_%d,' % (xl, func)
- print '};'
-
-if filenum == numfiles+1:
- print '#define get_insn_func(insn, sr) \\'
- print ' processor_t::dispatch_table[((((sr) & SR_S) ? (sr & SR_S64) : (sr & SR_U64)) ? %d : 0) + ((insn).bits %% %d)]' % (tablesz, tablesz)
-
- print 'static const insn_func_t dispatch_table[%d];' % (2*tablesz)
- for i in range(0, tablesz):
- if i not in redundant:
- print 'reg_t insn_func_32_%d(insn_t insn, reg_t reg);' % i
- print 'reg_t insn_func_64_%d(insn_t insn, reg_t reg);' % i
- sys.exit(0)
-
-print '#include "insn_header.h"'
-
-for i in range(0, tablesz):
- for xl in [32, 64]:
- if i % numfiles != filenum or i in redundant:
- continue
-
- print 'reg_t processor_t::insn_func_%d_%d(insn_t insn, reg_t pc)' % (xl, i)
- print '{'
- for name in match.iterkeys():
- if match[name] % tablesz == (i & mask[name]):
- print ' if((insn.bits & 0x%x) == 0x%x)' % (mask[name] & ~(tablesz-1), \
- match[name] & ~(tablesz-1))
- print ' {'
- print ' int xprlen = %d;' % xl
- print ' reg_t npc = sext_xprlen(pc + insn_length(0x%x));' % match[name]
- print ' #include "insns/%s.h"' % name
- print ' return npc;'
- print ' }'
- print ' else',
-
- print ' throw trap_illegal_instruction;'
- print '}\n'