-#!/usr/bin/python
+#!/usr/bin/env python
import sys
if len(sys.argv) == 3:
if filenum == numfiles:
print '#include "processor.h"'
- print 'const insn_func_t processor_t::dispatch_table[DISPATCH_TABLE_SIZE] = {'
- for i in range(0, tablesz):
- func = i
- if i in redundant:
- func = redundant[i]
- print ' &processor_t::insn_func_%d,' % func
+ 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 'static const size_t DISPATCH_TABLE_SIZE = %d;' % tablesz
- print 'static const insn_func_t dispatch_table[DISPATCH_TABLE_SIZE];'
+ print '#define get_insn_func(insn, sr) \\'
+ print ' processor_t::dispatch_table[((((sr) & SR_S) ? (sr & SR_S64) : (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_%d(insn_t insn, reg_t reg);' % i
+ 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):
- if i % numfiles != filenum or i in redundant:
- continue
+ for xl in [32, 64]:
+ if i % numfiles != filenum or i in redundant:
+ continue
- print 'reg_t processor_t::insn_func_%d(insn_t insn, reg_t pc)' % 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 ' reg_t npc = pc + insn_length(0x%x);' % match[name]
- print ' #include "insns/%s.h"' % name
- print ' return npc;'
- print ' }'
- print ' else',
+ 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'
+ print ' throw trap_illegal_instruction;'
+ print '}\n'