[xcc] fixed simulator build time
authorAndrew Waterman <waterman@s141.Millennium.Berkeley.EDU>
Sun, 12 Jun 2011 03:34:04 +0000 (20:34 -0700)
committerAndrew Waterman <waterman@s141.Millennium.Berkeley.EDU>
Sun, 12 Jun 2011 03:34:04 +0000 (20:34 -0700)
riscv/dispatch [new file with mode: 0755]
riscv/dispatch.h [new file with mode: 0644]
riscv/insn_header.h
riscv/processor.cc
riscv/processor.h
riscv/riscv.mk.in

diff --git a/riscv/dispatch b/riscv/dispatch
new file mode 100755 (executable)
index 0000000..b96b364
--- /dev/null
@@ -0,0 +1,77 @@
+#!/usr/bin/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[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 '};'
+
+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];'
+  for i in range(0, tablesz):
+    if i not in redundant:
+      print 'reg_t insn_func_%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
+
+  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 '  throw trap_illegal_instruction;'
+  print '}\n'
diff --git a/riscv/dispatch.h b/riscv/dispatch.h
new file mode 100644 (file)
index 0000000..7091899
--- /dev/null
@@ -0,0 +1,254 @@
+static const size_t DISPATCH_TABLE_SIZE = 1024;
+static const insn_func_t dispatch_table[DISPATCH_TABLE_SIZE];
+reg_t insn_func_0(insn_t insn, reg_t reg);
+reg_t insn_func_1(insn_t insn, reg_t reg);
+reg_t insn_func_2(insn_t insn, reg_t reg);
+reg_t insn_func_3(insn_t insn, reg_t reg);
+reg_t insn_func_4(insn_t insn, reg_t reg);
+reg_t insn_func_5(insn_t insn, reg_t reg);
+reg_t insn_func_6(insn_t insn, reg_t reg);
+reg_t insn_func_7(insn_t insn, reg_t reg);
+reg_t insn_func_8(insn_t insn, reg_t reg);
+reg_t insn_func_9(insn_t insn, reg_t reg);
+reg_t insn_func_10(insn_t insn, reg_t reg);
+reg_t insn_func_11(insn_t insn, reg_t reg);
+reg_t insn_func_12(insn_t insn, reg_t reg);
+reg_t insn_func_13(insn_t insn, reg_t reg);
+reg_t insn_func_15(insn_t insn, reg_t reg);
+reg_t insn_func_16(insn_t insn, reg_t reg);
+reg_t insn_func_17(insn_t insn, reg_t reg);
+reg_t insn_func_18(insn_t insn, reg_t reg);
+reg_t insn_func_19(insn_t insn, reg_t reg);
+reg_t insn_func_20(insn_t insn, reg_t reg);
+reg_t insn_func_21(insn_t insn, reg_t reg);
+reg_t insn_func_22(insn_t insn, reg_t reg);
+reg_t insn_func_24(insn_t insn, reg_t reg);
+reg_t insn_func_25(insn_t insn, reg_t reg);
+reg_t insn_func_26(insn_t insn, reg_t reg);
+reg_t insn_func_27(insn_t insn, reg_t reg);
+reg_t insn_func_28(insn_t insn, reg_t reg);
+reg_t insn_func_29(insn_t insn, reg_t reg);
+reg_t insn_func_34(insn_t insn, reg_t reg);
+reg_t insn_func_35(insn_t insn, reg_t reg);
+reg_t insn_func_50(insn_t insn, reg_t reg);
+reg_t insn_func_51(insn_t insn, reg_t reg);
+reg_t insn_func_55(insn_t insn, reg_t reg);
+reg_t insn_func_57(insn_t insn, reg_t reg);
+reg_t insn_func_58(insn_t insn, reg_t reg);
+reg_t insn_func_59(insn_t insn, reg_t reg);
+reg_t insn_func_66(insn_t insn, reg_t reg);
+reg_t insn_func_67(insn_t insn, reg_t reg);
+reg_t insn_func_71(insn_t insn, reg_t reg);
+reg_t insn_func_75(insn_t insn, reg_t reg);
+reg_t insn_func_79(insn_t insn, reg_t reg);
+reg_t insn_func_82(insn_t insn, reg_t reg);
+reg_t insn_func_83(insn_t insn, reg_t reg);
+reg_t insn_func_89(insn_t insn, reg_t reg);
+reg_t insn_func_90(insn_t insn, reg_t reg);
+reg_t insn_func_98(insn_t insn, reg_t reg);
+reg_t insn_func_99(insn_t insn, reg_t reg);
+reg_t insn_func_103(insn_t insn, reg_t reg);
+reg_t insn_func_107(insn_t insn, reg_t reg);
+reg_t insn_func_111(insn_t insn, reg_t reg);
+reg_t insn_func_114(insn_t insn, reg_t reg);
+reg_t insn_func_115(insn_t insn, reg_t reg);
+reg_t insn_func_119(insn_t insn, reg_t reg);
+reg_t insn_func_121(insn_t insn, reg_t reg);
+reg_t insn_func_122(insn_t insn, reg_t reg);
+reg_t insn_func_123(insn_t insn, reg_t reg);
+reg_t insn_func_130(insn_t insn, reg_t reg);
+reg_t insn_func_131(insn_t insn, reg_t reg);
+reg_t insn_func_139(insn_t insn, reg_t reg);
+reg_t insn_func_143(insn_t insn, reg_t reg);
+reg_t insn_func_146(insn_t insn, reg_t reg);
+reg_t insn_func_147(insn_t insn, reg_t reg);
+reg_t insn_func_153(insn_t insn, reg_t reg);
+reg_t insn_func_154(insn_t insn, reg_t reg);
+reg_t insn_func_155(insn_t insn, reg_t reg);
+reg_t insn_func_162(insn_t insn, reg_t reg);
+reg_t insn_func_163(insn_t insn, reg_t reg);
+reg_t insn_func_175(insn_t insn, reg_t reg);
+reg_t insn_func_178(insn_t insn, reg_t reg);
+reg_t insn_func_179(insn_t insn, reg_t reg);
+reg_t insn_func_185(insn_t insn, reg_t reg);
+reg_t insn_func_186(insn_t insn, reg_t reg);
+reg_t insn_func_187(insn_t insn, reg_t reg);
+reg_t insn_func_194(insn_t insn, reg_t reg);
+reg_t insn_func_195(insn_t insn, reg_t reg);
+reg_t insn_func_199(insn_t insn, reg_t reg);
+reg_t insn_func_203(insn_t insn, reg_t reg);
+reg_t insn_func_207(insn_t insn, reg_t reg);
+reg_t insn_func_210(insn_t insn, reg_t reg);
+reg_t insn_func_211(insn_t insn, reg_t reg);
+reg_t insn_func_217(insn_t insn, reg_t reg);
+reg_t insn_func_218(insn_t insn, reg_t reg);
+reg_t insn_func_226(insn_t insn, reg_t reg);
+reg_t insn_func_227(insn_t insn, reg_t reg);
+reg_t insn_func_235(insn_t insn, reg_t reg);
+reg_t insn_func_242(insn_t insn, reg_t reg);
+reg_t insn_func_243(insn_t insn, reg_t reg);
+reg_t insn_func_247(insn_t insn, reg_t reg);
+reg_t insn_func_249(insn_t insn, reg_t reg);
+reg_t insn_func_250(insn_t insn, reg_t reg);
+reg_t insn_func_251(insn_t insn, reg_t reg);
+reg_t insn_func_258(insn_t insn, reg_t reg);
+reg_t insn_func_259(insn_t insn, reg_t reg);
+reg_t insn_func_263(insn_t insn, reg_t reg);
+reg_t insn_func_267(insn_t insn, reg_t reg);
+reg_t insn_func_271(insn_t insn, reg_t reg);
+reg_t insn_func_274(insn_t insn, reg_t reg);
+reg_t insn_func_275(insn_t insn, reg_t reg);
+reg_t insn_func_281(insn_t insn, reg_t reg);
+reg_t insn_func_282(insn_t insn, reg_t reg);
+reg_t insn_func_284(insn_t insn, reg_t reg);
+reg_t insn_func_290(insn_t insn, reg_t reg);
+reg_t insn_func_291(insn_t insn, reg_t reg);
+reg_t insn_func_295(insn_t insn, reg_t reg);
+reg_t insn_func_299(insn_t insn, reg_t reg);
+reg_t insn_func_303(insn_t insn, reg_t reg);
+reg_t insn_func_306(insn_t insn, reg_t reg);
+reg_t insn_func_307(insn_t insn, reg_t reg);
+reg_t insn_func_313(insn_t insn, reg_t reg);
+reg_t insn_func_314(insn_t insn, reg_t reg);
+reg_t insn_func_322(insn_t insn, reg_t reg);
+reg_t insn_func_338(insn_t insn, reg_t reg);
+reg_t insn_func_345(insn_t insn, reg_t reg);
+reg_t insn_func_346(insn_t insn, reg_t reg);
+reg_t insn_func_354(insn_t insn, reg_t reg);
+reg_t insn_func_363(insn_t insn, reg_t reg);
+reg_t insn_func_370(insn_t insn, reg_t reg);
+reg_t insn_func_371(insn_t insn, reg_t reg);
+reg_t insn_func_375(insn_t insn, reg_t reg);
+reg_t insn_func_377(insn_t insn, reg_t reg);
+reg_t insn_func_378(insn_t insn, reg_t reg);
+reg_t insn_func_379(insn_t insn, reg_t reg);
+reg_t insn_func_386(insn_t insn, reg_t reg);
+reg_t insn_func_387(insn_t insn, reg_t reg);
+reg_t insn_func_391(insn_t insn, reg_t reg);
+reg_t insn_func_395(insn_t insn, reg_t reg);
+reg_t insn_func_399(insn_t insn, reg_t reg);
+reg_t insn_func_402(insn_t insn, reg_t reg);
+reg_t insn_func_403(insn_t insn, reg_t reg);
+reg_t insn_func_409(insn_t insn, reg_t reg);
+reg_t insn_func_410(insn_t insn, reg_t reg);
+reg_t insn_func_418(insn_t insn, reg_t reg);
+reg_t insn_func_419(insn_t insn, reg_t reg);
+reg_t insn_func_423(insn_t insn, reg_t reg);
+reg_t insn_func_427(insn_t insn, reg_t reg);
+reg_t insn_func_434(insn_t insn, reg_t reg);
+reg_t insn_func_435(insn_t insn, reg_t reg);
+reg_t insn_func_441(insn_t insn, reg_t reg);
+reg_t insn_func_442(insn_t insn, reg_t reg);
+reg_t insn_func_450(insn_t insn, reg_t reg);
+reg_t insn_func_466(insn_t insn, reg_t reg);
+reg_t insn_func_473(insn_t insn, reg_t reg);
+reg_t insn_func_474(insn_t insn, reg_t reg);
+reg_t insn_func_482(insn_t insn, reg_t reg);
+reg_t insn_func_498(insn_t insn, reg_t reg);
+reg_t insn_func_499(insn_t insn, reg_t reg);
+reg_t insn_func_503(insn_t insn, reg_t reg);
+reg_t insn_func_505(insn_t insn, reg_t reg);
+reg_t insn_func_506(insn_t insn, reg_t reg);
+reg_t insn_func_507(insn_t insn, reg_t reg);
+reg_t insn_func_514(insn_t insn, reg_t reg);
+reg_t insn_func_515(insn_t insn, reg_t reg);
+reg_t insn_func_523(insn_t insn, reg_t reg);
+reg_t insn_func_530(insn_t insn, reg_t reg);
+reg_t insn_func_531(insn_t insn, reg_t reg);
+reg_t insn_func_537(insn_t insn, reg_t reg);
+reg_t insn_func_538(insn_t insn, reg_t reg);
+reg_t insn_func_540(insn_t insn, reg_t reg);
+reg_t insn_func_546(insn_t insn, reg_t reg);
+reg_t insn_func_559(insn_t insn, reg_t reg);
+reg_t insn_func_562(insn_t insn, reg_t reg);
+reg_t insn_func_563(insn_t insn, reg_t reg);
+reg_t insn_func_569(insn_t insn, reg_t reg);
+reg_t insn_func_570(insn_t insn, reg_t reg);
+reg_t insn_func_571(insn_t insn, reg_t reg);
+reg_t insn_func_578(insn_t insn, reg_t reg);
+reg_t insn_func_594(insn_t insn, reg_t reg);
+reg_t insn_func_595(insn_t insn, reg_t reg);
+reg_t insn_func_601(insn_t insn, reg_t reg);
+reg_t insn_func_602(insn_t insn, reg_t reg);
+reg_t insn_func_610(insn_t insn, reg_t reg);
+reg_t insn_func_611(insn_t insn, reg_t reg);
+reg_t insn_func_619(insn_t insn, reg_t reg);
+reg_t insn_func_626(insn_t insn, reg_t reg);
+reg_t insn_func_631(insn_t insn, reg_t reg);
+reg_t insn_func_633(insn_t insn, reg_t reg);
+reg_t insn_func_634(insn_t insn, reg_t reg);
+reg_t insn_func_635(insn_t insn, reg_t reg);
+reg_t insn_func_642(insn_t insn, reg_t reg);
+reg_t insn_func_643(insn_t insn, reg_t reg);
+reg_t insn_func_651(insn_t insn, reg_t reg);
+reg_t insn_func_658(insn_t insn, reg_t reg);
+reg_t insn_func_659(insn_t insn, reg_t reg);
+reg_t insn_func_665(insn_t insn, reg_t reg);
+reg_t insn_func_666(insn_t insn, reg_t reg);
+reg_t insn_func_667(insn_t insn, reg_t reg);
+reg_t insn_func_674(insn_t insn, reg_t reg);
+reg_t insn_func_687(insn_t insn, reg_t reg);
+reg_t insn_func_690(insn_t insn, reg_t reg);
+reg_t insn_func_691(insn_t insn, reg_t reg);
+reg_t insn_func_697(insn_t insn, reg_t reg);
+reg_t insn_func_698(insn_t insn, reg_t reg);
+reg_t insn_func_699(insn_t insn, reg_t reg);
+reg_t insn_func_706(insn_t insn, reg_t reg);
+reg_t insn_func_722(insn_t insn, reg_t reg);
+reg_t insn_func_723(insn_t insn, reg_t reg);
+reg_t insn_func_729(insn_t insn, reg_t reg);
+reg_t insn_func_730(insn_t insn, reg_t reg);
+reg_t insn_func_738(insn_t insn, reg_t reg);
+reg_t insn_func_739(insn_t insn, reg_t reg);
+reg_t insn_func_754(insn_t insn, reg_t reg);
+reg_t insn_func_755(insn_t insn, reg_t reg);
+reg_t insn_func_759(insn_t insn, reg_t reg);
+reg_t insn_func_761(insn_t insn, reg_t reg);
+reg_t insn_func_762(insn_t insn, reg_t reg);
+reg_t insn_func_763(insn_t insn, reg_t reg);
+reg_t insn_func_770(insn_t insn, reg_t reg);
+reg_t insn_func_771(insn_t insn, reg_t reg);
+reg_t insn_func_779(insn_t insn, reg_t reg);
+reg_t insn_func_786(insn_t insn, reg_t reg);
+reg_t insn_func_787(insn_t insn, reg_t reg);
+reg_t insn_func_793(insn_t insn, reg_t reg);
+reg_t insn_func_794(insn_t insn, reg_t reg);
+reg_t insn_func_796(insn_t insn, reg_t reg);
+reg_t insn_func_802(insn_t insn, reg_t reg);
+reg_t insn_func_815(insn_t insn, reg_t reg);
+reg_t insn_func_818(insn_t insn, reg_t reg);
+reg_t insn_func_819(insn_t insn, reg_t reg);
+reg_t insn_func_825(insn_t insn, reg_t reg);
+reg_t insn_func_826(insn_t insn, reg_t reg);
+reg_t insn_func_827(insn_t insn, reg_t reg);
+reg_t insn_func_834(insn_t insn, reg_t reg);
+reg_t insn_func_850(insn_t insn, reg_t reg);
+reg_t insn_func_857(insn_t insn, reg_t reg);
+reg_t insn_func_858(insn_t insn, reg_t reg);
+reg_t insn_func_866(insn_t insn, reg_t reg);
+reg_t insn_func_867(insn_t insn, reg_t reg);
+reg_t insn_func_882(insn_t insn, reg_t reg);
+reg_t insn_func_889(insn_t insn, reg_t reg);
+reg_t insn_func_890(insn_t insn, reg_t reg);
+reg_t insn_func_898(insn_t insn, reg_t reg);
+reg_t insn_func_914(insn_t insn, reg_t reg);
+reg_t insn_func_915(insn_t insn, reg_t reg);
+reg_t insn_func_921(insn_t insn, reg_t reg);
+reg_t insn_func_922(insn_t insn, reg_t reg);
+reg_t insn_func_930(insn_t insn, reg_t reg);
+reg_t insn_func_943(insn_t insn, reg_t reg);
+reg_t insn_func_946(insn_t insn, reg_t reg);
+reg_t insn_func_947(insn_t insn, reg_t reg);
+reg_t insn_func_953(insn_t insn, reg_t reg);
+reg_t insn_func_954(insn_t insn, reg_t reg);
+reg_t insn_func_955(insn_t insn, reg_t reg);
+reg_t insn_func_962(insn_t insn, reg_t reg);
+reg_t insn_func_978(insn_t insn, reg_t reg);
+reg_t insn_func_985(insn_t insn, reg_t reg);
+reg_t insn_func_986(insn_t insn, reg_t reg);
+reg_t insn_func_994(insn_t insn, reg_t reg);
+reg_t insn_func_995(insn_t insn, reg_t reg);
+reg_t insn_func_1010(insn_t insn, reg_t reg);
+reg_t insn_func_1011(insn_t insn, reg_t reg);
+reg_t insn_func_1017(insn_t insn, reg_t reg);
+reg_t insn_func_1018(insn_t insn, reg_t reg);
index 6a8f8189492b58d67096b2bd7c2f3fbcee5a34e9..9496572fd9e2ca4ffa04d321205f66300cda0132 100644 (file)
@@ -5,18 +5,3 @@
 #include "softfloat.h"
 #include "platform.h" // softfloat isNaNF32UI, etc.
 #include "internals.h" // ditto
