Compare commits
	
		
			3 Commits
		
	
	
		
			212fb1c8ff
			...
			417076f8e6
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 417076f8e6 | |||
| 70839bbbf2 | |||
| 8db0cc5d05 | 
| @@ -1,86 +0,0 @@ | ||||
| #include "${coreDef.name.toLowerCase()}.h" | ||||
| #include <vector> | ||||
| #include <array> | ||||
| #include <cstdlib> | ||||
| #include <algorithm> | ||||
|  | ||||
| namespace iss { | ||||
| namespace arch { | ||||
| namespace { | ||||
| // according to | ||||
| // https://stackoverflow.com/questions/8871204/count-number-of-1s-in-binary-representation | ||||
| #ifdef __GCC__ | ||||
| constexpr size_t bit_count(uint32_t u) { return __builtin_popcount(u); } | ||||
| #elif __cplusplus < 201402L | ||||
| constexpr size_t uCount(uint32_t u) { return u - ((u >> 1) & 033333333333) - ((u >> 2) & 011111111111); } | ||||
| constexpr size_t bit_count(uint32_t u) { return ((uCount(u) + (uCount(u) >> 3)) & 030707070707) % 63; } | ||||
| #else | ||||
| constexpr size_t bit_count(uint32_t u) { | ||||
|     size_t uCount = u - ((u >> 1) & 033333333333) - ((u >> 2) & 011111111111); | ||||
|     return ((uCount + (uCount >> 3)) & 030707070707) % 63; | ||||
| } | ||||
| #endif | ||||
|  | ||||
| using opcode_e = traits<${coreDef.name.toLowerCase()}>::opcode_e; | ||||
|  | ||||
| /**************************************************************************** | ||||
|  * start opcode definitions | ||||
|  ****************************************************************************/ | ||||
| struct instruction_desriptor { | ||||
|     size_t length; | ||||
|     uint32_t value; | ||||
|     uint32_t mask; | ||||
|     opcode_e op; | ||||
| }; | ||||
|  | ||||
| const std::array<instruction_desriptor, ${instructions.size}> instr_descr = {{ | ||||
|      /* entries are: size, valid value, valid mask, function ptr */<%instructions.each{instr -> %> | ||||
|     {${instr.length}, ${instr.encoding}, ${instr.mask}, opcode_e::${instr.instruction.name}},<%}%> | ||||
| }}; | ||||
|  | ||||
| } | ||||
|  | ||||
| template<> | ||||
| struct instruction_decoder<${coreDef.name.toLowerCase()}> { | ||||
|     using opcode_e = traits<${coreDef.name.toLowerCase()}>::opcode_e; | ||||
|     using code_word_t=traits<${coreDef.name.toLowerCase()}>::code_word_t; | ||||
|  | ||||
|     struct instruction_pattern { | ||||
|         uint32_t value; | ||||
|         uint32_t mask; | ||||
|         opcode_e id; | ||||
|     }; | ||||
|  | ||||
|     std::array<std::vector<instruction_pattern>, 4> qlut; | ||||
|  | ||||
|     template<typename T> | ||||
|     unsigned decode_instruction(T); | ||||
|  | ||||
|     instruction_decoder() { | ||||
|         for (auto instr : instr_descr) { | ||||
|             auto quadrant = instr.value & 0x3; | ||||
|             qlut[quadrant].push_back(instruction_pattern{instr.value, instr.mask, instr.op}); | ||||
|         } | ||||
|         for(auto& lut: qlut){ | ||||
|             std::sort(std::begin(lut), std::end(lut), [](instruction_pattern const& a, instruction_pattern const& b){ | ||||
|                 return bit_count(a.mask) < bit_count(b.mask); | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
| }; | ||||
|  | ||||
| template<> | ||||
| unsigned instruction_decoder<${coreDef.name.toLowerCase()}>::decode_instruction<traits<${coreDef.name.toLowerCase()}>::code_word_t>(traits<${coreDef.name.toLowerCase()}>::code_word_t instr){ | ||||
|     auto res = std::find_if(std::begin(qlut[instr&0x3]), std::end(qlut[instr&0x3]), [instr](instruction_pattern const& e){ | ||||
|         return !((instr&e.mask) ^ e.value ); | ||||
|     }); | ||||
|     return static_cast<unsigned>(res!=std::end(qlut[instr&0x3])? res->id : opcode_e::MAX_OPCODE); | ||||
| } | ||||
|  | ||||
|  | ||||
| std::unique_ptr<instruction_decoder<${coreDef.name.toLowerCase()}>> traits<${coreDef.name.toLowerCase()}>::get_decoder(){ | ||||
|     return std::make_unique<instruction_decoder<${coreDef.name.toLowerCase()}>>(); | ||||
| } | ||||
|  | ||||
| } | ||||
| } | ||||
| @@ -172,8 +172,8 @@ private: | ||||
|         <%instr.behavior.eachLine{%>${it} | ||||
|         <%}%> | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,${idx}); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|     <%}%> | ||||
| @@ -306,6 +306,7 @@ template <typename ARCH> void vm_impl<ARCH>::gen_wait(tu_builder& tu, unsigned t | ||||
|  | ||||
| template <typename ARCH> void vm_impl<ARCH>::gen_trap_behavior(tu_builder& tu) { | ||||
|     tu("trap_entry:"); | ||||
|     this->gen_sync(tu, POST_SYNC, -1);     | ||||
|     tu("enter_trap(core_ptr, *trap_state, *pc, 0);"); | ||||
|     tu.store(traits::LAST_BRANCH, tu.constant(std::numeric_limits<uint32_t>::max(),32)); | ||||
|     tu("return *next_pc;"); | ||||
|   | ||||
| @@ -1,175 +0,0 @@ | ||||
| #include "tgc_c.h" | ||||
| #include <vector> | ||||
| #include <array> | ||||
| #include <cstdlib> | ||||
| #include <algorithm> | ||||
|  | ||||
| namespace iss { | ||||
| namespace arch { | ||||
| namespace { | ||||
| // according to | ||||
| // https://stackoverflow.com/questions/8871204/count-number-of-1s-in-binary-representation | ||||
| #ifdef __GCC__ | ||||
| constexpr size_t bit_count(uint32_t u) { return __builtin_popcount(u); } | ||||
| #elif __cplusplus < 201402L | ||||
| constexpr size_t uCount(uint32_t u) { return u - ((u >> 1) & 033333333333) - ((u >> 2) & 011111111111); } | ||||
| constexpr size_t bit_count(uint32_t u) { return ((uCount(u) + (uCount(u) >> 3)) & 030707070707) % 63; } | ||||
| #else | ||||
| constexpr size_t bit_count(uint32_t u) { | ||||
|     size_t uCount = u - ((u >> 1) & 033333333333) - ((u >> 2) & 011111111111); | ||||
|     return ((uCount + (uCount >> 3)) & 030707070707) % 63; | ||||
| } | ||||
| #endif | ||||
|  | ||||
| using opcode_e = traits<tgc_c>::opcode_e; | ||||
|  | ||||
| /**************************************************************************** | ||||
|  * start opcode definitions | ||||
|  ****************************************************************************/ | ||||
| struct instruction_desriptor { | ||||
|     size_t length; | ||||
|     uint32_t value; | ||||
|     uint32_t mask; | ||||
|     opcode_e op; | ||||
| }; | ||||
|  | ||||
| const std::array<instruction_desriptor, 90> instr_descr = {{ | ||||
|      /* entries are: size, valid value, valid mask, function ptr */ | ||||
|     {32, 0b00000000000000000000000000110111, 0b00000000000000000000000001111111, opcode_e::LUI}, | ||||
|     {32, 0b00000000000000000000000000010111, 0b00000000000000000000000001111111, opcode_e::AUIPC}, | ||||
|     {32, 0b00000000000000000000000001101111, 0b00000000000000000000000001111111, opcode_e::JAL}, | ||||
|     {32, 0b00000000000000000000000001100111, 0b00000000000000000111000001111111, opcode_e::JALR}, | ||||
|     {32, 0b00000000000000000000000001100011, 0b00000000000000000111000001111111, opcode_e::BEQ}, | ||||
|     {32, 0b00000000000000000001000001100011, 0b00000000000000000111000001111111, opcode_e::BNE}, | ||||
|     {32, 0b00000000000000000100000001100011, 0b00000000000000000111000001111111, opcode_e::BLT}, | ||||
|     {32, 0b00000000000000000101000001100011, 0b00000000000000000111000001111111, opcode_e::BGE}, | ||||
|     {32, 0b00000000000000000110000001100011, 0b00000000000000000111000001111111, opcode_e::BLTU}, | ||||
|     {32, 0b00000000000000000111000001100011, 0b00000000000000000111000001111111, opcode_e::BGEU}, | ||||
|     {32, 0b00000000000000000000000000000011, 0b00000000000000000111000001111111, opcode_e::LB}, | ||||
|     {32, 0b00000000000000000001000000000011, 0b00000000000000000111000001111111, opcode_e::LH}, | ||||
|     {32, 0b00000000000000000010000000000011, 0b00000000000000000111000001111111, opcode_e::LW}, | ||||
|     {32, 0b00000000000000000100000000000011, 0b00000000000000000111000001111111, opcode_e::LBU}, | ||||
|     {32, 0b00000000000000000101000000000011, 0b00000000000000000111000001111111, opcode_e::LHU}, | ||||
|     {32, 0b00000000000000000000000000100011, 0b00000000000000000111000001111111, opcode_e::SB}, | ||||
|     {32, 0b00000000000000000001000000100011, 0b00000000000000000111000001111111, opcode_e::SH}, | ||||
|     {32, 0b00000000000000000010000000100011, 0b00000000000000000111000001111111, opcode_e::SW}, | ||||
|     {32, 0b00000000000000000000000000010011, 0b00000000000000000111000001111111, opcode_e::ADDI}, | ||||
|     {32, 0b00000000000000000010000000010011, 0b00000000000000000111000001111111, opcode_e::SLTI}, | ||||
|     {32, 0b00000000000000000011000000010011, 0b00000000000000000111000001111111, opcode_e::SLTIU}, | ||||
|     {32, 0b00000000000000000100000000010011, 0b00000000000000000111000001111111, opcode_e::XORI}, | ||||
|     {32, 0b00000000000000000110000000010011, 0b00000000000000000111000001111111, opcode_e::ORI}, | ||||
|     {32, 0b00000000000000000111000000010011, 0b00000000000000000111000001111111, opcode_e::ANDI}, | ||||
|     {32, 0b00000000000000000001000000010011, 0b11111110000000000111000001111111, opcode_e::SLLI}, | ||||
|     {32, 0b00000000000000000101000000010011, 0b11111110000000000111000001111111, opcode_e::SRLI}, | ||||
|     {32, 0b01000000000000000101000000010011, 0b11111110000000000111000001111111, opcode_e::SRAI}, | ||||
|     {32, 0b00000000000000000000000000110011, 0b11111110000000000111000001111111, opcode_e::ADD}, | ||||
|     {32, 0b01000000000000000000000000110011, 0b11111110000000000111000001111111, opcode_e::SUB}, | ||||
|     {32, 0b00000000000000000001000000110011, 0b11111110000000000111000001111111, opcode_e::SLL}, | ||||
|     {32, 0b00000000000000000010000000110011, 0b11111110000000000111000001111111, opcode_e::SLT}, | ||||
|     {32, 0b00000000000000000011000000110011, 0b11111110000000000111000001111111, opcode_e::SLTU}, | ||||
|     {32, 0b00000000000000000100000000110011, 0b11111110000000000111000001111111, opcode_e::XOR}, | ||||
|     {32, 0b00000000000000000101000000110011, 0b11111110000000000111000001111111, opcode_e::SRL}, | ||||
|     {32, 0b01000000000000000101000000110011, 0b11111110000000000111000001111111, opcode_e::SRA}, | ||||
|     {32, 0b00000000000000000110000000110011, 0b11111110000000000111000001111111, opcode_e::OR}, | ||||
|     {32, 0b00000000000000000111000000110011, 0b11111110000000000111000001111111, opcode_e::AND}, | ||||
|     {32, 0b00000000000000000000000000001111, 0b00000000000000000111000001111111, opcode_e::FENCE}, | ||||
|     {32, 0b00000000000000000000000001110011, 0b11111111111111111111111111111111, opcode_e::ECALL}, | ||||
|     {32, 0b00000000000100000000000001110011, 0b11111111111111111111111111111111, opcode_e::EBREAK}, | ||||
|     {32, 0b00000000001000000000000001110011, 0b11111111111111111111111111111111, opcode_e::URET}, | ||||
|     {32, 0b00010000001000000000000001110011, 0b11111111111111111111111111111111, opcode_e::SRET}, | ||||
|     {32, 0b00110000001000000000000001110011, 0b11111111111111111111111111111111, opcode_e::MRET}, | ||||
|     {32, 0b00010000010100000000000001110011, 0b11111111111111111111111111111111, opcode_e::WFI}, | ||||
|     {32, 0b01111011001000000000000001110011, 0b11111111111111111111111111111111, opcode_e::DRET}, | ||||
|     {32, 0b00000000000000000001000001110011, 0b00000000000000000111000001111111, opcode_e::CSRRW}, | ||||
|     {32, 0b00000000000000000010000001110011, 0b00000000000000000111000001111111, opcode_e::CSRRS}, | ||||
|     {32, 0b00000000000000000011000001110011, 0b00000000000000000111000001111111, opcode_e::CSRRC}, | ||||
|     {32, 0b00000000000000000101000001110011, 0b00000000000000000111000001111111, opcode_e::CSRRWI}, | ||||
|     {32, 0b00000000000000000110000001110011, 0b00000000000000000111000001111111, opcode_e::CSRRSI}, | ||||
|     {32, 0b00000000000000000111000001110011, 0b00000000000000000111000001111111, opcode_e::CSRRCI}, | ||||
|     {32, 0b00000000000000000001000000001111, 0b00000000000000000111000001111111, opcode_e::FENCE_I}, | ||||
|     {32, 0b00000010000000000000000000110011, 0b11111110000000000111000001111111, opcode_e::MUL}, | ||||
|     {32, 0b00000010000000000001000000110011, 0b11111110000000000111000001111111, opcode_e::MULH}, | ||||
|     {32, 0b00000010000000000010000000110011, 0b11111110000000000111000001111111, opcode_e::MULHSU}, | ||||
|     {32, 0b00000010000000000011000000110011, 0b11111110000000000111000001111111, opcode_e::MULHU}, | ||||
|     {32, 0b00000010000000000100000000110011, 0b11111110000000000111000001111111, opcode_e::DIV}, | ||||
|     {32, 0b00000010000000000101000000110011, 0b11111110000000000111000001111111, opcode_e::DIVU}, | ||||
|     {32, 0b00000010000000000110000000110011, 0b11111110000000000111000001111111, opcode_e::REM}, | ||||
|     {32, 0b00000010000000000111000000110011, 0b11111110000000000111000001111111, opcode_e::REMU}, | ||||
|     {16, 0b0000000000000000, 0b1110000000000011, opcode_e::CADDI4SPN}, | ||||
|     {16, 0b0100000000000000, 0b1110000000000011, opcode_e::CLW}, | ||||
|     {16, 0b1100000000000000, 0b1110000000000011, opcode_e::CSW}, | ||||
|     {16, 0b0000000000000001, 0b1110000000000011, opcode_e::CADDI}, | ||||
|     {16, 0b0000000000000001, 0b1110111110000011, opcode_e::CNOP}, | ||||
|     {16, 0b0010000000000001, 0b1110000000000011, opcode_e::CJAL}, | ||||
|     {16, 0b0100000000000001, 0b1110000000000011, opcode_e::CLI}, | ||||
|     {16, 0b0110000000000001, 0b1110000000000011, opcode_e::CLUI}, | ||||
|     {16, 0b0110000100000001, 0b1110111110000011, opcode_e::CADDI16SP}, | ||||
|     {16, 0b0110000000000001, 0b1111000001111111, opcode_e::__reserved_clui}, | ||||
|     {16, 0b1000000000000001, 0b1111110000000011, opcode_e::CSRLI}, | ||||
|     {16, 0b1000010000000001, 0b1111110000000011, opcode_e::CSRAI}, | ||||
|     {16, 0b1000100000000001, 0b1110110000000011, opcode_e::CANDI}, | ||||
|     {16, 0b1000110000000001, 0b1111110001100011, opcode_e::CSUB}, | ||||
|     {16, 0b1000110000100001, 0b1111110001100011, opcode_e::CXOR}, | ||||
|     {16, 0b1000110001000001, 0b1111110001100011, opcode_e::COR}, | ||||
|     {16, 0b1000110001100001, 0b1111110001100011, opcode_e::CAND}, | ||||
|     {16, 0b1010000000000001, 0b1110000000000011, opcode_e::CJ}, | ||||
|     {16, 0b1100000000000001, 0b1110000000000011, opcode_e::CBEQZ}, | ||||
|     {16, 0b1110000000000001, 0b1110000000000011, opcode_e::CBNEZ}, | ||||
|     {16, 0b0000000000000010, 0b1111000000000011, opcode_e::CSLLI}, | ||||
|     {16, 0b0100000000000010, 0b1110000000000011, opcode_e::CLWSP}, | ||||
|     {16, 0b1000000000000010, 0b1111000000000011, opcode_e::CMV}, | ||||
|     {16, 0b1000000000000010, 0b1111000001111111, opcode_e::CJR}, | ||||
|     {16, 0b1000000000000010, 0b1111111111111111, opcode_e::__reserved_cmv}, | ||||
|     {16, 0b1001000000000010, 0b1111000000000011, opcode_e::CADD}, | ||||
|     {16, 0b1001000000000010, 0b1111000001111111, opcode_e::CJALR}, | ||||
|     {16, 0b1001000000000010, 0b1111111111111111, opcode_e::CEBREAK}, | ||||
|     {16, 0b1100000000000010, 0b1110000000000011, opcode_e::CSWSP}, | ||||
|     {16, 0b0000000000000000, 0b1111111111111111, opcode_e::DII}, | ||||
| }}; | ||||
|  | ||||
| } | ||||
|  | ||||
| template<> | ||||
| struct instruction_decoder<tgc_c> { | ||||
|     using opcode_e = traits<tgc_c>::opcode_e; | ||||
|     using code_word_t=traits<tgc_c>::code_word_t; | ||||
|  | ||||
|     struct instruction_pattern { | ||||
|         uint32_t value; | ||||
|         uint32_t mask; | ||||
|         opcode_e id; | ||||
|     }; | ||||
|  | ||||
|     std::array<std::vector<instruction_pattern>, 4> qlut; | ||||
|  | ||||
|     template<typename T> | ||||
|     unsigned decode_instruction(T); | ||||
|  | ||||
|     instruction_decoder() { | ||||
|         for (auto instr : instr_descr) { | ||||
|             auto quadrant = instr.value & 0x3; | ||||
|             qlut[quadrant].push_back(instruction_pattern{instr.value, instr.mask, instr.op}); | ||||
|         } | ||||
|         for(auto& lut: qlut){ | ||||
|             std::sort(std::begin(lut), std::end(lut), [](instruction_pattern const& a, instruction_pattern const& b){ | ||||
|                 return bit_count(a.mask) > bit_count(b.mask); | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
| }; | ||||
|  | ||||
| template<> | ||||
| unsigned instruction_decoder<tgc_c>::decode_instruction<traits<tgc_c>::code_word_t>(traits<tgc_c>::code_word_t instr){ | ||||
|     auto res = std::find_if(std::begin(qlut[instr&0x3]), std::end(qlut[instr&0x3]), [instr](instruction_pattern const& e){ | ||||
|         return !((instr&e.mask) ^ e.value ); | ||||
|     }); | ||||
|     return static_cast<unsigned>(res!=std::end(qlut[instr&0x3])? res->id : opcode_e::MAX_OPCODE); | ||||
| } | ||||
|  | ||||
|  | ||||
| std::unique_ptr<instruction_decoder<tgc_c>> traits<tgc_c>::get_decoder(){ | ||||
|     return std::make_unique<instruction_decoder<tgc_c>>(); | ||||
| } | ||||
|  | ||||
| } | ||||
| } | ||||
| @@ -2218,8 +2218,8 @@ private: | ||||
|         pc=pc+ 4; | ||||
|         this->gen_set_pc(pc, traits::NEXT_PC); | ||||
|         this->gen_raise_trap(0,  11); | ||||
|         bb = BasicBlock::Create(this->mod->getContext(), "entry", this->func, this->leave_blk); | ||||
|         auto returnValue = std::make_tuple(CONT,bb); | ||||
|         bb = this->leave_blk; | ||||
|         auto returnValue = std::make_tuple(TRAP,nullptr); | ||||
|          | ||||
|         this->gen_trap_check(bb); | ||||
|     	this->gen_sync(POST_SYNC, 38); | ||||
| @@ -2240,8 +2240,8 @@ private: | ||||
|         pc=pc+ 4; | ||||
|         this->gen_set_pc(pc, traits::NEXT_PC); | ||||
|         this->gen_raise_trap(0,  3); | ||||
|         bb = BasicBlock::Create(this->mod->getContext(), "entry", this->func, this->leave_blk); | ||||
|         auto returnValue = std::make_tuple(CONT,bb); | ||||
|         bb = this->leave_blk; | ||||
|         auto returnValue = std::make_tuple(TRAP,nullptr); | ||||
|          | ||||
|         this->gen_trap_check(bb); | ||||
|     	this->gen_sync(POST_SYNC, 39); | ||||
| @@ -2262,8 +2262,8 @@ private: | ||||
|         pc=pc+ 4; | ||||
|         this->gen_set_pc(pc, traits::NEXT_PC); | ||||
|         this->gen_leave_trap(3); | ||||
|         bb = BasicBlock::Create(this->mod->getContext(), "entry", this->func, this->leave_blk); | ||||
|         auto returnValue = std::make_tuple(CONT,bb); | ||||
|         bb = this->leave_blk; | ||||
|         auto returnValue = std::make_tuple(TRAP,nullptr); | ||||
|          | ||||
|         this->gen_trap_check(bb); | ||||
|     	this->gen_sync(POST_SYNC, 40); | ||||
| @@ -4282,8 +4282,8 @@ private: | ||||
|         pc=pc+ 2; | ||||
|         this->gen_set_pc(pc, traits::NEXT_PC); | ||||
|         this->gen_raise_trap(0,  3); | ||||
|         bb = BasicBlock::Create(this->mod->getContext(), "entry", this->func, this->leave_blk); | ||||
|         auto returnValue = std::make_tuple(CONT,bb); | ||||
|         bb = this->leave_blk; | ||||
|         auto returnValue = std::make_tuple(TRAP,nullptr); | ||||
|          | ||||
|         this->gen_trap_check(bb); | ||||
|     	this->gen_sync(POST_SYNC, 84); | ||||
| @@ -4351,8 +4351,8 @@ private: | ||||
|         pc=pc+ 2; | ||||
|         this->gen_set_pc(pc, traits::NEXT_PC); | ||||
|         this->gen_raise_trap(0,  2); | ||||
|         bb = BasicBlock::Create(this->mod->getContext(), "entry", this->func, this->leave_blk); | ||||
|         auto returnValue = std::make_tuple(CONT,bb); | ||||
|         bb = this->leave_blk; | ||||
|         auto returnValue = std::make_tuple(TRAP,nullptr); | ||||
|          | ||||
|         this->gen_trap_check(bb); | ||||
|     	this->gen_sync(POST_SYNC, 86); | ||||
|   | ||||
| @@ -357,8 +357,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,0); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -392,8 +392,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,1); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -434,8 +434,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(BRANCH); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,2); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -485,8 +485,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(BRANCH); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,3); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -528,8 +528,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(BRANCH); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,4); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -571,8 +571,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(BRANCH); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,5); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -614,8 +614,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(BRANCH); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,6); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -657,8 +657,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(BRANCH); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,7); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -700,8 +700,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(BRANCH); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,8); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -743,8 +743,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(BRANCH); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,9); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -783,8 +783,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,10); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -823,8 +823,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,11); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -863,8 +863,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,12); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -903,8 +903,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,13); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -943,8 +943,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,14); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -979,8 +979,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,15); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -1015,8 +1015,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,16); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -1051,8 +1051,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,17); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -1089,8 +1089,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,18); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -1127,8 +1127,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,19); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -1165,8 +1165,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,20); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -1203,8 +1203,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,21); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -1241,8 +1241,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,22); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -1279,8 +1279,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,23); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -1317,8 +1317,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,24); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -1355,8 +1355,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,25); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -1393,8 +1393,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,26); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -1431,8 +1431,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,27); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -1469,8 +1469,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,28); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -1509,8 +1509,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,29); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -1547,8 +1547,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,30); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -1585,8 +1585,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,31); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -1623,8 +1623,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,32); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -1663,8 +1663,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,33); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -1703,8 +1703,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,34); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -1741,8 +1741,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,35); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -1779,8 +1779,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,36); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -1809,8 +1809,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,37); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -1828,11 +1828,11 @@ private: | ||||
|         gen_set_pc(tu, pc, traits::NEXT_PC); | ||||
|         tu.open_scope(); | ||||
|         this->gen_raise_trap(tu, 0,  11); | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|         auto returnValue = std::make_tuple(TRAP); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,38); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -1850,11 +1850,11 @@ private: | ||||
|         gen_set_pc(tu, pc, traits::NEXT_PC); | ||||
|         tu.open_scope(); | ||||
|         this->gen_raise_trap(tu, 0,  3); | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|         auto returnValue = std::make_tuple(TRAP); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,39); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -1872,11 +1872,11 @@ private: | ||||
|         gen_set_pc(tu, pc, traits::NEXT_PC); | ||||
|         tu.open_scope(); | ||||
|         this->gen_leave_trap(tu, 3); | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|         auto returnValue = std::make_tuple(TRAP); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,40); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -1897,8 +1897,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,41); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -1938,8 +1938,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,42); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -1981,8 +1981,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,43); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -2024,8 +2024,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,44); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -2062,8 +2062,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,45); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -2104,8 +2104,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,46); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -2146,8 +2146,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,47); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -2174,8 +2174,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,48); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -2213,8 +2213,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,49); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -2254,8 +2254,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,50); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -2295,8 +2295,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,51); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -2336,8 +2336,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,52); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -2394,8 +2394,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,53); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -2441,8 +2441,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,54); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -2502,8 +2502,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,55); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -2549,8 +2549,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,56); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -2584,8 +2584,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,57); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -2616,8 +2616,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,58); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -2647,8 +2647,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,59); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -2684,8 +2684,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,60); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -2706,8 +2706,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,61); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -2736,8 +2736,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(BRANCH); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,62); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -2771,8 +2771,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,63); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -2804,8 +2804,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,64); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -2838,8 +2838,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,65); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -2861,8 +2861,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,66); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -2891,8 +2891,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,67); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -2929,8 +2929,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,68); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -2959,8 +2959,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,69); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -2989,8 +2989,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,70); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -3019,8 +3019,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,71); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -3049,8 +3049,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,72); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -3079,8 +3079,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,73); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -3107,8 +3107,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(BRANCH); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,74); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -3140,8 +3140,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(BRANCH); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,75); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -3173,8 +3173,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(BRANCH); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,76); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -3210,8 +3210,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,77); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -3246,8 +3246,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,78); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -3281,8 +3281,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,79); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -3316,8 +3316,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(BRANCH); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,80); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -3338,8 +3338,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,81); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -3375,8 +3375,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,82); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -3414,8 +3414,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(BRANCH); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,83); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -3433,11 +3433,11 @@ private: | ||||
|         gen_set_pc(tu, pc, traits::NEXT_PC); | ||||
|         tu.open_scope(); | ||||
|         this->gen_raise_trap(tu, 0,  3); | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|         auto returnValue = std::make_tuple(TRAP); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,84); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -3471,8 +3471,8 @@ private: | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,85); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -3490,11 +3490,11 @@ private: | ||||
|         gen_set_pc(tu, pc, traits::NEXT_PC); | ||||
|         tu.open_scope(); | ||||
|         this->gen_raise_trap(tu, 0,  2); | ||||
|         auto returnValue = std::make_tuple(CONT); | ||||
|         auto returnValue = std::make_tuple(TRAP); | ||||
|          | ||||
|         tu.close_scope(); | ||||
|         gen_trap_check(tu);         | ||||
|         vm_base<ARCH>::gen_sync(tu, POST_SYNC,86); | ||||
|         gen_trap_check(tu); | ||||
|         return returnValue; | ||||
|     } | ||||
|      | ||||
| @@ -3627,6 +3627,7 @@ template <typename ARCH> void vm_impl<ARCH>::gen_wait(tu_builder& tu, unsigned t | ||||
|  | ||||
| template <typename ARCH> void vm_impl<ARCH>::gen_trap_behavior(tu_builder& tu) { | ||||
|     tu("trap_entry:"); | ||||
|     this->gen_sync(tu, POST_SYNC, -1);     | ||||
|     tu("enter_trap(core_ptr, *trap_state, *pc, 0);"); | ||||
|     tu.store(traits::LAST_BRANCH, tu.constant(std::numeric_limits<uint32_t>::max(),32)); | ||||
|     tu("return *next_pc;"); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user