truncate effective addresses in rv32
[riscv-isa-sim.git] / riscv / dispatch
index b96b364827e4cbe19b93f75e8213f8fbb42229bf..231853cb1881d949c74e25ca07dd76cd1d65606c 100755 (executable)
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
 import sys
 
 if len(sys.argv) == 3:
@@ -38,40 +38,46 @@ for i in range(0, tablesz):
 
 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'