C++11 refactoring

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

115
.cproject
View File

@ -28,11 +28,14 @@
<option id="gnu.cpp.compiler.option.debugging.level.1161461100" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/> <option id="gnu.cpp.compiler.option.debugging.level.1161461100" name="Debug Level" superClass="gnu.cpp.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
<option id="gnu.cpp.compiler.option.dialect.std.689478602" name="Language standard" superClass="gnu.cpp.compiler.option.dialect.std" useByScannerDiscovery="true" value="gnu.cpp.compiler.dialect.c++1y" valueType="enumerated"/> <option id="gnu.cpp.compiler.option.dialect.std.689478602" name="Language standard" superClass="gnu.cpp.compiler.option.dialect.std" useByScannerDiscovery="true" value="gnu.cpp.compiler.dialect.c++1y" valueType="enumerated"/>
<option id="gnu.cpp.compiler.option.include.paths.842172839" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath"> <option id="gnu.cpp.compiler.option.include.paths.842172839" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
<listOptionValue builtIn="false" value="&quot;${SYSTEMC_HOME}/include&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/dbt-riscv/external/libGIS}&quot;"/> <listOptionValue builtIn="false" value="&quot;${workspace_loc:/dbt-riscv/external/libGIS}&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/dbt-riscv/external/elfio}&quot;"/> <listOptionValue builtIn="false" value="&quot;${workspace_loc:/dbt-riscv/external/elfio}&quot;"/>
<listOptionValue builtIn="false" value="/usr/include/llvm-4.0"/> <listOptionValue builtIn="false" value="/usr/include/llvm-4.0"/>
<listOptionValue builtIn="false" value="&quot;${HOME}/.conan/data/Seasocks/1.3.2/minres/stable/source/seasocks/src/main/c&quot;"/> <listOptionValue builtIn="false" value="&quot;${HOME}/.conan/data/Seasocks/1.3.2/minres/stable/source/seasocks/src/main/c&quot;"/>
<listOptionValue builtIn="false" value="&quot;${HOME}/.conan/data/Poco/1.7.8p3/pocoproject/stable/package/506dd97d52a31e919c8613e1e6dc66d79f5a9625/include&quot;"/>
<listOptionValue builtIn="false" value="&quot;${HOME}/.conan/data/SystemCVerification/2.0.0a/minres/stable/package/d9580b78ca474433b46b653ea2c6c83385840479/include&quot;"/>
<listOptionValue builtIn="false" value="&quot;${HOME}/.conan/data/SystemC/2.3.2/minres/stable/package/5da42a16f2fe7e4182d2c23eaed73d10d0bca3f4/include&quot;"/>
<listOptionValue builtIn="false" value="&quot;${HOME}/.conan/data/zlib/1.2.11/conan/stable/package/0a813c597d519ec14c71192b99d7de0a92bbc1c3/include&quot;"/>
</option> </option>
<option id="gnu.cpp.compiler.option.preprocessor.def.625649396" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols"> <option id="gnu.cpp.compiler.option.preprocessor.def.625649396" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
<listOptionValue builtIn="false" value="WITH_SYSTEMC"/> <listOptionValue builtIn="false" value="WITH_SYSTEMC"/>
@ -78,7 +81,7 @@
</toolChain> </toolChain>
</folderInfo> </folderInfo>
<sourceEntries> <sourceEntries>
<entry excluding="riscv/src-gen|blink.S|scc|flash.s" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/> <entry excluding="build_rel|build|riscv/src-gen|blink.S|scc|flash.s" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
</sourceEntries> </sourceEntries>
</configuration> </configuration>
</storageModule> </storageModule>
@ -249,55 +252,6 @@
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/> <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
</scannerConfigBuildInfo> </scannerConfigBuildInfo>
</storageModule> </storageModule>
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets">
<buildTargets>
<target name="all VERBOSE=1" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
<buildCommand>make</buildCommand>
<buildArguments/>
<buildTarget>all VERBOSE=1</buildTarget>
<stopOnError>true</stopOnError>
<useDefaultCommand>false</useDefaultCommand>
<runAllBuilders>true</runAllBuilders>
</target>
<target name="clean" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
<buildCommand>make</buildCommand>
<buildArguments>-j8</buildArguments>
<buildTarget>clean</buildTarget>
<stopOnError>true</stopOnError>
<useDefaultCommand>true</useDefaultCommand>
<runAllBuilders>true</runAllBuilders>
</target>
<target name="all" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
<buildCommand>make</buildCommand>
<buildArguments>-j8</buildArguments>
<buildTarget>all</buildTarget>
<stopOnError>true</stopOnError>
<useDefaultCommand>true</useDefaultCommand>
<runAllBuilders>true</runAllBuilders>
</target>
<target name="clangformat" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
<buildCommand>make</buildCommand>
<buildTarget>clangformat</buildTarget>
<stopOnError>true</stopOnError>
<useDefaultCommand>true</useDefaultCommand>
<runAllBuilders>true</runAllBuilders>
</target>
<target name="riscv" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
<buildCommand>make</buildCommand>
<buildTarget>riscv</buildTarget>
<stopOnError>true</stopOnError>
<useDefaultCommand>true</useDefaultCommand>
<runAllBuilders>true</runAllBuilders>
</target>
<target name="riscv.sc" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
<buildCommand>make</buildCommand>
<buildTarget>riscv.sc</buildTarget>
<stopOnError>true</stopOnError>
<useDefaultCommand>true</useDefaultCommand>
<runAllBuilders>true</runAllBuilders>
</target>
</buildTargets>
</storageModule>
<storageModule moduleId="scannerConfiguration"> <storageModule moduleId="scannerConfiguration">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/> <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.119132886;cdt.managedbuild.config.gnu.exe.debug.119132886.;cdt.managedbuild.tool.gnu.c.compiler.base.492144561;cdt.managedbuild.tool.gnu.c.compiler.input.1379562984"> <scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.119132886;cdt.managedbuild.config.gnu.exe.debug.119132886.;cdt.managedbuild.tool.gnu.c.compiler.base.492144561;cdt.managedbuild.tool.gnu.c.compiler.input.1379562984">
@ -343,4 +297,63 @@
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/> <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
</scannerConfigBuildInfo> </scannerConfigBuildInfo>
</storageModule> </storageModule>
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets">
<buildTargets>
<target name="all VERBOSE=1" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
<buildCommand>make</buildCommand>
<buildTarget>all VERBOSE=1</buildTarget>
<stopOnError>true</stopOnError>
<useDefaultCommand>false</useDefaultCommand>
<runAllBuilders>true</runAllBuilders>
</target>
<target name="clean" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
<buildCommand>make</buildCommand>
<buildArguments>-j8</buildArguments>
<buildTarget>clean</buildTarget>
<stopOnError>true</stopOnError>
<useDefaultCommand>true</useDefaultCommand>
<runAllBuilders>true</runAllBuilders>
</target>
<target name="all" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
<buildCommand>make</buildCommand>
<buildArguments>-j8</buildArguments>
<buildTarget>all</buildTarget>
<stopOnError>true</stopOnError>
<useDefaultCommand>true</useDefaultCommand>
<runAllBuilders>true</runAllBuilders>
</target>
<target name="clangformat" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
<buildCommand>make</buildCommand>
<buildArguments/>
<buildTarget>clangformat</buildTarget>
<stopOnError>true</stopOnError>
<useDefaultCommand>true</useDefaultCommand>
<runAllBuilders>true</runAllBuilders>
</target>
<target name="riscv" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
<buildCommand>make</buildCommand>
<buildArguments/>
<buildTarget>riscv</buildTarget>
<stopOnError>true</stopOnError>
<useDefaultCommand>true</useDefaultCommand>
<runAllBuilders>true</runAllBuilders>
</target>
<target name="riscv.sc" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
<buildCommand>make</buildCommand>
<buildArguments/>
<buildTarget>riscv.sc</buildTarget>
<stopOnError>true</stopOnError>
<useDefaultCommand>true</useDefaultCommand>
<runAllBuilders>true</runAllBuilders>
</target>
<target name="all -C ../build_rel" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
<buildCommand>make</buildCommand>
<buildArguments/>
<buildTarget>all -C ../build_rel</buildTarget>
<stopOnError>true</stopOnError>
<useDefaultCommand>true</useDefaultCommand>
<runAllBuilders>true</runAllBuilders>
</target>
</buildTargets>
</storageModule>
</cproject> </cproject>

