aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@s141.Millennium.Berkeley.EDU>2011-06-11 20:34:04 -0700
committerAndrew Waterman <waterman@s141.Millennium.Berkeley.EDU>2011-06-11 20:34:04 -0700
commit20bc10dc08b020974b135398fefefd67f58902a0 (patch)
tree0b1ce6ea731c4baac525932ddd5a3ae7dd18c3ef
parentf23ae8b0bcf325de2d691ca5ab1856c5cc32f57b (diff)
downloadspike-20bc10dc08b020974b135398fefefd67f58902a0.zip
spike-20bc10dc08b020974b135398fefefd67f58902a0.tar.gz
spike-20bc10dc08b020974b135398fefefd67f58902a0.tar.bz2
[xcc] fixed simulator build time
-rwxr-xr-xriscv/dispatch77
-rw-r--r--riscv/dispatch.h254
-rw-r--r--riscv/insn_header.h15
-rw-r--r--riscv/processor.cc52
-rw-r--r--riscv/processor.h10
-rw-r--r--riscv/riscv.mk.in23
6 files changed, 354 insertions, 77 deletions
diff --git a/riscv/dispatch b/riscv/dispatch
new file mode 100755
index 0000000..b96b364
--- /dev/null
+++ b/riscv/dispatch
@@ -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
index 0000000..7091899
--- /dev/null
+++ b/riscv/dispatch.h
@@ -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);
diff --git a/riscv/insn_header.h b/riscv/insn_header.h
index 6a8f818..9496572 100644
--- a/riscv/insn_header.h
+++ b/riscv/insn_header.h
@@ -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);
diff --git a/riscv/processor.cc b/riscv/processor.cc
index bd22924..bb09eb5 100644
--- a/riscv/processor.cc
+++ b/riscv/processor.cc
@@ -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;
- }
-}
diff --git a/riscv/processor.h b/riscv/processor.h
index ce07d46..b21663a 100644
--- a/riscv/processor.h
+++ b/riscv/processor.h
@@ -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
diff --git a/riscv/riscv.mk.in b/riscv/riscv.mk.in
index f6553c1..f075f47 100644
--- a/riscv/riscv.mk.in
+++ b/riscv/riscv.mk.in
@@ -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 =