C++11 refactoring

This commit is contained in:
2018-02-06 11:34:34 +00:00
parent cb8b5e6d4b
commit 7c2539bff0
14 changed files with 623 additions and 216 deletions

View File

@ -45,6 +45,7 @@
#include <boost/format.hpp>
#include <iss/debugger/riscv_target_adapter.h>
#include <array>
namespace iss {
namespace CORE_DEF_NAME {
@ -121,14 +122,14 @@ protected:
using compile_func = std::tuple<vm::continuation_e, llvm::BasicBlock *> (this_class::*)(virt_addr_t &pc,
code_word_t instr,
llvm::BasicBlock *bb);
compile_func lut[LUT_SIZE];
std::array<compile_func, LUT_SIZE> lut;
std::array<compile_func, LUT_SIZE_C> lut_00, lut_01, lut_10;
std::array<compile_func, LUT_SIZE> lut_11;
compile_func *qlut[4]; // = {lut_00, lut_01, lut_10, lut_11};
std::array<compile_func*, 4> qlut;
const uint32_t lutmasks[4] = {EXTR_MASK16, EXTR_MASK16, EXTR_MASK16, EXTR_MASK32};
std::array<const uint32_t, 4> lutmasks = { { EXTR_MASK16, EXTR_MASK16, EXTR_MASK16, EXTR_MASK32 } };
void expand_bit_mask(int pos, uint32_t mask, uint32_t value, uint32_t valid, uint32_t idx, compile_func lut[],
compile_func f) {
@ -179,14 +180,14 @@ private:
};
/* «start generated code» */
InstructionDesriptor instr_descr[0] = {};
std::array<InstructionDesriptor, 0> instr_descr = { { } };
/* «end generated code» */
/****************************************************************************
* end opcode definitions
****************************************************************************/
std::tuple<vm::continuation_e, llvm::BasicBlock *> illegal_intruction(virt_addr_t &pc, code_word_t instr,
llvm::BasicBlock *bb) {
this->gen_sync(iss::PRE_SYNC, sizeof(instr_descr)/sizeof(InstructionDesriptor));
this->gen_sync(iss::PRE_SYNC, instr_descr.size());
this->builder.CreateStore(this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::NEXT_PC), true),
get_reg_ptr(traits<ARCH>::PC), true);
this->builder.CreateStore(
@ -195,7 +196,7 @@ private:
get_reg_ptr(traits<ARCH>::ICOUNT), true);
pc = pc + ((instr & 3) == 3 ? 4 : 2);
this->gen_raise_trap(0, 2); // illegal instruction trap
this->gen_sync(iss::POST_SYNC, sizeof(instr_descr)/sizeof(InstructionDesriptor));
this->gen_sync(iss::POST_SYNC, instr_descr.size());
this->gen_trap_check(this->leave_blk);
return std::make_tuple(iss::vm::BRANCH, nullptr);
}

View File