6
build.sh Normal file
View File

@ -0,0 +1,6 @@
mkdir -f build_rel
cd build_rel/
cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo && \
cmake --build . && \
bin/riscv --reset=0x20400000 --verbose=4 $HOME/eclipse-workspace/RiscV-dhrystone/dhrystone

@ -1 +1 @@
Subproject commit 4eb39e8583e591b50c97051db7ac667c209459ab Subproject commit e70839fbf599302c976919afc590492b80bb2995

View File

@ -47,45 +47,54 @@
#ifdef WITH_SCV #ifdef WITH_SCV
#include <scv.h> #include <scv.h>
#include <array>
#endif #endif
namespace sysc { namespace sysc {
namespace SiFive { namespace SiFive {
using namespace std;
using namespace iss;
namespace { namespace {
iss::debugger::encoder_decoder encdec; iss::debugger::encoder_decoder encdec;
} }
namespace { namespace {
const char lvl[] = {'U', 'S', 'H', 'M'}; std::array<const char, 4> lvl = { { 'U', 'S', 'H', 'M' } };
const char *trap_str[] = {"Instruction address misaligned", std::array<const char*, 16> trap_str = { {
"Instruction access fault", "Instruction address misaligned",
"Illegal instruction", "Instruction access fault",
"Breakpoint", "Illegal instruction",
"Load address misaligned", "Breakpoint",
"Load access fault", "Load address misaligned",
"Store/AMO address misaligned", "Load access fault",
"Store/AMO access fault", "Store/AMO address misaligned",
"Environment call from U-mode", "Store/AMO access fault",
"Environment call from S-mode", "Environment call from U-mode",
"Reserved", "Environment call from S-mode",
"Environment call from M-mode", "Reserved",
"Instruction page fault", "Environment call from M-mode",
"Load page fault", "Instruction page fault",
"Reserved", "Load page fault",
"Store/AMO page fault"}; "Reserved",
const char *irq_str[] = { "Store/AMO page fault"
"User software interrupt", "Supervisor software interrupt", "Reserved", "Machine software interrupt", } };
"User timer interrupt", "Supervisor timer interrupt", "Reserved", "Machine timer interrupt", std::array<const char*, 12> irq_str = { {
"User external interrupt", "Supervisor external interrupt", "Reserved", "Machine external interrupt"}; "User software interrupt", "Supervisor software interrupt", "Reserved", "Machine software interrupt",
"User timer interrupt", "Supervisor timer interrupt", "Reserved", "Machine timer interrupt",
"User external interrupt", "Supervisor external interrupt", "Reserved", "Machine external interrupt" } };
} }
class core_wrapper : public iss::arch::riscv_hart_msu_vp<iss::arch::rv32imac> { class core_wrapper : public iss::arch::riscv_hart_msu_vp<iss::arch::rv32imac> {
public: public:
using core_type = iss::arch::rv32imac; using core_type = arch::rv32imac;
using base_type = iss::arch::riscv_hart_msu_vp<iss::arch::rv32imac>; using base_type = arch::riscv_hart_msu_vp<arch::rv32imac>;
using phys_addr_t = typename iss::arch::traits<iss::arch::rv32imac>::phys_addr_t; using phys_addr_t = typename arch::traits<arch::rv32imac>::phys_addr_t;
core_wrapper(core_complex *owner) core_wrapper(core_complex *owner)
: owner(owner) : owner(owner)
{} {}
@ -96,7 +105,7 @@ public:
void notify_phase(exec_phase) override; void notify_phase(exec_phase) override;
iss::sync_type needed_sync() const override { return iss::PRE_SYNC; } sync_type needed_sync() const override { return PRE_SYNC; }
void disass_output(uint64_t pc, const std::string instr) override { void disass_output(uint64_t pc, const std::string instr) override {
if (logging::INFO <= logging::Log<logging::Output2FILE<logging::disass>>::reporting_level() && logging::Output2FILE<logging::disass>::stream()){ if (logging::INFO <= logging::Log<logging::Output2FILE<logging::disass>>::reporting_level() && logging::Output2FILE<logging::disass>::stream()){
@ -109,22 +118,22 @@ public:
owner->disass_output(pc,instr); owner->disass_output(pc,instr);
}; };
iss::status read_mem(phys_addr_t addr, unsigned length, uint8_t *const data) { status read_mem(phys_addr_t addr, unsigned length, uint8_t *const data) {
if (addr.access && iss::access_type::DEBUG) if (addr.access && access_type::DEBUG)
return owner->read_mem_dbg(addr.val, length, data) ? iss::Ok : iss::Err; return owner->read_mem_dbg(addr.val, length, data) ? Ok : Err;
else { else {
return owner->read_mem(addr.val, length, data,addr.access && iss::access_type::FETCH) ? iss::Ok : iss::Err; return owner->read_mem(addr.val, length, data,addr.access && access_type::FETCH) ? Ok : Err;
} }
} }
iss::status write_mem(phys_addr_t addr, unsigned length, const uint8_t *const data) { status write_mem(phys_addr_t addr, unsigned length, const uint8_t *const data) {
if (addr.access && iss::access_type::DEBUG) if (addr.access && access_type::DEBUG)
return owner->write_mem_dbg(addr.val, length, data) ? iss::Ok : iss::Err; return owner->write_mem_dbg(addr.val, length, data) ? Ok : Err;
else{ else{
auto res = owner->write_mem(addr.val, length, data) ? iss::Ok : iss::Err; auto res = owner->write_mem(addr.val, length, data) ? Ok : Err;
// TODO: this is an ugly hack (clear MTIP on mtimecmp write), needs to be fixed // TODO: this is an ugly hack (clear MTIP on mtimecmp write), needs to be fixed
if(addr.val==0x2004000) if(addr.val==0x2004000)
this->csr[iss::arch::mip] &= ~(1ULL<<7); this->csr[arch::mip] &= ~(1ULL<<7);
return res; return res;
} }
} }
@ -140,13 +149,13 @@ public:
void local_irq(short id){ void local_irq(short id){
switch(id){ switch(id){
case 16: // SW case 16: // SW
this->csr[iss::arch::mip] |= 1<<3; this->csr[arch::mip] |= 1<<3;
break; break;
case 17: // timer case 17: // timer
this->csr[iss::arch::mip] |= 1<<7; this->csr[arch::mip] |= 1<<7;
break; break;
case 18: //external case 18: //external
this->csr[iss::arch::mip] |= 1<<11; this->csr[arch::mip] |= 1<<11;
break; break;
default: default:
/* do nothing*/ /* do nothing*/
@ -159,15 +168,15 @@ private:
sc_event wfi_evt; sc_event wfi_evt;
}; };
int cmd_sysc(int argc, char* argv[], iss::debugger::out_func of, iss::debugger::data_func df, iss::debugger::target_adapter_if* tgt_adapter){ int cmd_sysc(int argc, char* argv[], debugger::out_func of, debugger::data_func df, debugger::target_adapter_if* tgt_adapter){
if(argc>1) { if(argc>1) {
if(strcasecmp(argv[1], "print_time")==0){ if(strcasecmp(argv[1], "print_time")==0){
std::string t = sc_core::sc_time_stamp().to_string(); std::string t = sc_core::sc_time_stamp().to_string();
of(t.c_str()); of(t.c_str());
char buf[64]; std::array<char, 64> buf;
encdec.enc_string(t.c_str(), buf, 63); encdec.enc_string(t.c_str(), buf.data(), 63);
df(buf); df(buf.data());
return iss::Ok; return Ok;
} else if(strcasecmp(argv[1], "break")==0){ } else if(strcasecmp(argv[1], "break")==0){
sc_core::sc_time t; sc_core::sc_time t;
if(argc==4){ if(argc==4){
@ -175,17 +184,17 @@ int cmd_sysc(int argc, char* argv[], iss::debugger::out_func of, iss::debugger::
} else if(argc==3){ } else if(argc==3){
t= scc::parse_from_string(argv[2]); t= scc::parse_from_string(argv[2]);
} else } else
return iss::Err; return Err;
// no check needed as it is only called if debug server is active // no check needed as it is only called if debug server is active
tgt_adapter->add_break_condition([t]()->unsigned{ tgt_adapter->add_break_condition([t]()->unsigned{
LOG(TRACE)<<"Checking condition at "<<sc_core::sc_time_stamp(); LOG(TRACE)<<"Checking condition at "<<sc_core::sc_time_stamp();
return sc_core::sc_time_stamp()>=t?std::numeric_limits<unsigned>::max():0; return sc_core::sc_time_stamp()>=t?std::numeric_limits<unsigned>::max():0;
}); });
return iss::Ok; return Ok;
} }
return iss::Err; return Err;
} }
return iss::Err; return Err;
} }
@ -245,15 +254,15 @@ core_complex::~core_complex() = default;
void core_complex::trace(sc_core::sc_trace_file *trf) {} void core_complex::trace(sc_core::sc_trace_file *trf) {}
void core_complex::before_end_of_elaboration() { void core_complex::before_end_of_elaboration() {
cpu = std::make_unique<core_wrapper>(this); cpu = make_unique<core_wrapper>(this);
vm = iss::create<iss::arch::rv32imac>(cpu.get(), gdb_server_port.value, dump_ir.value); vm = create<arch::rv32imac>(cpu.get(), gdb_server_port.value, dump_ir.value);
vm->setDisassEnabled(enable_disass.value); vm->setDisassEnabled(enable_disass.value);
auto* srv = iss::debugger::server<iss::debugger::gdb_session>::get(); auto* srv = debugger::server<debugger::gdb_session>::get();
if(srv) tgt_adapter = srv->get_target(); if(srv) tgt_adapter = srv->get_target();
if(tgt_adapter) if(tgt_adapter)
tgt_adapter->add_custom_command({ tgt_adapter->add_custom_command({
"sysc", "sysc",
[this](int argc, char* argv[], iss::debugger::out_func of, iss::debugger::data_func df)-> int { [this](int argc, char* argv[], debugger::out_func of, debugger::data_func df)-> int {
return cmd_sysc(argc, argv, of, df, tgt_adapter); return cmd_sysc(argc, argv, of, df, tgt_adapter);
}, },
"SystemC sub-commands: break <time>, print_time"}); "SystemC sub-commands: break <time>, print_time"});
@ -306,7 +315,7 @@ void core_complex::run() {
cpu->reset(reset_address.value); cpu->reset(reset_address.value);
try { try {
vm->start(-1); vm->start(-1);
} catch (iss::simulation_stopped &e) { } catch (simulation_stopped &e) {
} }
sc_core::sc_stop(); sc_core::sc_stop();
} }

View File

@ -41,7 +41,7 @@ InsructionSet RV32IBase {
val new_pc[XLEN] <= X[rs1]+ imm; val new_pc[XLEN] <= X[rs1]+ imm;
val align[XLEN] <= new_pc & 0x2; val align[XLEN] <= new_pc & 0x2;
if(align != 0){ if(align != 0){
raise(0, 0) raise(0, 0);
} else { } else {
if(rd!=0) X[rd] <= PC+4; if(rd!=0) X[rd] <= PC+4;
PC<=new_pc & ~0x1; PC<=new_pc & ~0x1;
@ -160,7 +160,7 @@ InsructionSet RV32IBase {
encoding: b0000000 | shamt[4:0] | rs1[4:0] | b001 | rd[4:0] | b0010011; encoding: b0000000 | shamt[4:0] | rs1[4:0] | b001 | rd[4:0] | b0010011;
args_disass:"x%rd$d, x%rs1$d, %shamt%"; args_disass:"x%rd$d, x%rs1$d, %shamt%";
if(shamt > 31){ if(shamt > 31){
raise(0,0) raise(0,0);
} else { } else {
if(rd != 0) X[rd] <= shll(X[rs1], shamt); if(rd != 0) X[rd] <= shll(X[rs1], shamt);
} }
@ -169,7 +169,7 @@ InsructionSet RV32IBase {
encoding: b0000000 | shamt[4:0] | rs1[4:0] | b101 | rd[4:0] | b0010011; encoding: b0000000 | shamt[4:0] | rs1[4:0] | b101 | rd[4:0] | b0010011;
args_disass:"x%rd$d, x%rs1$d, %shamt%"; args_disass:"x%rd$d, x%rs1$d, %shamt%";
if(shamt > 31){ if(shamt > 31){
raise(0,0) raise(0,0);
} else { } else {
if(rd != 0) X[rd] <= shrl(X[rs1], shamt); if(rd != 0) X[rd] <= shrl(X[rs1], shamt);
} }
@ -178,7 +178,7 @@ InsructionSet RV32IBase {
encoding: b0100000 | shamt[4:0] | rs1[4:0] | b101 | rd[4:0] | b0010011; encoding: b0100000 | shamt[4:0] | rs1[4:0] | b101 | rd[4:0] | b0010011;
args_disass:"x%rd$d, x%rs1$d, %shamt%"; args_disass:"x%rd$d, x%rs1$d, %shamt%";
if(shamt > 31){ if(shamt > 31){
raise(0,0) raise(0,0);
} else { } else {
if(rd != 0) X[rd] <= shra(X[rs1], shamt); if(rd != 0) X[rd] <= shra(X[rs1], shamt);
} }

View File

@ -6,6 +6,7 @@ import "RV64IBase.core_desc"
//import "RV64M.core_desc" //import "RV64M.core_desc"
import "RV64A.core_desc" import "RV64A.core_desc"
Core RV32IMAC provides RV32IBase, RV32M, RV32A, RV32CI { Core RV32IMAC provides RV32IBase, RV32M, RV32A, RV32CI {
template:"vm_riscv.in.cpp"; template:"vm_riscv.in.cpp";
constants { constants {

View File

@ -46,6 +46,7 @@
#include <util/ities.h> #include <util/ities.h>
#include <util/sparse_array.h> #include <util/sparse_array.h>
#include <util/bit_field.h> #include <util/bit_field.h>
#include <array>
namespace iss { namespace iss {
namespace arch { namespace arch {
@ -159,28 +160,29 @@ enum csr_name {
namespace { namespace {
const char lvl[] = {'U', 'S', 'H', 'M'}; std::array<const char, 4> lvl = { { 'U', 'S', 'H', 'M' } };
const char *trap_str[] = {"Instruction address misaligned", //0 std::array<const char*, 16> trap_str = { { ""
"Instruction access fault", //1 "Instruction address misaligned", //0
"Illegal instruction", //2 "Instruction access fault", //1
"Breakpoint", //3 "Illegal instruction", //2
"Load address misaligned", //4 "Breakpoint", //3
"Load access fault", //5 "Load address misaligned", //4
"Store/AMO address misaligned", //6 "Load access fault", //5
"Store/AMO access fault", //7 "Store/AMO address misaligned", //6
"Environment call from U-mode", //8 "Store/AMO access fault", //7
"Environment call from S-mode", //9 "Environment call from U-mode", //8
"Reserved", //a "Environment call from S-mode", //9
"Environment call from M-mode", //b "Reserved", //a
"Instruction page fault", //c "Environment call from M-mode", //b
"Load page fault", //d "Instruction page fault", //c
"Reserved", //e "Load page fault", //d
"Store/AMO page fault"}; //f "Reserved", //e
const char *irq_str[] = { "Store/AMO page fault" } };
"User software interrupt", "Supervisor software interrupt", "Reserved", "Machine software interrupt", std::array<const char*, 12> irq_str = { {
"User timer interrupt", "Supervisor timer interrupt", "Reserved", "Machine timer interrupt", "User software interrupt", "Supervisor software interrupt", "Reserved", "Machine software interrupt",
"User external interrupt", "Supervisor external interrupt", "Reserved", "Machine external interrupt"}; "User timer interrupt", "Supervisor timer interrupt", "Reserved", "Machine timer interrupt", "User external interrupt",
"Supervisor external interrupt", "Reserved", "Machine external interrupt" } };
enum { enum {
PGSHIFT = 12, PGSHIFT = 12,
@ -313,7 +315,7 @@ public:
void write_mstatus(T val, unsigned priv_lvl){ void write_mstatus(T val, unsigned priv_lvl){
auto mask = get_mask(priv_lvl); auto mask = get_mask(priv_lvl);
auto new_val = (mstatus & ~mask) | (val & mask); auto new_val = (mstatus.st.value & ~mask) | (val & mask);
mstatus=new_val; mstatus=new_val;
} }
@ -435,12 +437,12 @@ public:
const typename super::reg_t PGMASK = PGSIZE - 1; const typename super::reg_t PGMASK = PGSIZE - 1;
constexpr reg_t get_irq_mask(size_t mode) { constexpr reg_t get_irq_mask(size_t mode) {
const reg_t m[4] = { std::array<const reg_t,4> m = { {
0b000100010001, // U mode 0b000100010001,// U mode
0b001100110011, // S-mode 0b001100110011,// S mode
0, 0,
0b101110111011 // M-mode 0b101110111011 // M mode
}; }};
return m[mode]; return m[mode];
} }
@ -485,7 +487,7 @@ protected:
mem_type mem; mem_type mem;
csr_type csr; csr_type csr;
hart_state<reg_t> state; hart_state<reg_t> state;
vm_info vm[2]; std::array<vm_info,2> vm;
void update_vm_info(); void update_vm_info();
unsigned to_host_wr_cnt = 0; unsigned to_host_wr_cnt = 0;
std::stringstream uart_buf; std::stringstream uart_buf;
@ -552,11 +554,11 @@ riscv_hart_msu_vp<BASE>::riscv_hart_msu_vp()
template <typename BASE> void riscv_hart_msu_vp<BASE>::load_file(std::string name, int type) { template <typename BASE> void riscv_hart_msu_vp<BASE>::load_file(std::string name, int type) {
FILE *fp = fopen(name.c_str(), "r"); FILE *fp = fopen(name.c_str(), "r");
if (fp) { if (fp) {
char buf[5]; std::array<char, 5> buf;
auto n = fread(buf, 1, 4, fp); auto n = fread(buf.data(), 1, 4, fp);
if (n != 4) throw std::runtime_error("input file has insufficient size"); if (n != 4) throw std::runtime_error("input file has insufficient size");
buf[4] = 0; buf[4] = 0;
if (strcmp(buf + 1, "ELF") == 0) { if (strcmp(buf.data() + 1, "ELF") == 0) {
fclose(fp); fclose(fp);
// Create elfio reader // Create elfio reader
ELFIO::elfio reader; ELFIO::elfio reader;
@ -1209,10 +1211,10 @@ template <typename BASE> uint64_t riscv_hart_msu_vp<BASE>::enter_trap(uint64_t f
// reset trap state // reset trap state
this->reg.machine_state = new_priv; this->reg.machine_state = new_priv;
this->reg.trap_state = 0; this->reg.trap_state = 0;
char buffer[32]; std::array<char, 32> buffer;
sprintf(buffer, "0x%016lx", addr); sprintf(buffer.data(), "0x%016lx", addr);
CLOG(INFO, disass) << (trap_id ? "Interrupt" : "Trap") << " with cause '" << (trap_id ? irq_str[cause] : trap_str[cause])<<"' ("<<trap_id<<")" CLOG(INFO, disass) << (trap_id ? "Interrupt" : "Trap") << " with cause '" << (trap_id ? irq_str[cause] : trap_str[cause])<<"' ("<<trap_id<<")"
<< " at address " << buffer << " occurred, changing privilege level from " << lvl[cur_priv] << " at address " << buffer.data() << " occurred, changing privilege level from " << lvl[cur_priv]
<< " to " << lvl[new_priv]; << " to " << lvl[new_priv];
update_vm_info(); update_vm_info();
return this->reg.NEXT_PC; return this->reg.NEXT_PC;

View File

@ -28,7 +28,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
// //
// Created on: Sat Dec 30 12:50:15 CET 2017 // Created on: Tue Feb 06 17:18:49 UTC 2018
// * rv32imac.h Author: <CoreDSL Generator> // * rv32imac.h Author: <CoreDSL Generator>
// //
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -39,6 +39,7 @@
#include <iss/arch_if.h> #include <iss/arch_if.h>
#include <iss/vm_if.h> #include <iss/vm_if.h>
#include <iss/arch/traits.h> #include <iss/arch/traits.h>
#include <array>
namespace iss { namespace iss {
namespace arch { namespace arch {
@ -103,12 +104,12 @@ struct traits<rv32imac> {
using phys_addr_t = iss::typed_addr_t<iss::address_type::PHYSICAL>; using phys_addr_t = iss::typed_addr_t<iss::address_type::PHYSICAL>;
constexpr static unsigned reg_bit_width(unsigned r) { constexpr static unsigned reg_bit_width(unsigned r) {
const uint32_t RV32IMAC_reg_size[] = {32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,64}; constexpr std::array<const uint32_t, 38> RV32IMAC_reg_size{{32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,64}};
return RV32IMAC_reg_size[r]; return RV32IMAC_reg_size[r];
} }
constexpr static unsigned reg_byte_offset(unsigned r) { constexpr static unsigned reg_byte_offset(unsigned r) {
const uint32_t RV32IMAC_reg_byte_offset[] = {0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,152,160}; constexpr std::array<const uint32_t, 39> RV32IMAC_reg_byte_offset{{0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,152,160}};
return RV32IMAC_reg_byte_offset[r]; return RV32IMAC_reg_byte_offset[r];
} }
@ -197,7 +198,7 @@ protected:
uint64_t icount = 0; uint64_t icount = 0;
} reg; } reg;
address_type addr_mode[4]; std::array<address_type, 4> addr_mode;
uint64_t cycles = 0; uint64_t cycles = 0;

View File

@ -28,7 +28,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
// //
// Created on: Sat Dec 30 12:50:15 CET 2017 // Created on: Tue Feb 06 17:18:50 UTC 2018
// * rv64ia.h Author: <CoreDSL Generator> // * rv64ia.h Author: <CoreDSL Generator>
// //
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -39,6 +39,7 @@
#include <iss/arch_if.h> #include <iss/arch_if.h>
#include <iss/vm_if.h> #include <iss/vm_if.h>
#include <iss/arch/traits.h> #include <iss/arch/traits.h>
#include <array>
namespace iss { namespace iss {
namespace arch { namespace arch {
@ -103,12 +104,12 @@ struct traits<rv64ia> {
using phys_addr_t = iss::typed_addr_t<iss::address_type::PHYSICAL>; using phys_addr_t = iss::typed_addr_t<iss::address_type::PHYSICAL>;
constexpr static unsigned reg_bit_width(unsigned r) { constexpr static unsigned reg_bit_width(unsigned r) {
const uint32_t RV64IA_reg_size[] = {64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,32,32,32,64}; constexpr std::array<const uint32_t, 38> RV64IA_reg_size{{64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,32,32,32,64}};
return RV64IA_reg_size[r]; return RV64IA_reg_size[r];
} }
constexpr static unsigned reg_byte_offset(unsigned r) { constexpr static unsigned reg_byte_offset(unsigned r) {
const uint32_t RV64IA_reg_byte_offset[] = {0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,200,208,216,224,232,240,248,256,264,272,276,280,288,296}; constexpr std::array<const uint32_t, 39> RV64IA_reg_byte_offset{{0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,200,208,216,224,232,240,248,256,264,272,276,280,288,296}};
return RV64IA_reg_byte_offset[r]; return RV64IA_reg_byte_offset[r];
} }
@ -197,10 +198,10 @@ protected:
uint64_t icount = 0; uint64_t icount = 0;
} reg; } reg;
address_type addr_mode[4]; std::array<address_type, 4> addr_mode;
uint64_t cycles = 0; uint64_t cycles = 0;
}; };
} }

View File

@ -15,6 +15,7 @@
#include <memory> #include <memory>
#include <util/logging.h> #include <util/logging.h>
#include <array>
namespace iss { namespace iss {
namespace debugger { namespace debugger {
@ -279,10 +280,10 @@ template <typename ARCH> status riscv_target_adapter<ARCH>::threadinfo_query(int
template <typename ARCH> template <typename ARCH>
status riscv_target_adapter<ARCH>::threadextrainfo_query(const rp_thread_ref &thread, std::string &out_buf) { status riscv_target_adapter<ARCH>::threadextrainfo_query(const rp_thread_ref &thread, std::string &out_buf) {
char buf[20]; std::array<char, 20> buf;
memset(buf, 0, 20); memset(buf.data(), 0, 20);
sprintf(buf, "%02x%02x%02x%02x%02x%02x%02x%02x%02x", 'R', 'u', 'n', 'n', 'a', 'b', 'l', 'e', 0); sprintf(buf.data(), "%02x%02x%02x%02x%02x%02x%02x%02x%02x", 'R', 'u', 'n', 'n', 'a', 'b', 'l', 'e', 0);
out_buf = buf; out_buf = buf.data();
return Ok; return Ok;
} }

View File

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

View File

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

View File

@ -45,6 +45,7 @@
#include <boost/format.hpp> #include <boost/format.hpp>
#include <iss/debugger/riscv_target_adapter.h> #include <iss/debugger/riscv_target_adapter.h>
#include <array>
namespace iss { namespace iss {
namespace rv64ia { namespace rv64ia {
@ -121,14 +122,14 @@ protected:
using compile_func = std::tuple<vm::continuation_e, llvm::BasicBlock *> (this_class::*)(virt_addr_t &pc, using compile_func = std::tuple<vm::continuation_e, llvm::BasicBlock *> (this_class::*)(virt_addr_t &pc,
code_word_t instr, code_word_t instr,
llvm::BasicBlock *bb); 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_C> lut_00, lut_01, lut_10;
std::array<compile_func, LUT_SIZE> lut_11; 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[], void expand_bit_mask(int pos, uint32_t mask, uint32_t value, uint32_t valid, uint32_t idx, compile_func lut[],
compile_func f) { compile_func f) {
@ -179,7 +180,7 @@ private:
}; };
/* start generated code */ /* start generated code */
const InstructionDesriptor instr_descr[86] = { const std::array<InstructionDesriptor, 86> instr_descr = {{
/* entries are: valid value, valid mask, function ptr */ /* entries are: valid value, valid mask, function ptr */
/* instruction LWU */ /* instruction LWU */
{32, 0b00000000000000000110000000000011, 0b00000000000000000111000001111111, &this_class::__lwu}, {32, 0b00000000000000000110000000000011, 0b00000000000000000111000001111111, &this_class::__lwu},
@ -353,7 +354,7 @@ private:
{32, 0b11000000000000000010000000101111, 0b11111000000000000111000001111111, &this_class::__amominu_w}, {32, 0b11000000000000000010000000101111, 0b11111000000000000111000001111111, &this_class::__amominu_w},
/* instruction AMOMAXU.W */ /* instruction AMOMAXU.W */
{32, 0b11100000000000000010000000101111, 0b11111000000000000111000001111111, &this_class::__amomaxu_w}, {32, 0b11100000000000000010000000101111, 0b11111000000000000111000001111111, &this_class::__amomaxu_w},
}; }};
//0: instruction LWU //0: instruction LWU
std::tuple<vm::continuation_e, llvm::BasicBlock*> __lwu(virt_addr_t& pc, code_word_t instr, llvm::BasicBlock* bb){ std::tuple<vm::continuation_e, llvm::BasicBlock*> __lwu(virt_addr_t& pc, code_word_t instr, llvm::BasicBlock* bb){
bb->setName("LWU"); bb->setName("LWU");
@ -374,6 +375,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* offs_val = this->builder.CreateAdd( Value* offs_val = this->builder.CreateAdd(
@ -413,6 +416,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* offs_val = this->builder.CreateAdd( Value* offs_val = this->builder.CreateAdd(
@ -452,6 +457,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* offs_val = this->builder.CreateAdd( Value* offs_val = this->builder.CreateAdd(
@ -489,6 +496,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_shamt_val > 31){ if(fld_shamt_val > 31){
@ -528,6 +537,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_shamt_val > 31){ if(fld_shamt_val > 31){
@ -567,6 +578,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_shamt_val > 31){ if(fld_shamt_val > 31){
@ -606,6 +619,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_rd_val != 0){ if(fld_rd_val != 0){
@ -648,6 +663,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_rd_val != 0){ if(fld_rd_val != 0){
@ -690,6 +707,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_rd_val != 0){ if(fld_rd_val != 0){
@ -732,6 +751,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_rd_val != 0){ if(fld_rd_val != 0){
@ -772,6 +793,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_rd_val != 0){ if(fld_rd_val != 0){
@ -815,6 +838,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_rd_val != 0){ if(fld_rd_val != 0){
@ -860,6 +885,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_rd_val != 0){ if(fld_rd_val != 0){
@ -909,6 +936,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_rd_val != 0){ if(fld_rd_val != 0){
@ -958,6 +987,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_rd_val != 0){ if(fld_rd_val != 0){
@ -1006,6 +1037,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_rd_val != 0){ if(fld_rd_val != 0){
@ -1038,11 +1071,13 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_rd_val != 0){ if(fld_rd_val != 0){
Value* X_rd_val = this->builder.CreateAdd( 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->gen_const(64U, fld_imm_val));
this->builder.CreateStore(X_rd_val, get_reg_ptr(fld_rd_val), false); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_rd_val != 0){ if(fld_rd_val != 0){
Value* X_rd_val = this->builder.CreateAdd( Value* X_rd_val = this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0), cur_pc_val,
this->gen_const(64U, 4)); this->gen_const(64U, 4));
this->builder.CreateStore(X_rd_val, get_reg_ptr(fld_rd_val), false); this->builder.CreateStore(X_rd_val, get_reg_ptr(fld_rd_val), false);
} }
Value* PC_val = this->builder.CreateAdd( 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->gen_const(64U, fld_imm_val));
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false); this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
this->gen_sync(iss::POST_SYNC, 17); this->gen_sync(iss::POST_SYNC, 17);
@ -1109,6 +1146,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* new_pc_val = this->builder.CreateAdd( Value* new_pc_val = this->builder.CreateAdd(
@ -1136,7 +1175,7 @@ private:
{ {
if(fld_rd_val != 0){ if(fld_rd_val != 0){
Value* X_rd_val = this->builder.CreateAdd( Value* X_rd_val = this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 1), cur_pc_val,
this->gen_const(64U, 4)); this->gen_const(64U, 4));
this->builder.CreateStore(X_rd_val, get_reg_ptr(fld_rd_val), false); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* PC_val = this->gen_choose( Value* PC_val = this->gen_choose(
@ -1181,10 +1222,10 @@ private:
this->gen_reg_load(fld_rs1_val, 0), this->gen_reg_load(fld_rs1_val, 0),
this->gen_reg_load(fld_rs2_val, 0)), this->gen_reg_load(fld_rs2_val, 0)),
this->builder.CreateAdd( this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0), cur_pc_val,
this->gen_const(64U, fld_imm_val)), this->gen_const(64U, fld_imm_val)),
this->builder.CreateAdd( this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0), cur_pc_val,
this->gen_const(64U, 4)), this->gen_const(64U, 4)),
64); 64);
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* PC_val = this->gen_choose( Value* PC_val = this->gen_choose(
@ -1221,10 +1264,10 @@ private:
this->gen_reg_load(fld_rs1_val, 0), this->gen_reg_load(fld_rs1_val, 0),
this->gen_reg_load(fld_rs2_val, 0)), this->gen_reg_load(fld_rs2_val, 0)),
this->builder.CreateAdd( this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0), cur_pc_val,
this->gen_const(64U, fld_imm_val)), this->gen_const(64U, fld_imm_val)),
this->builder.CreateAdd( this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0), cur_pc_val,
this->gen_const(64U, 4)), this->gen_const(64U, 4)),
64); 64);
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* PC_val = this->gen_choose( Value* PC_val = this->gen_choose(
@ -1265,10 +1310,10 @@ private:
this->gen_reg_load(fld_rs2_val, 0), this->gen_reg_load(fld_rs2_val, 0),
64, true)), 64, true)),
this->builder.CreateAdd( this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0), cur_pc_val,
this->gen_const(64U, fld_imm_val)), this->gen_const(64U, fld_imm_val)),
this->builder.CreateAdd( this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0), cur_pc_val,
this->gen_const(64U, 4)), this->gen_const(64U, 4)),
64); 64);
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* PC_val = this->gen_choose( Value* PC_val = this->gen_choose(
@ -1309,10 +1356,10 @@ private:
this->gen_reg_load(fld_rs2_val, 0), this->gen_reg_load(fld_rs2_val, 0),
64, true)), 64, true)),
this->builder.CreateAdd( this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0), cur_pc_val,
this->gen_const(64U, fld_imm_val)), this->gen_const(64U, fld_imm_val)),
this->builder.CreateAdd( this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0), cur_pc_val,
this->gen_const(64U, 4)), this->gen_const(64U, 4)),
64); 64);
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* PC_val = this->gen_choose( Value* PC_val = this->gen_choose(
@ -1349,10 +1398,10 @@ private:
this->gen_reg_load(fld_rs1_val, 0), this->gen_reg_load(fld_rs1_val, 0),
this->gen_reg_load(fld_rs2_val, 0)), this->gen_reg_load(fld_rs2_val, 0)),
this->builder.CreateAdd( this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0), cur_pc_val,
this->gen_const(64U, fld_imm_val)), this->gen_const(64U, fld_imm_val)),
this->builder.CreateAdd( this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0), cur_pc_val,
this->gen_const(64U, 4)), this->gen_const(64U, 4)),
64); 64);
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* PC_val = this->gen_choose( Value* PC_val = this->gen_choose(
@ -1389,10 +1440,10 @@ private:
this->gen_reg_load(fld_rs1_val, 0), this->gen_reg_load(fld_rs1_val, 0),
this->gen_reg_load(fld_rs2_val, 0)), this->gen_reg_load(fld_rs2_val, 0)),
this->builder.CreateAdd( this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0), cur_pc_val,
this->gen_const(64U, fld_imm_val)), this->gen_const(64U, fld_imm_val)),
this->builder.CreateAdd( this->builder.CreateAdd(
this->gen_reg_load(traits<ARCH>::PC, 0), cur_pc_val,
this->gen_const(64U, 4)), this->gen_const(64U, 4)),
64); 64);
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* offs_val = this->builder.CreateAdd( Value* offs_val = this->builder.CreateAdd(
@ -1460,6 +1513,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* offs_val = this->builder.CreateAdd( Value* offs_val = this->builder.CreateAdd(
@ -1499,6 +1554,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* offs_val = this->builder.CreateAdd( Value* offs_val = this->builder.CreateAdd(
@ -1538,6 +1595,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* offs_val = this->builder.CreateAdd( Value* offs_val = this->builder.CreateAdd(
@ -1577,6 +1636,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* offs_val = this->builder.CreateAdd( Value* offs_val = this->builder.CreateAdd(
@ -1616,6 +1677,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* offs_val = this->builder.CreateAdd( Value* offs_val = this->builder.CreateAdd(
@ -1653,6 +1716,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* offs_val = this->builder.CreateAdd( Value* offs_val = this->builder.CreateAdd(
@ -1690,6 +1755,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* offs_val = this->builder.CreateAdd( Value* offs_val = this->builder.CreateAdd(
@ -1727,6 +1794,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_rd_val != 0){ if(fld_rd_val != 0){
@ -1762,6 +1831,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_rd_val != 0){ if(fld_rd_val != 0){
@ -1806,6 +1877,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
int64_t full_imm_val = fld_imm_val; int64_t full_imm_val = fld_imm_val;
@ -1851,6 +1924,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_rd_val != 0){ if(fld_rd_val != 0){
@ -1886,6 +1961,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_rd_val != 0){ if(fld_rd_val != 0){
@ -1921,6 +1998,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_rd_val != 0){ if(fld_rd_val != 0){
@ -1956,6 +2035,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_rd_val != 0){ if(fld_rd_val != 0){
@ -1991,6 +2072,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_rd_val != 0){ if(fld_rd_val != 0){
@ -2026,6 +2109,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_rd_val != 0){ if(fld_rd_val != 0){
@ -2063,6 +2148,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_rd_val != 0){ if(fld_rd_val != 0){
@ -2107,6 +2194,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_rd_val != 0){ if(fld_rd_val != 0){
@ -2153,6 +2242,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_rd_val != 0){ if(fld_rd_val != 0){
@ -2188,6 +2279,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_rd_val != 0){ if(fld_rd_val != 0){
@ -2225,6 +2318,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_rd_val != 0){ if(fld_rd_val != 0){
@ -2262,6 +2357,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_rd_val != 0){ if(fld_rd_val != 0){
@ -2297,6 +2394,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_rd_val != 0){ if(fld_rd_val != 0){
@ -2331,6 +2430,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* FENCE_fence_val = this->builder.CreateOr( Value* FENCE_fence_val = this->builder.CreateOr(
@ -2367,6 +2468,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* FENCE_fencei_val = this->gen_const(64U, fld_imm_val); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
this->gen_raise_trap(0, 11); this->gen_raise_trap(0, 11);
@ -2420,6 +2525,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
this->gen_raise_trap(0, 3); this->gen_raise_trap(0, 3);
@ -2444,6 +2551,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
this->gen_leave_trap(0); this->gen_leave_trap(0);
@ -2468,6 +2577,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
this->gen_leave_trap(1); this->gen_leave_trap(1);
@ -2492,6 +2603,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
this->gen_leave_trap(3); this->gen_leave_trap(3);
@ -2516,6 +2629,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
this->gen_wait(1); this->gen_wait(1);
@ -2543,6 +2658,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* FENCE_fencevmal_val = this->gen_const(64U, fld_rs1_val); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* rs_val_val = this->gen_reg_load(fld_rs1_val, 0); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* xrd_val = this->gen_read_mem(traits<ARCH>::CSR, fld_csr_val, 64/8); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* xrd_val = this->gen_read_mem(traits<ARCH>::CSR, fld_csr_val, 64/8); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_rd_val != 0){ if(fld_rd_val != 0){
@ -2757,6 +2882,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* res_val = this->gen_read_mem(traits<ARCH>::CSR, fld_csr_val, 64/8); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* res_val = this->gen_read_mem(traits<ARCH>::CSR, fld_csr_val, 64/8); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_rd_val != 0){ if(fld_rd_val != 0){
@ -2897,6 +3028,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
if(fld_rd_val != 0){ if(fld_rd_val != 0){
@ -3464,6 +3617,8 @@ private:
}; };
this->builder.CreateCall(this->mod->getFunction("print_disass"), args); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0); 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); this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
} }
Value* cur_pc_val = this->gen_const(64, pc.val);
pc=pc+4; pc=pc+4;
Value* offs_val = this->gen_reg_load(fld_rs1_val, 0); 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, std::tuple<vm::continuation_e, llvm::BasicBlock *> illegal_intruction(virt_addr_t &pc, code_word_t instr,
llvm::BasicBlock *bb) { 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), this->builder.CreateStore(this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::NEXT_PC), true),
get_reg_ptr(traits<ARCH>::PC), true); get_reg_ptr(traits<ARCH>::PC), true);
this->builder.CreateStore( this->builder.CreateStore(
@ -3981,7 +4154,7 @@ private:
get_reg_ptr(traits<ARCH>::ICOUNT), true); get_reg_ptr(traits<ARCH>::ICOUNT), true);
pc = pc + ((instr & 3) == 3 ? 4 : 2); pc = pc + ((instr & 3) == 3 ? 4 : 2);
this->gen_raise_trap(0, 2); // illegal instruction trap 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); this->gen_trap_check(this->leave_blk);
return std::make_tuple(iss::vm::BRANCH, nullptr); return std::make_tuple(iss::vm::BRANCH, nullptr);
} }

@ -1 +1 @@
Subproject commit 0122e4d3123eff995aa90a08b8fda3e5b94827d9 Subproject commit 92802d543014324ad599723ae32d0a84c5162ca8