From 20bc10dc08b020974b135398fefefd67f58902a0 Mon Sep 17 00:00:00 2001 From: Andrew Waterman Date: Sat, 11 Jun 2011 20:34:04 -0700 Subject: [PATCH] [xcc] fixed simulator build time --- riscv/dispatch | 77 ++++++++++++++ riscv/dispatch.h | 254 ++++++++++++++++++++++++++++++++++++++++++++ riscv/insn_header.h | 15 --- riscv/processor.cc | 52 --------- riscv/processor.h | 10 +- riscv/riscv.mk.in | 23 +++- 6 files changed, 354 insertions(+), 77 deletions(-) create mode 100755 riscv/dispatch create mode 100644 riscv/dispatch.h 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 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 = -- 2.30.2