@ -45,6 +45,7 @@
#include <boost/format.hpp>
#include <iss/debugger/riscv_target_adapter.h>
#include <array>
namespace iss {
namespace rv32imac {
@ -121,14 +122,14 @@ protected:
using compile_func = std::tuple<vm::continuation_e, llvm::BasicBlock *> (this_class::*)(virt_addr_t &pc,
code_word_t instr,
llvm::BasicBlock *bb);
compile_func lut[LUT_SIZE];
std::array<compile_func, LUT_SIZE> lut;
std::array<compile_func, LUT_SIZE_C> lut_00, lut_01, lut_10;
std::array<compile_func, LUT_SIZE> lut_11;
compile_func *qlut[4]; // = {lut_00, lut_01, lut_10, lut_11};
std::array<compile_func*, 4> qlut;
const uint32_t lutmasks[4] = {EXTR_MASK16, EXTR_MASK16, EXTR_MASK16, EXTR_MASK32};
std::array<const uint32_t, 4> lutmasks = { { EXTR_MASK16, EXTR_MASK16, EXTR_MASK16, EXTR_MASK32 } };
void expand_bit_mask(int pos, uint32_t mask, uint32_t value, uint32_t valid, uint32_t idx, compile_func lut[],
compile_func f) {
@ -179,7 +180,7 @@ private:
};
/* start generated code */
const InstructionDesriptor instr_descr[99] = {
const std::array<InstructionDesriptor, 99> instr_descr = {{
/* entries are: valid value, valid mask, function ptr */
/* instruction LUI */
{32, 0b00000000000000000000000000110111, 0b00000000000000000000000001111111, &this_class::__lui},
@ -379,7 +380,7 @@ private:
{16, 0b1100000000000010, 0b1110000000000011, &this_class::__c_swsp},
/* instruction DII */
{16, 0b0000000000000000, 0b1111111111111111, &this_class::__dii},
};
}};
//0: instruction LUI
std::tuple<vm::continuation_e, llvm::BasicBlock*> __lui(virt_addr_t& pc, code_word_t instr, llvm::BasicBlock* bb){
bb->setName("LUI");
@ -399,6 +400,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -431,11 +434,13 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
Value* X_rd_val = this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(32U, fld_imm_val));
this->builder.CreateStore(X_rd_val, get_reg_ptr(fld_rd_val), false);
}
@ -465,16 +470,18 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
Value* X_rd_val = this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(32U, 4));
this->builder.CreateStore(X_rd_val, get_reg_ptr(fld_rd_val), false);
}
Value* PC_val = this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(32U, fld_imm_val));
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
this->gen_sync(iss::POST_SYNC, 2);
@ -502,11 +509,13 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
Value* X_rd_val = this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(32U, 4));
this->builder.CreateStore(X_rd_val, get_reg_ptr(fld_rd_val), false);
}
@ -542,6 +551,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
Value* PC_val = this->gen_choose(
@ -550,10 +561,10 @@ private:
this->gen_reg_load(fld_rs1_val, 0),
this->gen_reg_load(fld_rs2_val, 0)),
this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(32U, fld_imm_val)),
this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(32U, 4)),
32);
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
@ -582,6 +593,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
Value* PC_val = this->gen_choose(
@ -590,10 +603,10 @@ private:
this->gen_reg_load(fld_rs1_val, 0),
this->gen_reg_load(fld_rs2_val, 0)),
this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(32U, fld_imm_val)),
this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(32U, 4)),
32);
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
@ -622,6 +635,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
Value* PC_val = this->gen_choose(
@ -634,10 +649,10 @@ private:
this->gen_reg_load(fld_rs2_val, 0),
32, true)),
this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(32U, fld_imm_val)),
this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(32U, 4)),
32);
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
@ -666,6 +681,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
Value* PC_val = this->gen_choose(
@ -678,10 +695,10 @@ private:
this->gen_reg_load(fld_rs2_val, 0),
32, true)),
this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(32U, fld_imm_val)),
this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(32U, 4)),
32);
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
@ -710,6 +727,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
Value* PC_val = this->gen_choose(
@ -718,10 +737,10 @@ private:
this->gen_reg_load(fld_rs1_val, 0),
this->gen_reg_load(fld_rs2_val, 0)),
this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(32U, fld_imm_val)),
this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(32U, 4)),
32);
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
@ -750,6 +769,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
Value* PC_val = this->gen_choose(
@ -758,10 +779,10 @@ private:
this->gen_reg_load(fld_rs1_val, 0),
this->gen_reg_load(fld_rs2_val, 0)),
this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(32U, fld_imm_val)),
this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(32U, 4)),
32);
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
@ -790,6 +811,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
Value* offs_val = this->builder.CreateAdd(
@ -829,6 +852,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
Value* offs_val = this->builder.CreateAdd(
@ -868,6 +893,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
Value* offs_val = this->builder.CreateAdd(
@ -907,6 +934,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
Value* offs_val = this->builder.CreateAdd(
@ -946,6 +975,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
Value* offs_val = this->builder.CreateAdd(
@ -985,6 +1016,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
Value* offs_val = this->builder.CreateAdd(
@ -1022,6 +1055,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
Value* offs_val = this->builder.CreateAdd(
@ -1059,6 +1094,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
Value* offs_val = this->builder.CreateAdd(
@ -1096,6 +1133,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -1131,6 +1170,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -1175,6 +1216,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
int32_t full_imm_val = fld_imm_val;
@ -1220,6 +1263,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -1255,6 +1300,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -1290,6 +1337,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -1325,6 +1374,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
if(fld_shamt_val > 31){
@ -1364,6 +1415,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
if(fld_shamt_val > 31){
@ -1403,6 +1456,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
if(fld_shamt_val > 31){
@ -1442,6 +1497,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -1477,6 +1534,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -1512,6 +1571,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -1549,6 +1610,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -1593,6 +1656,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -1639,6 +1704,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -1674,6 +1741,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -1711,6 +1780,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -1748,6 +1819,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -1783,6 +1856,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -1817,6 +1892,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
Value* FENCE_fence_val = this->builder.CreateOr(
@ -1853,6 +1930,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
Value* FENCE_fencei_val = this->gen_const(32U, fld_imm_val);
@ -1882,6 +1961,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
this->gen_raise_trap(0, 11);
@ -1906,6 +1987,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
this->gen_raise_trap(0, 3);
@ -1930,6 +2013,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
this->gen_leave_trap(0);
@ -1954,6 +2039,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
this->gen_leave_trap(1);
@ -1978,6 +2065,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
this->gen_leave_trap(3);
@ -2002,6 +2091,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
this->gen_wait(1);
@ -2029,6 +2120,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
Value* FENCE_fencevmal_val = this->gen_const(32U, fld_rs1_val);
@ -2068,6 +2161,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
Value* rs_val_val = this->gen_reg_load(fld_rs1_val, 0);
@ -2114,6 +2209,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
Value* xrd_val = this->gen_read_mem(traits<ARCH>::CSR, fld_csr_val, 32/8);
@ -2158,6 +2255,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
Value* xrd_val = this->gen_read_mem(traits<ARCH>::CSR, fld_csr_val, 32/8);
@ -2202,6 +2301,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -2243,6 +2344,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
Value* res_val = this->gen_read_mem(traits<ARCH>::CSR, fld_csr_val, 32/8);
@ -2289,6 +2392,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
Value* res_val = this->gen_read_mem(traits<ARCH>::CSR, fld_csr_val, 32/8);
@ -2335,6 +2440,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -2380,6 +2487,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -2427,6 +2536,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -2474,6 +2585,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -2521,6 +2634,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -2584,6 +2699,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -2647,6 +2764,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -2710,6 +2829,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -2774,6 +2895,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -2821,6 +2944,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0);
@ -2885,6 +3010,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0);
@ -2929,6 +3056,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0);
@ -2977,6 +3106,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0);
@ -3025,6 +3156,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0);
@ -3073,6 +3206,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0);
@ -3121,6 +3256,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0);
@ -3178,6 +3315,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0);
@ -3235,6 +3374,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0);
@ -3288,6 +3429,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0);
@ -3342,6 +3485,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+2;
if(fld_imm_val == 0){
@ -3380,6 +3525,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+2;
uint8_t rs1_idx_val = (fld_rs1_val + 8);
@ -3416,6 +3563,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+2;
uint8_t rs1_idx_val = (fld_rs1_val + 8);
@ -3454,6 +3603,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+2;
Value* X_rs1_val = this->builder.CreateAdd(
@ -3483,6 +3634,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+2;
/* TODO: describe operations for C.NOP ! */
@ -3511,15 +3664,17 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+2;
uint8_t rd_val = 1;
Value* X_rd_val = this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(32U, 2));
this->builder.CreateStore(X_rd_val, get_reg_ptr(rd_val), false);
Value* PC_val = this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(32U, fld_imm_val));
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
this->gen_sync(iss::POST_SYNC, 76);
@ -3546,6 +3701,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+2;
if(fld_rd_val == 0){
@ -3579,6 +3736,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+2;
if(fld_rd_val == 0){
@ -3614,6 +3773,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+2;
uint8_t x2_idx_val = 2;
@ -3649,6 +3810,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+2;
uint8_t rs1_idx_val = (fld_rs1_val + 8);
@ -3682,6 +3845,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+2;
uint8_t rs1_idx_val = (fld_rs1_val + 8);
@ -3715,6 +3880,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+2;
uint8_t rs1_idx_val = (fld_rs1_val + 8);
@ -3748,6 +3915,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+2;
uint8_t rd_idx_val = (fld_rd_val + 8);
@ -3782,6 +3951,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+2;
uint8_t rd_idx_val = (fld_rd_val + 8);
@ -3816,6 +3987,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+2;
uint8_t rd_idx_val = (fld_rd_val + 8);
@ -3850,6 +4023,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+2;
uint8_t rd_idx_val = (fld_rd_val + 8);
@ -3883,10 +4058,12 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+2;
Value* PC_val = this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(32U, fld_imm_val));
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
this->gen_sync(iss::POST_SYNC, 87);
@ -3913,6 +4090,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+2;
uint8_t rs1_idx_val = (fld_rs1_val + 8);
@ -3922,10 +4101,10 @@ private:
this->gen_reg_load(rs1_idx_val, 0),
this->gen_const(32U, 0)),
this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(32U, fld_imm_val)),
this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(32U, 2)),
32);
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
@ -3953,6 +4132,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+2;
uint8_t rs1_idx_val = (fld_rs1_val + 8);
@ -3962,10 +4143,10 @@ private:
this->gen_reg_load(rs1_idx_val, 0),
this->gen_const(32U, 0)),
this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(32U, fld_imm_val)),
this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(32U, 2)),
32);
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
@ -3993,6 +4174,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+2;
if(fld_rs1_val == 0){
@ -4028,6 +4211,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+2;
uint8_t x2_idx_val = 2;
@ -4062,6 +4247,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+2;
Value* X_rd_val = this->gen_reg_load(fld_rs2_val, 0);
@ -4091,6 +4278,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+2;
Value* PC_val = this->gen_reg_load(fld_rs1_val, 0);
@ -4119,6 +4308,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+2;
Value* X_rd_val = this->builder.CreateAdd(
@ -4150,11 +4341,13 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+2;
uint8_t r_idx_val = 1;
Value* X_r_idx_val = this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(32U, 2));
this->builder.CreateStore(X_r_idx_val, get_reg_ptr(r_idx_val), false);
Value* PC_val = this->gen_reg_load(fld_rs1_val, 0);
@ -4180,6 +4373,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+2;
this->gen_raise_trap(0, 3);
@ -4207,6 +4402,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+2;
uint8_t x2_idx_val = 2;
@ -4241,6 +4438,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(32, pc.val);
pc=pc+2;
this->gen_raise_trap(0, 2);
@ -4257,7 +4456,7 @@ private:
****************************************************************************/
std::tuple<vm::continuation_e, llvm::BasicBlock *> illegal_intruction(virt_addr_t &pc, code_word_t instr,
llvm::BasicBlock *bb) {
this->gen_sync(iss::PRE_SYNC, sizeof(instr_descr)/sizeof(InstructionDesriptor));
this->gen_sync(iss::PRE_SYNC, instr_descr.size());
this->builder.CreateStore(this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::NEXT_PC), true),
get_reg_ptr(traits<ARCH>::PC), true);
this->builder.CreateStore(
@ -4266,7 +4465,7 @@ private:
get_reg_ptr(traits<ARCH>::ICOUNT), true);
pc = pc + ((instr & 3) == 3 ? 4 : 2);
this->gen_raise_trap(0, 2); // illegal instruction trap
this->gen_sync(iss::POST_SYNC, sizeof(instr_descr)/sizeof(InstructionDesriptor));
this->gen_sync(iss::POST_SYNC, instr_descr.size());
this->gen_trap_check(this->leave_blk);
return std::make_tuple(iss::vm::BRANCH, nullptr);
}