-
-#define DECLARE_INSN(name, opcode, mask) \
-  const uint32_t MATCH_ ## name = opcode; \
-  const uint32_t MASK_ ## name = mask;
-#include "opcodes.h"
-#undef DECLARE_INSN
-
-reg_t processor_t::FUNC (insn_t insn, reg_t pc)
-{
-  #define MASK (~(DISPATCH_TABLE_SIZE-1) & OPCODE_MASK)
-  #define MATCH (~(DISPATCH_TABLE_SIZE-1) & OPCODE_MATCH)
-  if(unlikely((insn.bits & MASK) != MATCH))
-    throw trap_illegal_instruction;
-
-  reg_t npc = pc + insn_length(OPCODE_MATCH);
index bd229246405399630fe3797931bb1608d599a32d..bb09eb50d353617e9e0bac6d4d064f2b87b63799 100644 (file)
@@ -12,7 +12,6 @@
 processor_t::processor_t(sim_t* _sim, mmu_t* _mmu)
   : sim(_sim), mmu(*_mmu)
 {
-  initialize_dispatch_table();
   // a few assumptions about endianness, including freg_t union
   static_assert(BYTE_ORDER == LITTLE_ENDIAN);
   static_assert(sizeof(freg_t) == 8);
@@ -266,54 +265,3 @@ void processor_t::disasm(insn_t insn, reg_t pc)
   #endif
   printf("\n");
 }
-
-// if the lower log2(DISPATCH_TABLE_SIZE) bits of an instruction
-// uniquely identify that instruction, the dispatch table points
-// directly to that insn_func.  otherwise, we search the short
-// list of instructions that match.
-
-insn_func_t processor_t::dispatch_table[DISPATCH_TABLE_SIZE];
-
-struct insn_chain_t
-{
-  insn_func_t func;
-  uint32_t opcode;
-  uint32_t mask;
-};
-static std::vector<insn_chain_t> dispatch_chain[DISPATCH_TABLE_SIZE];
-
-reg_t processor_t::dispatch(insn_t insn, reg_t pc)
-{
-  size_t idx = insn.bits % DISPATCH_TABLE_SIZE;
-  for(size_t i = 0; i < dispatch_chain[idx].size(); i++)
-  {
-    insn_chain_t& c = dispatch_chain[idx][i];
-    if((insn.bits & c.mask) == c.opcode)
-      return c.func(this, insn, pc);
-  }
-  throw trap_illegal_instruction;
-}
-
-void processor_t::initialize_dispatch_table()
-{
-  if(dispatch_table[0] != NULL)
-    return;
-
-  for(size_t i = 0; i < DISPATCH_TABLE_SIZE; i++)
-  {
-    #define DECLARE_INSN(name, opcode, mask) \
-      if((i & (mask)) == ((opcode) & (mask) & (DISPATCH_TABLE_SIZE-1))) \
-        dispatch_chain[i].push_back( \
-          (insn_chain_t){&processor_t::insn_func_ ## name, opcode, mask});
-    #include "opcodes.h"
-    #undef DECLARE_INSN
-  }
-
-  for(size_t i = 0; i < DISPATCH_TABLE_SIZE; i++)
-  {
-    if(dispatch_chain[i].size() == 1)
-      dispatch_table[i] = dispatch_chain[i][0].func;
-    else
-      dispatch_table[i] = &processor_t::dispatch;
-  }
-}
index ce07d464c36052a934208cef696dba025bfdacc4..b21663a3b1d60f31ea5fca0e54b30603d857439c 100644 (file)
@@ -9,10 +9,8 @@
 
 #define MAX_UTS 2048
 
-#define DISPATCH_TABLE_SIZE 1024
 class processor_t;
 typedef reg_t (*insn_func_t)(processor_t*, insn_t, reg_t);
-
 class sim_t;
 
 class processor_t
@@ -92,13 +90,7 @@ private:
 
   friend class sim_t;
 
-  static insn_func_t dispatch_table[DISPATCH_TABLE_SIZE];
-  reg_t dispatch(insn_t insn, reg_t pc);
-  static void initialize_dispatch_table();
-
-  #define DECLARE_INSN(name, m, o) reg_t insn_func_ ## name (insn_t, reg_t);
-  #include "opcodes.h"
-  #undef DECLARE_INSN
+  #include "dispatch.h"
 };
 
 #endif
index f6553c169a8cd60b011849dde769c6e8e6bf0f2b..f075f47c493af6e6ec79ffa2d754c4136132d75d 100644 (file)
@@ -15,6 +15,27 @@ riscv_hdrs = \
        opcodes.h \
        insn_header.h \
        insn_footer.h \
+       dispatch.h \
+
+NDISPATCH := 10
+DISPATCH_SRCS := \
+       dispatch0.cc \
+       dispatch1.cc \
+       dispatch2.cc \
+       dispatch3.cc \
+       dispatch4.cc \
+       dispatch5.cc \
+       dispatch6.cc \
+       dispatch7.cc \
+       dispatch8.cc \
+       dispatch9.cc \
+       dispatch10.cc \
+
+$(DISPATCH_SRCS): %.cc: dispatch $(wildcard insns/*.h) $(riscv_hdrs)
+       $< $(subst dispatch,,$(subst .cc,,$@)) $(NDISPATCH) 1024 < $(src_dir)/riscv/opcodes.h > $@
+
+$(src_dir)/riscv/dispatch.h: %.h: dispatch
+       $< $(NDISPATCH) 1024 < $(src_dir)/riscv/opcodes.h > $@
 
 $(patsubst %.h, %.cc, $(riscv_insn_hdrs)): %.cc: insns/%.h $(riscv_hdrs)
        @echo \#define FUNC insn_func_$(@:.cc=)      > $@
@@ -31,7 +52,7 @@ riscv_srcs = \
        trap.cc \
        icsim.cc \
        mmu.cc \
-       $(patsubst %.h, %.cc, $(riscv_insn_hdrs)) \
+       $(DISPATCH_SRCS) \
 
 riscv_test_srcs =