View File

@ -45,6 +45,7 @@
#include <boost/format.hpp>
#include <iss/debugger/riscv_target_adapter.h>
#include <array>
namespace iss {
namespace rv64ia {
@ -121,14 +122,14 @@ protected:
using compile_func = std::tuple<vm::continuation_e, llvm::BasicBlock *> (this_class::*)(virt_addr_t &pc,
code_word_t instr,
llvm::BasicBlock *bb);
compile_func lut[LUT_SIZE];
std::array<compile_func, LUT_SIZE> lut;
std::array<compile_func, LUT_SIZE_C> lut_00, lut_01, lut_10;
std::array<compile_func, LUT_SIZE> lut_11;
compile_func *qlut[4]; // = {lut_00, lut_01, lut_10, lut_11};
std::array<compile_func*, 4> qlut;
const uint32_t lutmasks[4] = {EXTR_MASK16, EXTR_MASK16, EXTR_MASK16, EXTR_MASK32};
std::array<const uint32_t, 4> lutmasks = { { EXTR_MASK16, EXTR_MASK16, EXTR_MASK16, EXTR_MASK32 } };
void expand_bit_mask(int pos, uint32_t mask, uint32_t value, uint32_t valid, uint32_t idx, compile_func lut[],
compile_func f) {
@ -179,7 +180,7 @@ private:
};
/* start generated code */
const InstructionDesriptor instr_descr[86] = {
const std::array<InstructionDesriptor, 86> instr_descr = {{
/* entries are: valid value, valid mask, function ptr */
/* instruction LWU */
{32, 0b00000000000000000110000000000011, 0b00000000000000000111000001111111, &this_class::__lwu},
@ -353,7 +354,7 @@ private:
{32, 0b11000000000000000010000000101111, 0b11111000000000000111000001111111, &this_class::__amominu_w},
/* instruction AMOMAXU.W */
{32, 0b11100000000000000010000000101111, 0b11111000000000000111000001111111, &this_class::__amomaxu_w},
};
}};
//0: instruction LWU
std::tuple<vm::continuation_e, llvm::BasicBlock*> __lwu(virt_addr_t& pc, code_word_t instr, llvm::BasicBlock* bb){
bb->setName("LWU");
@ -374,6 +375,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* offs_val = this->builder.CreateAdd(
@ -413,6 +416,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* offs_val = this->builder.CreateAdd(
@ -452,6 +457,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* offs_val = this->builder.CreateAdd(
@ -489,6 +496,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_shamt_val > 31){
@ -528,6 +537,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_shamt_val > 31){
@ -567,6 +578,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_shamt_val > 31){
@ -606,6 +619,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -648,6 +663,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -690,6 +707,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -732,6 +751,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -772,6 +793,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -815,6 +838,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -860,6 +885,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -909,6 +936,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -958,6 +987,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -1006,6 +1037,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -1038,11 +1071,13 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
Value* X_rd_val = this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(64U, fld_imm_val));
this->builder.CreateStore(X_rd_val, get_reg_ptr(fld_rd_val), false);
}
@ -1072,16 +1107,18 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
Value* X_rd_val = this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(64U, 4));
this->builder.CreateStore(X_rd_val, get_reg_ptr(fld_rd_val), false);
}
Value* PC_val = this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(64U, fld_imm_val));
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
this->gen_sync(iss::POST_SYNC, 17);
@ -1109,6 +1146,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* new_pc_val = this->builder.CreateAdd(
@ -1136,7 +1175,7 @@ private:
{
if(fld_rd_val != 0){
Value* X_rd_val = this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 1),
cur_pc_val,
this->gen_const(64U, 4));
this->builder.CreateStore(X_rd_val, get_reg_ptr(fld_rd_val), false);
}
@ -1173,6 +1212,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* PC_val = this->gen_choose(
@ -1181,10 +1222,10 @@ private:
this->gen_reg_load(fld_rs1_val, 0),
this->gen_reg_load(fld_rs2_val, 0)),
this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(64U, fld_imm_val)),
this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(64U, 4)),
64);
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
@ -1213,6 +1254,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* PC_val = this->gen_choose(
@ -1221,10 +1264,10 @@ private:
this->gen_reg_load(fld_rs1_val, 0),
this->gen_reg_load(fld_rs2_val, 0)),
this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(64U, fld_imm_val)),
this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(64U, 4)),
64);
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
@ -1253,6 +1296,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* PC_val = this->gen_choose(
@ -1265,10 +1310,10 @@ private:
this->gen_reg_load(fld_rs2_val, 0),
64, true)),
this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(64U, fld_imm_val)),
this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(64U, 4)),
64);
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
@ -1297,6 +1342,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* PC_val = this->gen_choose(
@ -1309,10 +1356,10 @@ private:
this->gen_reg_load(fld_rs2_val, 0),
64, true)),
this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(64U, fld_imm_val)),
this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(64U, 4)),
64);
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
@ -1341,6 +1388,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* PC_val = this->gen_choose(
@ -1349,10 +1398,10 @@ private:
this->gen_reg_load(fld_rs1_val, 0),
this->gen_reg_load(fld_rs2_val, 0)),
this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(64U, fld_imm_val)),
this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(64U, 4)),
64);
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
@ -1381,6 +1430,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* PC_val = this->gen_choose(
@ -1389,10 +1440,10 @@ private:
this->gen_reg_load(fld_rs1_val, 0),
this->gen_reg_load(fld_rs2_val, 0)),
this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(64U, fld_imm_val)),
this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0),
cur_pc_val,
this->gen_const(64U, 4)),
64);
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
@ -1421,6 +1472,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* offs_val = this->builder.CreateAdd(
@ -1460,6 +1513,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* offs_val = this->builder.CreateAdd(
@ -1499,6 +1554,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* offs_val = this->builder.CreateAdd(
@ -1538,6 +1595,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* offs_val = this->builder.CreateAdd(
@ -1577,6 +1636,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* offs_val = this->builder.CreateAdd(
@ -1616,6 +1677,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* offs_val = this->builder.CreateAdd(
@ -1653,6 +1716,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* offs_val = this->builder.CreateAdd(
@ -1690,6 +1755,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* offs_val = this->builder.CreateAdd(
@ -1727,6 +1794,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -1762,6 +1831,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -1806,6 +1877,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
int64_t full_imm_val = fld_imm_val;
@ -1851,6 +1924,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -1886,6 +1961,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -1921,6 +1998,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -1956,6 +2035,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -1991,6 +2072,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -2026,6 +2109,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -2063,6 +2148,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -2107,6 +2194,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -2153,6 +2242,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -2188,6 +2279,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -2225,6 +2318,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -2262,6 +2357,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -2297,6 +2394,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -2331,6 +2430,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* FENCE_fence_val = this->builder.CreateOr(
@ -2367,6 +2468,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* FENCE_fencei_val = this->gen_const(64U, fld_imm_val);
@ -2396,6 +2499,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
this->gen_raise_trap(0, 11);
@ -2420,6 +2525,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
this->gen_raise_trap(0, 3);
@ -2444,6 +2551,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
this->gen_leave_trap(0);
@ -2468,6 +2577,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
this->gen_leave_trap(1);
@ -2492,6 +2603,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
this->gen_leave_trap(3);
@ -2516,6 +2629,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
this->gen_wait(1);
@ -2543,6 +2658,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* FENCE_fencevmal_val = this->gen_const(64U, fld_rs1_val);
@ -2582,6 +2699,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* rs_val_val = this->gen_reg_load(fld_rs1_val, 0);
@ -2628,6 +2747,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* xrd_val = this->gen_read_mem(traits<ARCH>::CSR, fld_csr_val, 64/8);
@ -2672,6 +2793,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* xrd_val = this->gen_read_mem(traits<ARCH>::CSR, fld_csr_val, 64/8);
@ -2716,6 +2839,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -2757,6 +2882,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* res_val = this->gen_read_mem(traits<ARCH>::CSR, fld_csr_val, 64/8);
@ -2803,6 +2930,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* res_val = this->gen_read_mem(traits<ARCH>::CSR, fld_csr_val, 64/8);
@ -2850,6 +2979,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -2897,6 +3028,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0);
@ -2962,6 +3095,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0);
@ -3006,6 +3141,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0);
@ -3054,6 +3191,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0);
@ -3102,6 +3241,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0);
@ -3150,6 +3291,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0);
@ -3198,6 +3341,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0);
@ -3255,6 +3400,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0);
@ -3312,6 +3459,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0);
@ -3365,6 +3514,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0);
@ -3417,6 +3568,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
if(fld_rd_val != 0){
@ -3464,6 +3617,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0);
@ -3528,6 +3683,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0);
@ -3572,6 +3729,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0);
@ -3620,6 +3779,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0);
@ -3668,6 +3829,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0);
@ -3716,6 +3879,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0);
@ -3764,6 +3929,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0);
@ -3821,6 +3988,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0);
@ -3878,6 +4047,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0);
@ -3931,6 +4102,8 @@ private:
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0);
@ -3972,7 +4145,7 @@ private:
****************************************************************************/
std::tuple<vm::continuation_e, llvm::BasicBlock *> illegal_intruction(virt_addr_t &pc, code_word_t instr,
llvm::BasicBlock *bb) {
this->gen_sync(iss::PRE_SYNC, sizeof(instr_descr)/sizeof(InstructionDesriptor));
this->gen_sync(iss::PRE_SYNC, instr_descr.size());
this->builder.CreateStore(this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::NEXT_PC), true),
get_reg_ptr(traits<ARCH>::PC), true);
this->builder.CreateStore(
@ -3981,7 +4154,7 @@ private:
get_reg_ptr(traits<ARCH>::ICOUNT), true);
pc = pc + ((instr & 3) == 3 ? 4 : 2);
this->gen_raise_trap(0, 2); // illegal instruction trap
this->gen_sync(iss::POST_SYNC, sizeof(instr_descr)/sizeof(InstructionDesriptor));
this->gen_sync(iss::POST_SYNC, instr_descr.size());
this->gen_trap_check(this->leave_blk);
return std::make_tuple(iss::vm::BRANCH, nullptr);
}