This commit is contained in:
2020-05-31 16:41:04 +02:00
parent 10797a473d
commit abcfb75011
13 changed files with 2356 additions and 3079 deletions
+3 -4
View File
@@ -61,11 +61,11 @@ set(LIB_SOURCES ${LIB_SOURCES}
endif() endif()
# Define the library # Define the library
add_library(riscv ${LIB_SOURCES}) add_library(riscv SHARED ${LIB_SOURCES})
SET(riscv -Wl,-whole-archive -lriscv -Wl,-no-whole-archive)
target_compile_options(riscv PRIVATE -Wno-shift-count-overflow) target_compile_options(riscv PRIVATE -Wno-shift-count-overflow)
target_include_directories(riscv PUBLIC incl ../external/elfio) target_include_directories(riscv PUBLIC incl ../external/elfio)
target_link_libraries(riscv PUBLIC softfloat dbt-core scc-util) target_link_libraries(riscv PUBLIC softfloat scc-util)
target_link_libraries(riscv PUBLIC -Wl,--whole-archive dbt-core -Wl,--no-whole-archive)
set_target_properties(riscv PROPERTIES set_target_properties(riscv PROPERTIES
VERSION ${PROJECT_VERSION} VERSION ${PROJECT_VERSION}
FRAMEWORK FALSE FRAMEWORK FALSE
@@ -104,7 +104,6 @@ endif()
# Links the target exe against the libraries # Links the target exe against the libraries
target_link_libraries(riscv-sim riscv) target_link_libraries(riscv-sim riscv)
target_link_libraries(riscv-sim jsoncpp) target_link_libraries(riscv-sim jsoncpp)
target_link_libraries(riscv-sim dbt-core)
target_link_libraries(riscv-sim external) target_link_libraries(riscv-sim external)
target_link_libraries(riscv-sim ${Boost_LIBRARIES} ) target_link_libraries(riscv-sim ${Boost_LIBRARIES} )
if (Tcmalloc_FOUND) if (Tcmalloc_FOUND)
+10 -10
View File
@@ -10,7 +10,7 @@ InsructionSet RV32F extends RV32I{
instructions{ instructions{
FLW { FLW {
encoding: imm[11:0]s | rs1[4:0] | b010 | rd[4:0] | b0000111; encoding: imm[11:0]s | rs1[4:0] | b010 | rd[4:0] | b0000111;
args_disass:"f{rd}, {imm}(x{rs1})"; args_disass:"f{rd}, {imm}({name(rs1)})";
val offs[XLEN] <= X[rs1]'s + imm; val offs[XLEN] <= X[rs1]'s + imm;
val res[32] <= MEM[offs]{32}; val res[32] <= MEM[offs]{32};
if(FLEN==32) if(FLEN==32)
@@ -22,13 +22,13 @@ InsructionSet RV32F extends RV32I{
} }
FSW { FSW {
encoding: imm[11:5]s | rs2[4:0] | rs1[4:0] | b010 | imm[4:0]s | b0100111; encoding: imm[11:5]s | rs2[4:0] | rs1[4:0] | b010 | imm[4:0]s | b0100111;
args_disass:"f{rs2}, {imm}(x{rs1})"; args_disass:"f{rs2}, {imm}({name(rs1)])";
val offs[XLEN] <= X[rs1]'s + imm; val offs[XLEN] <= X[rs1]'s + imm;
MEM[offs]{32}<=F[rs2]{32}; MEM[offs]{32}<=F[rs2]{32};
} }
FMADD.S { FMADD.S {
encoding: rs3[4:0] | b00 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1000011; encoding: rs3[4:0] | b00 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1000011;
args_disass:"x{rd}, f{rs1}, f{rs2}, f{rs3}"; args_disass:"{name(rd)}, f{rs1}, f{rs2}, f{rs3}";
//F[rd]f<= F[rs1]f * F[rs2]f + F[rs3]f; //F[rd]f<= F[rs1]f * F[rs2]f + F[rs3]f;
if(FLEN==32) if(FLEN==32)
F[rd] <= fdispatch_fmadd_s(F[rs1], F[rs2], F[rs3], zext(0, 32), choose(rm<7, rm{8}, FCSR{8})); F[rd] <= fdispatch_fmadd_s(F[rs1], F[rs2], F[rs3], zext(0, 32), choose(rm<7, rm{8}, FCSR{8}));
@@ -45,7 +45,7 @@ InsructionSet RV32F extends RV32I{
} }
FMSUB.S { FMSUB.S {
encoding: rs3[4:0] | b00 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1000111; encoding: rs3[4:0] | b00 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1000111;
args_disass:"x{rd}, f{rs1}, f{rs2}, f{rs3}"; args_disass:"{name(rd)}, f{rs1}, f{rs2}, f{rs3}";
//F[rd]f<=F[rs1]f * F[rs2]f - F[rs3]f; //F[rd]f<=F[rs1]f * F[rs2]f - F[rs3]f;
if(FLEN==32) if(FLEN==32)
F[rd] <= fdispatch_fmadd_s(F[rs1], F[rs2], F[rs3], zext(1, 32), choose(rm<7, rm{8}, FCSR{8})); F[rd] <= fdispatch_fmadd_s(F[rs1], F[rs2], F[rs3], zext(1, 32), choose(rm<7, rm{8}, FCSR{8}));
@@ -62,7 +62,7 @@ InsructionSet RV32F extends RV32I{
} }
FNMADD.S { FNMADD.S {
encoding: rs3[4:0] | b00 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1001111; encoding: rs3[4:0] | b00 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1001111;
args_disass:"x{rd}, f{rs1}, f{rs2}, f{rs3}"; args_disass:"name(rd), f{rs1}, f{rs2}, f{rs3}";
//F[rd]f<=-F[rs1]f * F[rs2]f + F[rs3]f; //F[rd]f<=-F[rs1]f * F[rs2]f + F[rs3]f;
if(FLEN==32) if(FLEN==32)
F[rd] <= fdispatch_fmadd_s(F[rs1], F[rs2], F[rs3], zext(2, 32), choose(rm<7, rm{8}, FCSR{8})); F[rd] <= fdispatch_fmadd_s(F[rs1], F[rs2], F[rs3], zext(2, 32), choose(rm<7, rm{8}, FCSR{8}));
@@ -79,7 +79,7 @@ InsructionSet RV32F extends RV32I{
} }
FNMSUB.S { FNMSUB.S {
encoding: rs3[4:0] | b00 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1001011; encoding: rs3[4:0] | b00 | rs2[4:0] | rs1[4:0] | rm[2:0] | rd[4:0] | b1001011;
args_disass:"x{rd}, f{rs1}, f{rs2}, f{rs3}"; args_disass:"{name(rd)}, f{rs1}, f{rs2}, f{rs3}";
//F[rd]f<=-F[rs1]f * F[rs2]f - F[rs3]f; //F[rd]f<=-F[rs1]f * F[rs2]f - F[rs3]f;
if(FLEN==32) if(FLEN==32)
F[rd] <= fdispatch_fmadd_s(F[rs1], F[rs2], F[rs3], zext(3, 32), choose(rm<7, rm{8}, FCSR{8})); F[rd] <= fdispatch_fmadd_s(F[rs1], F[rs2], F[rs3], zext(3, 32), choose(rm<7, rm{8}, FCSR{8}));
@@ -359,7 +359,7 @@ InsructionSet RV64F extends RV32F{
instructions{ instructions{
FCVT.L.S { // fp to 64bit signed integer FCVT.L.S { // fp to 64bit signed integer
encoding: b1100000 | b00010 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011; encoding: b1100000 | b00010 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
args_disass:"x{rd}, f{rs1}"; args_disass:"{name(rd)}, f{rs1}";
val res[64] <= fdispatch_fcvt_32_64(fdispatch_unbox_s(F[rs1]), zext(0, 32), rm{8}); val res[64] <= fdispatch_fcvt_32_64(fdispatch_unbox_s(F[rs1]), zext(0, 32), rm{8});
X[rd]<= sext(res); X[rd]<= sext(res);
val flags[32] <= fdispatch_fget_flags(); val flags[32] <= fdispatch_fget_flags();
@@ -367,7 +367,7 @@ InsructionSet RV64F extends RV32F{
} }
FCVT.LU.S { // fp to 64bit unsigned integer FCVT.LU.S { // fp to 64bit unsigned integer
encoding: b1100000 | b00011 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011; encoding: b1100000 | b00011 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
args_disass:"x{rd}, f{rs1}"; args_disass:"{name(rd)}, f{rs1}";
val res[64] <= fdispatch_fcvt_32_64(fdispatch_unbox_s(F[rs1]), zext(1, 32), rm{8}); val res[64] <= fdispatch_fcvt_32_64(fdispatch_unbox_s(F[rs1]), zext(1, 32), rm{8});
X[rd]<= zext(res); X[rd]<= zext(res);
val flags[32] <= fdispatch_fget_flags(); val flags[32] <= fdispatch_fget_flags();
@@ -375,7 +375,7 @@ InsructionSet RV64F extends RV32F{
} }
FCVT.S.L { // 64bit signed int to to fp FCVT.S.L { // 64bit signed int to to fp
encoding: b1101000 | b00010 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011; encoding: b1101000 | b00010 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
args_disass:"f{rd}, x{rs1}"; args_disass:"f{rd}, {name(rs1)}";
val res[32] <= fdispatch_fcvt_64_32(X[rs1], zext(2, 32), rm{8}); val res[32] <= fdispatch_fcvt_64_32(X[rs1], zext(2, 32), rm{8});
if(FLEN==32) if(FLEN==32)
F[rd] <= res; F[rd] <= res;
@@ -386,7 +386,7 @@ InsructionSet RV64F extends RV32F{
} }
FCVT.S.LU { // 64bit unsigned int to to fp FCVT.S.LU { // 64bit unsigned int to to fp
encoding: b1101000 | b00011 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011; encoding: b1101000 | b00011 | rs1[4:0] | rm[2:0] | rd[4:0] | b1010011;
args_disass:"f{rd}, x{rs1}"; args_disass:"f{rd}, {name(rs1)}";
val res[32] <=fdispatch_fcvt_64_32(X[rs1], zext(3,32), rm{8}); val res[32] <=fdispatch_fcvt_64_32(X[rs1], zext(3,32), rm{8});
if(FLEN==32) if(FLEN==32)
F[rd] <= res; F[rd] <= res;
+5 -5
View File
@@ -2,14 +2,14 @@ import "RISCVBase.core_desc"
InsructionSet RV32M extends RISCVBase { InsructionSet RV32M extends RISCVBase {
constants { constants {
MAXLEN:=128 MUL_LEN
} }
instructions{ instructions{
MUL{ MUL{
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b0110011; encoding: b0000001 | rs2[4:0] | rs1[4:0] | b000 | rd[4:0] | b0110011;
args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}"; args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
if(rd != 0){ if(rd != 0){
val res[MAXLEN] <= zext(X[rs1], MAXLEN) * zext(X[rs2], MAXLEN); val res[MUL_LEN] <= zext(X[rs1], MUL_LEN) * zext(X[rs2], MUL_LEN);
X[rd]<= zext(res , XLEN); X[rd]<= zext(res , XLEN);
} }
} }
@@ -17,7 +17,7 @@ InsructionSet RV32M extends RISCVBase {
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b001 | rd[4:0] | b0110011; encoding: b0000001 | rs2[4:0] | rs1[4:0] | b001 | rd[4:0] | b0110011;
args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}"; args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
if(rd != 0){ if(rd != 0){
val res[MAXLEN] <= sext(X[rs1], MAXLEN) * sext(X[rs2], MAXLEN); val res[MUL_LEN] <= sext(X[rs1], MUL_LEN) * sext(X[rs2], MUL_LEN);
X[rd]<= zext(res >> XLEN, XLEN); X[rd]<= zext(res >> XLEN, XLEN);
} }
} }
@@ -25,7 +25,7 @@ InsructionSet RV32M extends RISCVBase {
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b0110011; encoding: b0000001 | rs2[4:0] | rs1[4:0] | b010 | rd[4:0] | b0110011;
args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}"; args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
if(rd != 0){ if(rd != 0){
val res[MAXLEN] <= sext(X[rs1], MAXLEN) * zext(X[rs2], MAXLEN); val res[MUL_LEN] <= sext(X[rs1], MUL_LEN) * zext(X[rs2], MUL_LEN);
X[rd]<= zext(res >> XLEN, XLEN); X[rd]<= zext(res >> XLEN, XLEN);
} }
} }
@@ -33,7 +33,7 @@ InsructionSet RV32M extends RISCVBase {
encoding: b0000001 | rs2[4:0] | rs1[4:0] | b011 | rd[4:0] | b0110011; encoding: b0000001 | rs2[4:0] | rs1[4:0] | b011 | rd[4:0] | b0110011;
args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}"; args_disass:"{name(rd)}, {name(rs1)}, {name(rs2)}";
if(rd != 0){ if(rd != 0){
val res[MAXLEN] <= zext(X[rs1], MAXLEN) * zext(X[rs2], MAXLEN); val res[MUL_LEN] <= zext(X[rs1], MUL_LEN) * zext(X[rs2], MUL_LEN);
X[rd]<= zext(res >> XLEN, XLEN); X[rd]<= zext(res >> XLEN, XLEN);
} }
} }
+3
View File
@@ -22,6 +22,7 @@ Core RV32IMAC provides RV32I, RV32M, RV32A, RV32IC {
constants { constants {
XLEN:=32; XLEN:=32;
PCLEN:=32; PCLEN:=32;
MUL_LEN:=64;
// definitions for the architecture wrapper // definitions for the architecture wrapper
// XL ZYXWVUTSRQPONMLKJIHGFEDCBA // XL ZYXWVUTSRQPONMLKJIHGFEDCBA
MISA_VAL:=0b01000000000101000001000100000101; MISA_VAL:=0b01000000000101000001000100000101;
@@ -35,6 +36,7 @@ Core RV32GC provides RV32I, RV32M, RV32A, RV32F, RV32D, RV32IC, RV32FC, RV32DC {
XLEN:=32; XLEN:=32;
FLEN:=64; FLEN:=64;
PCLEN:=32; PCLEN:=32;
MUL_LEN:=64;
// definitions for the architecture wrapper // definitions for the architecture wrapper
// XL ZYXWVUTSRQPONMLKJIHGFEDCBA // XL ZYXWVUTSRQPONMLKJIHGFEDCBA
MISA_VAL:=0b01000000000101000001000100101101; MISA_VAL:=0b01000000000101000001000100101101;
@@ -60,6 +62,7 @@ Core RV64GC provides RV64I, RV64M, RV64A, RV64F, RV64D, RV64IC, RV32FC, RV32DC {
XLEN:=64; XLEN:=64;
FLEN:=64; FLEN:=64;
PCLEN:=64; PCLEN:=64;
MUL_LEN:=128;
// definitions for the architecture wrapper // definitions for the architecture wrapper
// XL ZYXWVUTSRQPONMLKJIHGFEDCBA // XL ZYXWVUTSRQPONMLKJIHGFEDCBA
MISA_VAL:=0b01000000000101000001000100101101; MISA_VAL:=0b01000000000101000001000100101101;
+11 -12
View File
@@ -857,6 +857,8 @@ iss::status riscv_hart_msu_vp<BASE>::write(const address_type type, const access
template <typename BASE> iss::status riscv_hart_msu_vp<BASE>::read_csr(unsigned addr, reg_t &val) { template <typename BASE> iss::status riscv_hart_msu_vp<BASE>::read_csr(unsigned addr, reg_t &val) {
if (addr >= csr.size()) return iss::Err; if (addr >= csr.size()) return iss::Err;
auto req_priv_lvl = (addr >> 8) & 0x3;
if (this->reg.machine_state < req_priv_lvl) throw illegal_instruction_fault(this->fault_data);
auto it = csr_rd_cb.find(addr); auto it = csr_rd_cb.find(addr);
if (it == csr_rd_cb.end()) { if (it == csr_rd_cb.end()) {
val = csr[addr & csr.page_addr_mask]; val = csr[addr & csr.page_addr_mask];
@@ -869,6 +871,11 @@ template <typename BASE> iss::status riscv_hart_msu_vp<BASE>::read_csr(unsigned
template <typename BASE> iss::status riscv_hart_msu_vp<BASE>::write_csr(unsigned addr, reg_t val) { template <typename BASE> iss::status riscv_hart_msu_vp<BASE>::write_csr(unsigned addr, reg_t val) {
if (addr >= csr.size()) return iss::Err; if (addr >= csr.size()) return iss::Err;
auto req_priv_lvl = (addr >> 8) & 0x3;
if (this->reg.machine_state < req_priv_lvl)
throw illegal_instruction_fault(this->fault_data);
if((addr&0xc00)==0xc00)
throw illegal_instruction_fault(this->fault_data);
auto it = csr_wr_cb.find(addr); auto it = csr_wr_cb.find(addr);
if (it == csr_wr_cb.end()) { if (it == csr_wr_cb.end()) {
csr[addr & csr.page_addr_mask] = val; csr[addr & csr.page_addr_mask] = val;
@@ -902,15 +909,13 @@ template <typename BASE> iss::status riscv_hart_msu_vp<BASE>::read_time(unsigned
} }
template <typename BASE> iss::status riscv_hart_msu_vp<BASE>::read_status(unsigned addr, reg_t &val) { template <typename BASE> iss::status riscv_hart_msu_vp<BASE>::read_status(unsigned addr, reg_t &val) {
auto req_priv_lvl = addr >> 8; auto req_priv_lvl = (addr >> 8) & 0x3;
if (this->reg.machine_state < req_priv_lvl) throw illegal_instruction_fault(this->fault_data);
val = state.mstatus & hart_state<reg_t>::get_mask(req_priv_lvl); val = state.mstatus & hart_state<reg_t>::get_mask(req_priv_lvl);
return iss::Ok; return iss::Ok;
} }
template <typename BASE> iss::status riscv_hart_msu_vp<BASE>::write_status(unsigned addr, reg_t val) { template <typename BASE> iss::status riscv_hart_msu_vp<BASE>::write_status(unsigned addr, reg_t val) {
auto req_priv_lvl = addr >> 8; auto req_priv_lvl = (addr >> 8) & 0x3;
if (this->reg.machine_state < req_priv_lvl) throw illegal_instruction_fault(this->fault_data);
state.write_mstatus(val, req_priv_lvl); state.write_mstatus(val, req_priv_lvl);
check_interrupt(); check_interrupt();
update_vm_info(); update_vm_info();
@@ -918,8 +923,6 @@ template <typename BASE> iss::status riscv_hart_msu_vp<BASE>::write_status(unsig
} }
template <typename BASE> iss::status riscv_hart_msu_vp<BASE>::read_ie(unsigned addr, reg_t &val) { template <typename BASE> iss::status riscv_hart_msu_vp<BASE>::read_ie(unsigned addr, reg_t &val) {
auto req_priv_lvl = addr >> 8;
if (this->reg.machine_state < req_priv_lvl) throw illegal_instruction_fault(this->fault_data);
val = csr[mie]; val = csr[mie];
if (addr < mie) val &= csr[mideleg]; if (addr < mie) val &= csr[mideleg];
if (addr < sie) val &= csr[sideleg]; if (addr < sie) val &= csr[sideleg];
@@ -927,8 +930,7 @@ template <typename BASE> iss::status riscv_hart_msu_vp<BASE>::read_ie(unsigned a
} }
template <typename BASE> iss::status riscv_hart_msu_vp<BASE>::write_ie(unsigned addr, reg_t val) { template <typename BASE> iss::status riscv_hart_msu_vp<BASE>::write_ie(unsigned addr, reg_t val) {
auto req_priv_lvl = addr >> 8; auto req_priv_lvl = (addr >> 8) & 0x3;
if (this->reg.machine_state < req_priv_lvl) throw illegal_instruction_fault(this->fault_data);
auto mask = get_irq_mask(req_priv_lvl); auto mask = get_irq_mask(req_priv_lvl);
csr[mie] = (csr[mie] & ~mask) | (val & mask); csr[mie] = (csr[mie] & ~mask) | (val & mask);
check_interrupt(); check_interrupt();
@@ -936,8 +938,6 @@ template <typename BASE> iss::status riscv_hart_msu_vp<BASE>::write_ie(unsigned
} }
template <typename BASE> iss::status riscv_hart_msu_vp<BASE>::read_ip(unsigned addr, reg_t &val) { template <typename BASE> iss::status riscv_hart_msu_vp<BASE>::read_ip(unsigned addr, reg_t &val) {
auto req_priv_lvl = addr >> 8;
if (this->reg.machine_state < req_priv_lvl) throw illegal_instruction_fault(this->fault_data);
val = csr[mip]; val = csr[mip];
if (addr < mip) val &= csr[mideleg]; if (addr < mip) val &= csr[mideleg];
if (addr < sip) val &= csr[sideleg]; if (addr < sip) val &= csr[sideleg];
@@ -945,8 +945,7 @@ template <typename BASE> iss::status riscv_hart_msu_vp<BASE>::read_ip(unsigned a
} }
template <typename BASE> iss::status riscv_hart_msu_vp<BASE>::write_ip(unsigned addr, reg_t val) { template <typename BASE> iss::status riscv_hart_msu_vp<BASE>::write_ip(unsigned addr, reg_t val) {
auto req_priv_lvl = addr >> 8; auto req_priv_lvl = (addr >> 8) & 0x3;
if (this->reg.machine_state < req_priv_lvl) throw illegal_instruction_fault(this->fault_data);
auto mask = get_irq_mask(req_priv_lvl); auto mask = get_irq_mask(req_priv_lvl);
mask &= ~(1 << 7); // MTIP is read only mask &= ~(1 << 7); // MTIP is read only
csr[mip] = (csr[mip] & ~mask) | (val & mask); csr[mip] = (csr[mip] & ~mask) | (val & mask);
+1 -1
View File
@@ -54,7 +54,7 @@ template <> struct traits<rv32gc> {
static constexpr std::array<const char*, 66> reg_aliases{ static constexpr std::array<const char*, 66> reg_aliases{
{"zero", "ra", "sp", "gp", "tp", "t0", "t1", "t2", "s0", "s1", "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", "s11", "t3", "t4", "t5", "t6", "pc", "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", "fcsr"}}; {"zero", "ra", "sp", "gp", "tp", "t0", "t1", "t2", "s0", "s1", "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", "s11", "t3", "t4", "t5", "t6", "pc", "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", "fcsr"}};
enum constants {XLEN=32, FLEN=64, PCLEN=32, MISA_VAL=0b1000000000101000001000100101101, PGSIZE=0x1000, PGMASK=0xfff}; enum constants {XLEN=32, FLEN=64, PCLEN=32, MUL_LEN=64, MISA_VAL=0b1000000000101000001000100101101, PGSIZE=0x1000, PGMASK=0xfff};
constexpr static unsigned FP_REGS_SIZE = 64; constexpr static unsigned FP_REGS_SIZE = 64;
+1 -1
View File
@@ -54,7 +54,7 @@ template <> struct traits<rv32imac> {
static constexpr std::array<const char*, 33> reg_aliases{ static constexpr std::array<const char*, 33> reg_aliases{
{"zero", "ra", "sp", "gp", "tp", "t0", "t1", "t2", "s0", "s1", "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", "s11", "t3", "t4", "t5", "t6", "pc"}}; {"zero", "ra", "sp", "gp", "tp", "t0", "t1", "t2", "s0", "s1", "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", "s11", "t3", "t4", "t5", "t6", "pc"}};
enum constants {XLEN=32, PCLEN=32, MISA_VAL=0b1000000000101000001000100000101, PGSIZE=0x1000, PGMASK=0xfff}; enum constants {XLEN=32, PCLEN=32, MUL_LEN=64, MISA_VAL=0b1000000000101000001000100000101, PGSIZE=0x1000, PGMASK=0xfff};
constexpr static unsigned FP_REGS_SIZE = 0; constexpr static unsigned FP_REGS_SIZE = 0;
+1 -1
View File
@@ -54,7 +54,7 @@ template <> struct traits<rv64gc> {
static constexpr std::array<const char*, 66> reg_aliases{ static constexpr std::array<const char*, 66> reg_aliases{
{"zero", "ra", "sp", "gp", "tp", "t0", "t1", "t2", "s0", "s1", "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", "s11", "t3", "t4", "t5", "t6", "pc", "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", "fcsr"}}; {"zero", "ra", "sp", "gp", "tp", "t0", "t1", "t2", "s0", "s1", "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", "s11", "t3", "t4", "t5", "t6", "pc", "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", "fcsr"}};
enum constants {XLEN=64, FLEN=64, PCLEN=64, MISA_VAL=0b1000000000101000001000100101101, PGSIZE=0x1000, PGMASK=0xfff}; enum constants {XLEN=64, FLEN=64, PCLEN=64, MUL_LEN=128, MISA_VAL=0b1000000000101000001000100101101, PGSIZE=0x1000, PGMASK=0xfff};
constexpr static unsigned FP_REGS_SIZE = 64; constexpr static unsigned FP_REGS_SIZE = 64;
+167 -236
View File
@@ -364,8 +364,7 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.constant(imm, 32U), 32); tu.store(tu.constant(imm, 32U), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -391,12 +390,11 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.add( tu.store(tu.add(
tu.ext( tu.ext(
cur_pc_val, cur_pc_val,
32, false), 32, false),
tu.constant(imm, 32U)), 32); tu.constant(imm, 32U)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -422,10 +420,9 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.add( tu.store(tu.add(
cur_pc_val, cur_pc_val,
tu.constant(4, 32U)), 32); tu.constant(4, 32U)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
auto PC_val_v = tu.assignment("PC_val", tu.add( auto PC_val_v = tu.assignment("PC_val", tu.add(
tu.ext( tu.ext(
@@ -460,16 +457,15 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto new_pc_val = tu.add( auto new_pc_val = tu.assignment(tu.add(
tu.ext( tu.ext(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
32, false), 32, false),
tu.constant(imm, 32U)); tu.constant(imm, 32U)), 32);
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.add( tu.store(tu.add(
cur_pc_val, cur_pc_val,
tu.constant(4, 32U)), 32); tu.constant(4, 32U)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
auto PC_val_v = tu.assignment("PC_val", tu.l_and( auto PC_val_v = tu.assignment("PC_val", tu.l_and(
new_pc_val, new_pc_val,
@@ -753,17 +749,16 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto offs_val = tu.add( auto offs_val = tu.assignment(tu.add(
tu.ext( tu.ext(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
32, false), 32, false),
tu.constant(imm, 32U)); tu.constant(imm, 32U)), 32);
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.ext( tu.store(tu.ext(
tu.read_mem(traits<ARCH>::MEM, offs_val, 8), tu.read_mem(traits<ARCH>::MEM, offs_val, 8),
32, 32,
false), 32); false), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -789,17 +784,16 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto offs_val = tu.add( auto offs_val = tu.assignment(tu.add(
tu.ext( tu.ext(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
32, false), 32, false),
tu.constant(imm, 32U)); tu.constant(imm, 32U)), 32);
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.ext( tu.store(tu.ext(
tu.read_mem(traits<ARCH>::MEM, offs_val, 16), tu.read_mem(traits<ARCH>::MEM, offs_val, 16),
32, 32,
false), 32); false), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -825,17 +819,16 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto offs_val = tu.add( auto offs_val = tu.assignment(tu.add(
tu.ext( tu.ext(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
32, false), 32, false),
tu.constant(imm, 32U)); tu.constant(imm, 32U)), 32);
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.ext( tu.store(tu.ext(
tu.read_mem(traits<ARCH>::MEM, offs_val, 32), tu.read_mem(traits<ARCH>::MEM, offs_val, 32),
32, 32,
false), 32); false), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -861,17 +854,16 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto offs_val = tu.add( auto offs_val = tu.assignment(tu.add(
tu.ext( tu.ext(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
32, false), 32, false),
tu.constant(imm, 32U)); tu.constant(imm, 32U)), 32);
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.ext( tu.store(tu.ext(
tu.read_mem(traits<ARCH>::MEM, offs_val, 8), tu.read_mem(traits<ARCH>::MEM, offs_val, 8),
32, 32,
true), 32); true), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -897,17 +889,16 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto offs_val = tu.add( auto offs_val = tu.assignment(tu.add(
tu.ext( tu.ext(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
32, false), 32, false),
tu.constant(imm, 32U)); tu.constant(imm, 32U)), 32);
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.ext( tu.store(tu.ext(
tu.read_mem(traits<ARCH>::MEM, offs_val, 16), tu.read_mem(traits<ARCH>::MEM, offs_val, 16),
32, 32,
true), 32); true), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -933,16 +924,15 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto offs_val = tu.add( auto offs_val = tu.assignment(tu.add(
tu.ext( tu.ext(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
32, false), 32, false),
tu.constant(imm, 32U)); tu.constant(imm, 32U)), 32);
auto MEMtmp0_val_v = tu.assignment("MEMtmp0_val", tu.load(rs2 + traits<ARCH>::X0, 0), 8);
tu.write_mem( tu.write_mem(
traits<ARCH>::MEM, traits<ARCH>::MEM,
offs_val, offs_val,
MEMtmp0_val_v); tu.trunc(tu.load(rs2 + traits<ARCH>::X0, 0), 8));
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
vm_base<ARCH>::gen_sync(tu, POST_SYNC, 15); vm_base<ARCH>::gen_sync(tu, POST_SYNC, 15);
@@ -967,16 +957,15 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto offs_val = tu.add( auto offs_val = tu.assignment(tu.add(
tu.ext( tu.ext(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
32, false), 32, false),
tu.constant(imm, 32U)); tu.constant(imm, 32U)), 32);
auto MEMtmp0_val_v = tu.assignment("MEMtmp0_val", tu.load(rs2 + traits<ARCH>::X0, 0), 16);
tu.write_mem( tu.write_mem(
traits<ARCH>::MEM, traits<ARCH>::MEM,
offs_val, offs_val,
MEMtmp0_val_v); tu.trunc(tu.load(rs2 + traits<ARCH>::X0, 0), 16));
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
vm_base<ARCH>::gen_sync(tu, POST_SYNC, 16); vm_base<ARCH>::gen_sync(tu, POST_SYNC, 16);
@@ -1001,16 +990,15 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto offs_val = tu.add( auto offs_val = tu.assignment(tu.add(
tu.ext( tu.ext(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
32, false), 32, false),
tu.constant(imm, 32U)); tu.constant(imm, 32U)), 32);
auto MEMtmp0_val_v = tu.assignment("MEMtmp0_val", tu.load(rs2 + traits<ARCH>::X0, 0), 32);
tu.write_mem( tu.write_mem(
traits<ARCH>::MEM, traits<ARCH>::MEM,
offs_val, offs_val,
MEMtmp0_val_v); tu.trunc(tu.load(rs2 + traits<ARCH>::X0, 0), 32));
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
vm_base<ARCH>::gen_sync(tu, POST_SYNC, 17); vm_base<ARCH>::gen_sync(tu, POST_SYNC, 17);
@@ -1036,12 +1024,11 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.add( tu.store(tu.add(
tu.ext( tu.ext(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
32, false), 32, false),
tu.constant(imm, 32U)), 32); tu.constant(imm, 32U)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1068,7 +1055,7 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.choose( tu.store(tu.choose(
tu.icmp( tu.icmp(
ICmpInst::ICMP_SLT, ICmpInst::ICMP_SLT,
tu.ext( tu.ext(
@@ -1076,8 +1063,7 @@ private:
32, false), 32, false),
tu.constant(imm, 32U)), tu.constant(imm, 32U)),
tu.constant(1, 32U), tu.constant(1, 32U),
tu.constant(0, 32U)), 32); tu.constant(0, 32U)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1105,14 +1091,13 @@ private:
tu.open_scope(); tu.open_scope();
int32_t full_imm_val = imm; int32_t full_imm_val = imm;
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.choose( tu.store(tu.choose(
tu.icmp( tu.icmp(
ICmpInst::ICMP_ULT, ICmpInst::ICMP_ULT,
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
tu.constant(full_imm_val, 32U)), tu.constant(full_imm_val, 32U)),
tu.constant(1, 32U), tu.constant(1, 32U),
tu.constant(0, 32U)), 32); tu.constant(0, 32U)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1139,12 +1124,11 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.l_xor( tu.store(tu.l_xor(
tu.ext( tu.ext(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
32, false), 32, false),
tu.constant(imm, 32U)), 32); tu.constant(imm, 32U)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1171,12 +1155,11 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.l_or( tu.store(tu.l_or(
tu.ext( tu.ext(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
32, false), 32, false),
tu.constant(imm, 32U)), 32); tu.constant(imm, 32U)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1203,12 +1186,11 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.l_and( tu.store(tu.l_and(
tu.ext( tu.ext(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
32, false), 32, false),
tu.constant(imm, 32U)), 32); tu.constant(imm, 32U)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1238,10 +1220,9 @@ private:
this->gen_raise_trap(tu, 0, 0); this->gen_raise_trap(tu, 0, 0);
} else { } else {
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.shl( tu.store(tu.shl(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
tu.constant(shamt, 32U)), 32); tu.constant(shamt, 32U)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
} }
tu.close_scope(); tu.close_scope();
@@ -1272,10 +1253,9 @@ private:
this->gen_raise_trap(tu, 0, 0); this->gen_raise_trap(tu, 0, 0);
} else { } else {
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.lshr( tu.store(tu.lshr(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
tu.constant(shamt, 32U)), 32); tu.constant(shamt, 32U)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
} }
tu.close_scope(); tu.close_scope();
@@ -1306,10 +1286,9 @@ private:
this->gen_raise_trap(tu, 0, 0); this->gen_raise_trap(tu, 0, 0);
} else { } else {
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.ashr( tu.store(tu.ashr(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
tu.constant(shamt, 32U)), 32); tu.constant(shamt, 32U)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
} }
tu.close_scope(); tu.close_scope();
@@ -1337,10 +1316,9 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.add( tu.store(tu.add(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
tu.load(rs2 + traits<ARCH>::X0, 0)), 32); tu.load(rs2 + traits<ARCH>::X0, 0)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1367,10 +1345,9 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.sub( tu.store(tu.sub(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
tu.load(rs2 + traits<ARCH>::X0, 0)), 32); tu.load(rs2 + traits<ARCH>::X0, 0)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1397,14 +1374,13 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.shl( tu.store(tu.shl(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
tu.l_and( tu.l_and(
tu.load(rs2 + traits<ARCH>::X0, 0), tu.load(rs2 + traits<ARCH>::X0, 0),
tu.sub( tu.sub(
tu.constant(32, 32U), tu.constant(32, 32U),
tu.constant(1, 32U)))), 32); tu.constant(1, 32U)))), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1431,7 +1407,7 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.choose( tu.store(tu.choose(
tu.icmp( tu.icmp(
ICmpInst::ICMP_SLT, ICmpInst::ICMP_SLT,
tu.ext( tu.ext(
@@ -1441,8 +1417,7 @@ private:
tu.load(rs2 + traits<ARCH>::X0, 0), tu.load(rs2 + traits<ARCH>::X0, 0),
32, false)), 32, false)),
tu.constant(1, 32U), tu.constant(1, 32U),
tu.constant(0, 32U)), 32); tu.constant(0, 32U)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1469,7 +1444,7 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.choose( tu.store(tu.choose(
tu.icmp( tu.icmp(
ICmpInst::ICMP_ULT, ICmpInst::ICMP_ULT,
tu.ext( tu.ext(
@@ -1481,8 +1456,7 @@ private:
32, 32,
true)), true)),
tu.constant(1, 32U), tu.constant(1, 32U),
tu.constant(0, 32U)), 32); tu.constant(0, 32U)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1509,10 +1483,9 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.l_xor( tu.store(tu.l_xor(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
tu.load(rs2 + traits<ARCH>::X0, 0)), 32); tu.load(rs2 + traits<ARCH>::X0, 0)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1539,14 +1512,13 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.lshr( tu.store(tu.lshr(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
tu.l_and( tu.l_and(
tu.load(rs2 + traits<ARCH>::X0, 0), tu.load(rs2 + traits<ARCH>::X0, 0),
tu.sub( tu.sub(
tu.constant(32, 32U), tu.constant(32, 32U),
tu.constant(1, 32U)))), 32); tu.constant(1, 32U)))), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1573,14 +1545,13 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.ashr( tu.store(tu.ashr(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
tu.l_and( tu.l_and(
tu.load(rs2 + traits<ARCH>::X0, 0), tu.load(rs2 + traits<ARCH>::X0, 0),
tu.sub( tu.sub(
tu.constant(32, 32U), tu.constant(32, 32U),
tu.constant(1, 32U)))), 32); tu.constant(1, 32U)))), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1607,10 +1578,9 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.l_or( tu.store(tu.l_or(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
tu.load(rs2 + traits<ARCH>::X0, 0)), 32); tu.load(rs2 + traits<ARCH>::X0, 0)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1637,10 +1607,9 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.l_and( tu.store(tu.l_and(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
tu.load(rs2 + traits<ARCH>::X0, 0)), 32); tu.load(rs2 + traits<ARCH>::X0, 0)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1664,15 +1633,14 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto FENCEtmp0_val_v = tu.assignment("FENCEtmp0_val", tu.l_or(
tu.shl(
tu.constant(pred, 32U),
tu.constant(4, 32U)),
tu.constant(succ, 32U)), 32);
tu.write_mem( tu.write_mem(
traits<ARCH>::FENCE, traits<ARCH>::FENCE,
tu.constant(0, 64U), tu.constant(0, 64U),
FENCEtmp0_val_v); tu.trunc(tu.l_or(
tu.shl(
tu.constant(pred, 32U),
tu.constant(4, 32U)),
tu.constant(succ, 32U)), 32));
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
vm_base<ARCH>::gen_sync(tu, POST_SYNC, 37); vm_base<ARCH>::gen_sync(tu, POST_SYNC, 37);
@@ -1694,11 +1662,10 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto FENCEtmp0_val_v = tu.assignment("FENCEtmp0_val", tu.constant(imm, 32U), 32);
tu.write_mem( tu.write_mem(
traits<ARCH>::FENCE, traits<ARCH>::FENCE,
tu.constant(1, 64U), tu.constant(1, 64U),
FENCEtmp0_val_v); tu.trunc(tu.constant(imm, 32U), 32));
tu.close_scope(); tu.close_scope();
tu.store(tu.constant(std::numeric_limits<uint32_t>::max(), 32),traits<ARCH>::LAST_BRANCH); tu.store(tu.constant(std::numeric_limits<uint32_t>::max(), 32),traits<ARCH>::LAST_BRANCH);
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1829,16 +1796,14 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto FENCEtmp0_val_v = tu.assignment("FENCEtmp0_val", tu.constant(rs1, 32U), 32);
tu.write_mem( tu.write_mem(
traits<ARCH>::FENCE, traits<ARCH>::FENCE,
tu.constant(2, 64U), tu.constant(2, 64U),
FENCEtmp0_val_v); tu.trunc(tu.constant(rs1, 32U), 32));
auto FENCEtmp1_val_v = tu.assignment("FENCEtmp1_val", tu.constant(rs2, 32U), 32);
tu.write_mem( tu.write_mem(
traits<ARCH>::FENCE, traits<ARCH>::FENCE,
tu.constant(3, 64U), tu.constant(3, 64U),
FENCEtmp1_val_v); tu.trunc(tu.constant(rs2, 32U), 32));
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
vm_base<ARCH>::gen_sync(tu, POST_SYNC, 45); vm_base<ARCH>::gen_sync(tu, POST_SYNC, 45);
@@ -1863,22 +1828,19 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto rs_val_val = tu.load(rs1 + traits<ARCH>::X0, 0); auto rs_val_val = tu.assignment(tu.load(rs1 + traits<ARCH>::X0, 0), 32);
if(rd != 0){ if(rd != 0){
auto csr_val_val = tu.read_mem(traits<ARCH>::CSR, tu.constant(csr, 16U), 32); auto csr_val_val = tu.assignment(tu.read_mem(traits<ARCH>::CSR, tu.constant(csr, 16U), 32), 32);
auto CSRtmp0_val_v = tu.assignment("CSRtmp0_val", rs_val_val, 32);
tu.write_mem( tu.write_mem(
traits<ARCH>::CSR, traits<ARCH>::CSR,
tu.constant(csr, 16U), tu.constant(csr, 16U),
CSRtmp0_val_v); tu.trunc(rs_val_val, 32));
auto Xtmp1_val_v = tu.assignment("Xtmp1_val", csr_val_val, 32); tu.store(csr_val_val, rd + traits<ARCH>::X0);
tu.store(Xtmp1_val_v, rd + traits<ARCH>::X0);
} else { } else {
auto CSRtmp2_val_v = tu.assignment("CSRtmp2_val", rs_val_val, 32);
tu.write_mem( tu.write_mem(
traits<ARCH>::CSR, traits<ARCH>::CSR,
tu.constant(csr, 16U), tu.constant(csr, 16U),
CSRtmp2_val_v); tu.trunc(rs_val_val, 32));
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1904,20 +1866,18 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto xrd_val = tu.read_mem(traits<ARCH>::CSR, tu.constant(csr, 16U), 32); auto xrd_val = tu.assignment(tu.read_mem(traits<ARCH>::CSR, tu.constant(csr, 16U), 32), 32);
auto xrs1_val = tu.load(rs1 + traits<ARCH>::X0, 0); auto xrs1_val = tu.assignment(tu.load(rs1 + traits<ARCH>::X0, 0), 32);
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", xrd_val, 32); tu.store(xrd_val, rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
if(rs1 != 0){ if(rs1 != 0){
auto CSRtmp1_val_v = tu.assignment("CSRtmp1_val", tu.l_or(
xrd_val,
xrs1_val), 32);
tu.write_mem( tu.write_mem(
traits<ARCH>::CSR, traits<ARCH>::CSR,
tu.constant(csr, 16U), tu.constant(csr, 16U),
CSRtmp1_val_v); tu.trunc(tu.l_or(
xrd_val,
xrs1_val), 32));
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1943,20 +1903,18 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto xrd_val = tu.read_mem(traits<ARCH>::CSR, tu.constant(csr, 16U), 32); auto xrd_val = tu.assignment(tu.read_mem(traits<ARCH>::CSR, tu.constant(csr, 16U), 32), 32);
auto xrs1_val = tu.load(rs1 + traits<ARCH>::X0, 0); auto xrs1_val = tu.assignment(tu.load(rs1 + traits<ARCH>::X0, 0), 32);
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", xrd_val, 32); tu.store(xrd_val, rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
if(rs1 != 0){ if(rs1 != 0){
auto CSRtmp1_val_v = tu.assignment("CSRtmp1_val", tu.l_and(
xrd_val,
tu.l_not(xrs1_val)), 32);
tu.write_mem( tu.write_mem(
traits<ARCH>::CSR, traits<ARCH>::CSR,
tu.constant(csr, 16U), tu.constant(csr, 16U),
CSRtmp1_val_v); tu.trunc(tu.l_and(
xrd_val,
tu.l_not(xrs1_val)), 32));
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1983,17 +1941,15 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.read_mem(traits<ARCH>::CSR, tu.constant(csr, 16U), 32), 32); tu.store(tu.read_mem(traits<ARCH>::CSR, tu.constant(csr, 16U), 32), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
auto CSRtmp1_val_v = tu.assignment("CSRtmp1_val", tu.ext(
tu.constant(zimm, 32U),
32,
true), 32);
tu.write_mem( tu.write_mem(
traits<ARCH>::CSR, traits<ARCH>::CSR,
tu.constant(csr, 16U), tu.constant(csr, 16U),
CSRtmp1_val_v); tu.trunc(tu.ext(
tu.constant(zimm, 32U),
32,
true), 32));
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
vm_base<ARCH>::gen_sync(tu, POST_SYNC, 49); vm_base<ARCH>::gen_sync(tu, POST_SYNC, 49);
@@ -2018,22 +1974,20 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto res_val = tu.read_mem(traits<ARCH>::CSR, tu.constant(csr, 16U), 32); auto res_val = tu.assignment(tu.read_mem(traits<ARCH>::CSR, tu.constant(csr, 16U), 32), 32);
if(zimm != 0){ if(zimm != 0){
auto CSRtmp0_val_v = tu.assignment("CSRtmp0_val", tu.l_or(
res_val,
tu.ext(
tu.constant(zimm, 32U),
32,
true)), 32);
tu.write_mem( tu.write_mem(
traits<ARCH>::CSR, traits<ARCH>::CSR,
tu.constant(csr, 16U), tu.constant(csr, 16U),
CSRtmp0_val_v); tu.trunc(tu.l_or(
res_val,
tu.ext(
tu.constant(zimm, 32U),
32,
true)), 32));
} }
if(rd != 0){ if(rd != 0){
auto Xtmp1_val_v = tu.assignment("Xtmp1_val", res_val, 32); tu.store(res_val, rd + traits<ARCH>::X0);
tu.store(Xtmp1_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -2059,22 +2013,20 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto res_val = tu.read_mem(traits<ARCH>::CSR, tu.constant(csr, 16U), 32); auto res_val = tu.assignment(tu.read_mem(traits<ARCH>::CSR, tu.constant(csr, 16U), 32), 32);
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", res_val, 32); tu.store(res_val, rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
if(zimm != 0){ if(zimm != 0){
auto CSRtmp1_val_v = tu.assignment("CSRtmp1_val", tu.l_and(
res_val,
tu.l_not(tu.ext(
tu.constant(zimm, 32U),
32,
true))), 32);
tu.write_mem( tu.write_mem(
traits<ARCH>::CSR, traits<ARCH>::CSR,
tu.constant(csr, 16U), tu.constant(csr, 16U),
CSRtmp1_val_v); tu.trunc(tu.l_and(
res_val,
tu.l_not(tu.ext(
tu.constant(zimm, 32U),
32,
true))), 32));
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -2102,10 +2054,9 @@ private:
if(imm == 0){ if(imm == 0){
this->gen_raise_trap(tu, 0, 2); this->gen_raise_trap(tu, 0, 2);
} }
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.add( tu.store(tu.add(
tu.load(2 + traits<ARCH>::X0, 0), tu.load(2 + traits<ARCH>::X0, 0),
tu.constant(imm, 32U)), 32); tu.constant(imm, 32U)), rd + 8 + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + 8 + traits<ARCH>::X0);
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
vm_base<ARCH>::gen_sync(tu, POST_SYNC, 52); vm_base<ARCH>::gen_sync(tu, POST_SYNC, 52);
@@ -2130,14 +2081,13 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+2; pc=pc+2;
tu.open_scope(); tu.open_scope();
auto offs_val = tu.add( auto offs_val = tu.assignment(tu.add(
tu.load(rs1 + 8 + traits<ARCH>::X0, 0), tu.load(rs1 + 8 + traits<ARCH>::X0, 0),
tu.constant(uimm, 32U)); tu.constant(uimm, 32U)), 32);
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.ext( tu.store(tu.ext(
tu.read_mem(traits<ARCH>::MEM, offs_val, 32), tu.read_mem(traits<ARCH>::MEM, offs_val, 32),
32, 32,
false), 32); false), rd + 8 + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + 8 + traits<ARCH>::X0);
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
vm_base<ARCH>::gen_sync(tu, POST_SYNC, 53); vm_base<ARCH>::gen_sync(tu, POST_SYNC, 53);
@@ -2162,14 +2112,13 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+2; pc=pc+2;
tu.open_scope(); tu.open_scope();
auto offs_val = tu.add( auto offs_val = tu.assignment(tu.add(
tu.load(rs1 + 8 + traits<ARCH>::X0, 0), tu.load(rs1 + 8 + traits<ARCH>::X0, 0),
tu.constant(uimm, 32U)); tu.constant(uimm, 32U)), 32);
auto MEMtmp0_val_v = tu.assignment("MEMtmp0_val", tu.load(rs2 + 8 + traits<ARCH>::X0, 0), 32);
tu.write_mem( tu.write_mem(
traits<ARCH>::MEM, traits<ARCH>::MEM,
offs_val, offs_val,
MEMtmp0_val_v); tu.trunc(tu.load(rs2 + 8 + traits<ARCH>::X0, 0), 32));
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
vm_base<ARCH>::gen_sync(tu, POST_SYNC, 54); vm_base<ARCH>::gen_sync(tu, POST_SYNC, 54);
@@ -2193,12 +2142,11 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+2; pc=pc+2;
tu.open_scope(); tu.open_scope();
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.add( tu.store(tu.add(
tu.ext( tu.ext(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
32, false), 32, false),
tu.constant(imm, 32U)), 32); tu.constant(imm, 32U)), rs1 + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rs1 + traits<ARCH>::X0);
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
vm_base<ARCH>::gen_sync(tu, POST_SYNC, 55); vm_base<ARCH>::gen_sync(tu, POST_SYNC, 55);
@@ -2240,10 +2188,9 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+2; pc=pc+2;
tu.open_scope(); tu.open_scope();
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.add( tu.store(tu.add(
cur_pc_val, cur_pc_val,
tu.constant(2, 32U)), 32); tu.constant(2, 32U)), 1 + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, 1 + traits<ARCH>::X0);
auto PC_val_v = tu.assignment("PC_val", tu.add( auto PC_val_v = tu.assignment("PC_val", tu.add(
tu.ext( tu.ext(
cur_pc_val, cur_pc_val,
@@ -2279,8 +2226,7 @@ private:
if(rd == 0){ if(rd == 0){
this->gen_raise_trap(tu, 0, 2); this->gen_raise_trap(tu, 0, 2);
} }
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.constant(imm, 32U), 32); tu.store(tu.constant(imm, 32U), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
vm_base<ARCH>::gen_sync(tu, POST_SYNC, 58); vm_base<ARCH>::gen_sync(tu, POST_SYNC, 58);
@@ -2310,8 +2256,7 @@ private:
if(imm == 0){ if(imm == 0){
this->gen_raise_trap(tu, 0, 2); this->gen_raise_trap(tu, 0, 2);
} }
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.constant(imm, 32U), 32); tu.store(tu.constant(imm, 32U), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
vm_base<ARCH>::gen_sync(tu, POST_SYNC, 59); vm_base<ARCH>::gen_sync(tu, POST_SYNC, 59);
@@ -2334,12 +2279,11 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+2; pc=pc+2;
tu.open_scope(); tu.open_scope();
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.add( tu.store(tu.add(
tu.ext( tu.ext(
tu.load(2 + traits<ARCH>::X0, 0), tu.load(2 + traits<ARCH>::X0, 0),
32, false), 32, false),
tu.constant(imm, 32U)), 32); tu.constant(imm, 32U)), 2 + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, 2 + traits<ARCH>::X0);
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
vm_base<ARCH>::gen_sync(tu, POST_SYNC, 60); vm_base<ARCH>::gen_sync(tu, POST_SYNC, 60);
@@ -2364,10 +2308,9 @@ private:
pc=pc+2; pc=pc+2;
tu.open_scope(); tu.open_scope();
uint8_t rs1_idx_val = rs1 + 8; uint8_t rs1_idx_val = rs1 + 8;
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.lshr( tu.store(tu.lshr(
tu.load(rs1_idx_val + traits<ARCH>::X0, 0), tu.load(rs1_idx_val + traits<ARCH>::X0, 0),
tu.constant(shamt, 32U)), 32); tu.constant(shamt, 32U)), rs1_idx_val + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rs1_idx_val + traits<ARCH>::X0);
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
vm_base<ARCH>::gen_sync(tu, POST_SYNC, 61); vm_base<ARCH>::gen_sync(tu, POST_SYNC, 61);
@@ -2392,10 +2335,9 @@ private:
pc=pc+2; pc=pc+2;
tu.open_scope(); tu.open_scope();
uint8_t rs1_idx_val = rs1 + 8; uint8_t rs1_idx_val = rs1 + 8;
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.ashr( tu.store(tu.ashr(
tu.load(rs1_idx_val + traits<ARCH>::X0, 0), tu.load(rs1_idx_val + traits<ARCH>::X0, 0),
tu.constant(shamt, 32U)), 32); tu.constant(shamt, 32U)), rs1_idx_val + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rs1_idx_val + traits<ARCH>::X0);
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
vm_base<ARCH>::gen_sync(tu, POST_SYNC, 62); vm_base<ARCH>::gen_sync(tu, POST_SYNC, 62);
@@ -2420,12 +2362,11 @@ private:
pc=pc+2; pc=pc+2;
tu.open_scope(); tu.open_scope();
uint8_t rs1_idx_val = rs1 + 8; uint8_t rs1_idx_val = rs1 + 8;
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.l_and( tu.store(tu.l_and(
tu.ext( tu.ext(
tu.load(rs1_idx_val + traits<ARCH>::X0, 0), tu.load(rs1_idx_val + traits<ARCH>::X0, 0),
32, false), 32, false),
tu.constant(imm, 32U)), 32); tu.constant(imm, 32U)), rs1_idx_val + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rs1_idx_val + traits<ARCH>::X0);
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
vm_base<ARCH>::gen_sync(tu, POST_SYNC, 63); vm_base<ARCH>::gen_sync(tu, POST_SYNC, 63);
@@ -2450,10 +2391,9 @@ private:
pc=pc+2; pc=pc+2;
tu.open_scope(); tu.open_scope();
uint8_t rd_idx_val = rd + 8; uint8_t rd_idx_val = rd + 8;
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.sub( tu.store(tu.sub(
tu.load(rd_idx_val + traits<ARCH>::X0, 0), tu.load(rd_idx_val + traits<ARCH>::X0, 0),
tu.load(rs2 + 8 + traits<ARCH>::X0, 0)), 32); tu.load(rs2 + 8 + traits<ARCH>::X0, 0)), rd_idx_val + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd_idx_val + traits<ARCH>::X0);
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
vm_base<ARCH>::gen_sync(tu, POST_SYNC, 64); vm_base<ARCH>::gen_sync(tu, POST_SYNC, 64);
@@ -2478,10 +2418,9 @@ private:
pc=pc+2; pc=pc+2;
tu.open_scope(); tu.open_scope();
uint8_t rd_idx_val = rd + 8; uint8_t rd_idx_val = rd + 8;
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.l_xor( tu.store(tu.l_xor(
tu.load(rd_idx_val + traits<ARCH>::X0, 0), tu.load(rd_idx_val + traits<ARCH>::X0, 0),
tu.load(rs2 + 8 + traits<ARCH>::X0, 0)), 32); tu.load(rs2 + 8 + traits<ARCH>::X0, 0)), rd_idx_val + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd_idx_val + traits<ARCH>::X0);
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
vm_base<ARCH>::gen_sync(tu, POST_SYNC, 65); vm_base<ARCH>::gen_sync(tu, POST_SYNC, 65);
@@ -2506,10 +2445,9 @@ private:
pc=pc+2; pc=pc+2;
tu.open_scope(); tu.open_scope();
uint8_t rd_idx_val = rd + 8; uint8_t rd_idx_val = rd + 8;
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.l_or( tu.store(tu.l_or(
tu.load(rd_idx_val + traits<ARCH>::X0, 0), tu.load(rd_idx_val + traits<ARCH>::X0, 0),
tu.load(rs2 + 8 + traits<ARCH>::X0, 0)), 32); tu.load(rs2 + 8 + traits<ARCH>::X0, 0)), rd_idx_val + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd_idx_val + traits<ARCH>::X0);
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
vm_base<ARCH>::gen_sync(tu, POST_SYNC, 66); vm_base<ARCH>::gen_sync(tu, POST_SYNC, 66);
@@ -2534,10 +2472,9 @@ private:
pc=pc+2; pc=pc+2;
tu.open_scope(); tu.open_scope();
uint8_t rd_idx_val = rd + 8; uint8_t rd_idx_val = rd + 8;
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.l_and( tu.store(tu.l_and(
tu.load(rd_idx_val + traits<ARCH>::X0, 0), tu.load(rd_idx_val + traits<ARCH>::X0, 0),
tu.load(rs2 + 8 + traits<ARCH>::X0, 0)), 32); tu.load(rs2 + 8 + traits<ARCH>::X0, 0)), rd_idx_val + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd_idx_val + traits<ARCH>::X0);
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
vm_base<ARCH>::gen_sync(tu, POST_SYNC, 67); vm_base<ARCH>::gen_sync(tu, POST_SYNC, 67);
@@ -2675,10 +2612,9 @@ private:
if(rs1 == 0){ if(rs1 == 0){
this->gen_raise_trap(tu, 0, 2); this->gen_raise_trap(tu, 0, 2);
} }
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.shl( tu.store(tu.shl(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
tu.constant(shamt, 32U)), 32); tu.constant(shamt, 32U)), rs1 + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rs1 + traits<ARCH>::X0);
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
vm_base<ARCH>::gen_sync(tu, POST_SYNC, 71); vm_base<ARCH>::gen_sync(tu, POST_SYNC, 71);
@@ -2702,14 +2638,13 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+2; pc=pc+2;
tu.open_scope(); tu.open_scope();
auto offs_val = tu.add( auto offs_val = tu.assignment(tu.add(
tu.load(2 + traits<ARCH>::X0, 0), tu.load(2 + traits<ARCH>::X0, 0),
tu.constant(uimm, 32U)); tu.constant(uimm, 32U)), 32);
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.ext( tu.store(tu.ext(
tu.read_mem(traits<ARCH>::MEM, offs_val, 32), tu.read_mem(traits<ARCH>::MEM, offs_val, 32),
32, 32,
false), 32); false), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
vm_base<ARCH>::gen_sync(tu, POST_SYNC, 72); vm_base<ARCH>::gen_sync(tu, POST_SYNC, 72);
@@ -2733,8 +2668,7 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+2; pc=pc+2;
tu.open_scope(); tu.open_scope();
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.load(rs2 + traits<ARCH>::X0, 0), 32); tu.store(tu.load(rs2 + traits<ARCH>::X0, 0), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
vm_base<ARCH>::gen_sync(tu, POST_SYNC, 73); vm_base<ARCH>::gen_sync(tu, POST_SYNC, 73);
@@ -2782,10 +2716,9 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+2; pc=pc+2;
tu.open_scope(); tu.open_scope();
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.add( tu.store(tu.add(
tu.load(rd + traits<ARCH>::X0, 0), tu.load(rd + traits<ARCH>::X0, 0),
tu.load(rs2 + traits<ARCH>::X0, 0)), 32); tu.load(rs2 + traits<ARCH>::X0, 0)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
vm_base<ARCH>::gen_sync(tu, POST_SYNC, 75); vm_base<ARCH>::gen_sync(tu, POST_SYNC, 75);
@@ -2808,10 +2741,9 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+2; pc=pc+2;
tu.open_scope(); tu.open_scope();
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.add( tu.store(tu.add(
cur_pc_val, cur_pc_val,
tu.constant(2, 32U)), 32); tu.constant(2, 32U)), 1 + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, 1 + traits<ARCH>::X0);
auto PC_val_v = tu.assignment("PC_val", tu.load(rs1 + traits<ARCH>::X0, 0), 32); auto PC_val_v = tu.assignment("PC_val", tu.load(rs1 + traits<ARCH>::X0, 0), 32);
tu.store(PC_val_v, traits<ARCH>::NEXT_PC); tu.store(PC_val_v, traits<ARCH>::NEXT_PC);
tu.store(tu.constant(std::numeric_limits<uint32_t>::max(), 32U), traits<ARCH>::LAST_BRANCH); tu.store(tu.constant(std::numeric_limits<uint32_t>::max(), 32U), traits<ARCH>::LAST_BRANCH);
@@ -2855,14 +2787,13 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+2; pc=pc+2;
tu.open_scope(); tu.open_scope();
auto offs_val = tu.add( auto offs_val = tu.assignment(tu.add(
tu.load(2 + traits<ARCH>::X0, 0), tu.load(2 + traits<ARCH>::X0, 0),
tu.constant(uimm, 32U)); tu.constant(uimm, 32U)), 32);
auto MEMtmp0_val_v = tu.assignment("MEMtmp0_val", tu.load(rs2 + traits<ARCH>::X0, 0), 32);
tu.write_mem( tu.write_mem(
traits<ARCH>::MEM, traits<ARCH>::MEM,
offs_val, offs_val,
MEMtmp0_val_v); tu.trunc(tu.load(rs2 + traits<ARCH>::X0, 0), 32));
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
vm_base<ARCH>::gen_sync(tu, POST_SYNC, 78); vm_base<ARCH>::gen_sync(tu, POST_SYNC, 78);
+736 -948
View File
File diff suppressed because it is too large Load Diff
+283 -388
View File
File diff suppressed because it is too large Load Diff
+957 -1235
View File
File diff suppressed because it is too large Load Diff
+178 -238
View File
@@ -332,8 +332,7 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.constant(imm, 64U), 64); tu.store(tu.constant(imm, 64U), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -359,12 +358,11 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.add( tu.store(tu.add(
tu.ext( tu.ext(
cur_pc_val, cur_pc_val,
64, false), 64, false),
tu.constant(imm, 64U)), 64); tu.constant(imm, 64U)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -390,10 +388,9 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.add( tu.store(tu.add(
cur_pc_val, cur_pc_val,
tu.constant(4, 64U)), 64); tu.constant(4, 64U)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
auto PC_val_v = tu.assignment("PC_val", tu.add( auto PC_val_v = tu.assignment("PC_val", tu.add(
tu.ext( tu.ext(
@@ -428,25 +425,24 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto new_pc_val = tu.add( auto new_pc_val = tu.assignment(tu.add(
tu.ext( tu.ext(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
64, false), 64, false),
tu.constant(imm, 64U)); tu.constant(imm, 64U)), 64);
auto align_val = tu.l_and( auto align_val = tu.assignment(tu.l_and(
new_pc_val, new_pc_val,
tu.constant(0x2, 64U)); tu.constant(0x2, 64U)), 64);
tu( " if({}) {{", tu.icmp( tu( " if({}) {{", tu.icmp(
ICmpInst::ICMP_NE, ICmpInst::ICMP_NE,
align_val, align_val,
tu.constant(0, 64U))); tu.constant(0, 64U)));
this->gen_raise_trap(tu, 0, 0); this->gen_raise_trap(tu, 0, 0);
tu(" } else {"); tu(" }} else {{");
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.add( tu.store(tu.add(
cur_pc_val, cur_pc_val,
tu.constant(4, 64U)), 64); tu.constant(4, 64U)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
auto PC_val_v = tu.assignment("PC_val", tu.l_and( auto PC_val_v = tu.assignment("PC_val", tu.l_and(
new_pc_val, new_pc_val,
@@ -731,17 +727,16 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto offs_val = tu.add( auto offs_val = tu.assignment(tu.add(
tu.ext( tu.ext(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
64, false), 64, false),
tu.constant(imm, 64U)); tu.constant(imm, 64U)), 64);
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.ext( tu.store(tu.ext(
tu.read_mem(traits<ARCH>::MEM, offs_val, 8), tu.read_mem(traits<ARCH>::MEM, offs_val, 8),
64, 64,
false), 64); false), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -767,17 +762,16 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto offs_val = tu.add( auto offs_val = tu.assignment(tu.add(
tu.ext( tu.ext(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
64, false), 64, false),
tu.constant(imm, 64U)); tu.constant(imm, 64U)), 64);
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.ext( tu.store(tu.ext(
tu.read_mem(traits<ARCH>::MEM, offs_val, 16), tu.read_mem(traits<ARCH>::MEM, offs_val, 16),
64, 64,
false), 64); false), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -803,17 +797,16 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto offs_val = tu.add( auto offs_val = tu.assignment(tu.add(
tu.ext( tu.ext(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
64, false), 64, false),
tu.constant(imm, 64U)); tu.constant(imm, 64U)), 64);
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.ext( tu.store(tu.ext(
tu.read_mem(traits<ARCH>::MEM, offs_val, 32), tu.read_mem(traits<ARCH>::MEM, offs_val, 32),
64, 64,
false), 64); false), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -839,17 +832,16 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto offs_val = tu.add( auto offs_val = tu.assignment(tu.add(
tu.ext( tu.ext(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
64, false), 64, false),
tu.constant(imm, 64U)); tu.constant(imm, 64U)), 64);
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.ext( tu.store(tu.ext(
tu.read_mem(traits<ARCH>::MEM, offs_val, 8), tu.read_mem(traits<ARCH>::MEM, offs_val, 8),
64, 64,
true), 64); true), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -875,17 +867,16 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto offs_val = tu.add( auto offs_val = tu.assignment(tu.add(
tu.ext( tu.ext(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
64, false), 64, false),
tu.constant(imm, 64U)); tu.constant(imm, 64U)), 64);
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.ext( tu.store(tu.ext(
tu.read_mem(traits<ARCH>::MEM, offs_val, 16), tu.read_mem(traits<ARCH>::MEM, offs_val, 16),
64, 64,
true), 64); true), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -911,16 +902,15 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto offs_val = tu.add( auto offs_val = tu.assignment(tu.add(
tu.ext( tu.ext(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
64, false), 64, false),
tu.constant(imm, 64U)); tu.constant(imm, 64U)), 64);
auto MEMtmp0_val_v = tu.assignment("MEMtmp0_val", tu.load(rs2 + traits<ARCH>::X0, 0), 8);
tu.write_mem( tu.write_mem(
traits<ARCH>::MEM, traits<ARCH>::MEM,
offs_val, offs_val,
MEMtmp0_val_v); tu.trunc(tu.load(rs2 + traits<ARCH>::X0, 0), 8));
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
vm_base<ARCH>::gen_sync(tu, POST_SYNC, 15); vm_base<ARCH>::gen_sync(tu, POST_SYNC, 15);
@@ -945,16 +935,15 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto offs_val = tu.add( auto offs_val = tu.assignment(tu.add(
tu.ext( tu.ext(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
64, false), 64, false),
tu.constant(imm, 64U)); tu.constant(imm, 64U)), 64);
auto MEMtmp0_val_v = tu.assignment("MEMtmp0_val", tu.load(rs2 + traits<ARCH>::X0, 0), 16);
tu.write_mem( tu.write_mem(
traits<ARCH>::MEM, traits<ARCH>::MEM,
offs_val, offs_val,
MEMtmp0_val_v); tu.trunc(tu.load(rs2 + traits<ARCH>::X0, 0), 16));
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
vm_base<ARCH>::gen_sync(tu, POST_SYNC, 16); vm_base<ARCH>::gen_sync(tu, POST_SYNC, 16);
@@ -979,16 +968,15 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto offs_val = tu.add( auto offs_val = tu.assignment(tu.add(
tu.ext( tu.ext(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
64, false), 64, false),
tu.constant(imm, 64U)); tu.constant(imm, 64U)), 64);
auto MEMtmp0_val_v = tu.assignment("MEMtmp0_val", tu.load(rs2 + traits<ARCH>::X0, 0), 32);
tu.write_mem( tu.write_mem(
traits<ARCH>::MEM, traits<ARCH>::MEM,
offs_val, offs_val,
MEMtmp0_val_v); tu.trunc(tu.load(rs2 + traits<ARCH>::X0, 0), 32));
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
vm_base<ARCH>::gen_sync(tu, POST_SYNC, 17); vm_base<ARCH>::gen_sync(tu, POST_SYNC, 17);
@@ -1014,12 +1002,11 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.add( tu.store(tu.add(
tu.ext( tu.ext(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
64, false), 64, false),
tu.constant(imm, 64U)), 64); tu.constant(imm, 64U)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1046,7 +1033,7 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.choose( tu.store(tu.choose(
tu.icmp( tu.icmp(
ICmpInst::ICMP_SLT, ICmpInst::ICMP_SLT,
tu.ext( tu.ext(
@@ -1054,8 +1041,7 @@ private:
64, false), 64, false),
tu.constant(imm, 64U)), tu.constant(imm, 64U)),
tu.constant(1, 64U), tu.constant(1, 64U),
tu.constant(0, 64U)), 64); tu.constant(0, 64U)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1083,14 +1069,13 @@ private:
tu.open_scope(); tu.open_scope();
int64_t full_imm_val = imm; int64_t full_imm_val = imm;
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.choose( tu.store(tu.choose(
tu.icmp( tu.icmp(
ICmpInst::ICMP_ULT, ICmpInst::ICMP_ULT,
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
tu.constant(full_imm_val, 64U)), tu.constant(full_imm_val, 64U)),
tu.constant(1, 64U), tu.constant(1, 64U),
tu.constant(0, 64U)), 64); tu.constant(0, 64U)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1117,12 +1102,11 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.l_xor( tu.store(tu.l_xor(
tu.ext( tu.ext(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
64, false), 64, false),
tu.constant(imm, 64U)), 64); tu.constant(imm, 64U)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1149,12 +1133,11 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.l_or( tu.store(tu.l_or(
tu.ext( tu.ext(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
64, false), 64, false),
tu.constant(imm, 64U)), 64); tu.constant(imm, 64U)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1181,12 +1164,11 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.l_and( tu.store(tu.l_and(
tu.ext( tu.ext(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
64, false), 64, false),
tu.constant(imm, 64U)), 64); tu.constant(imm, 64U)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1213,10 +1195,9 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.shl( tu.store(tu.shl(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
tu.constant(shamt, 64U)), 64); tu.constant(shamt, 64U)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1243,10 +1224,9 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.lshr( tu.store(tu.lshr(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
tu.constant(shamt, 64U)), 64); tu.constant(shamt, 64U)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1273,10 +1253,9 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.ashr( tu.store(tu.ashr(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
tu.constant(shamt, 64U)), 64); tu.constant(shamt, 64U)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1303,10 +1282,9 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.add( tu.store(tu.add(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
tu.load(rs2 + traits<ARCH>::X0, 0)), 64); tu.load(rs2 + traits<ARCH>::X0, 0)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1333,10 +1311,9 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.sub( tu.store(tu.sub(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
tu.load(rs2 + traits<ARCH>::X0, 0)), 64); tu.load(rs2 + traits<ARCH>::X0, 0)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1363,14 +1340,13 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.shl( tu.store(tu.shl(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
tu.l_and( tu.l_and(
tu.load(rs2 + traits<ARCH>::X0, 0), tu.load(rs2 + traits<ARCH>::X0, 0),
tu.sub( tu.sub(
tu.constant(64, 64U), tu.constant(64, 64U),
tu.constant(1, 64U)))), 64); tu.constant(1, 64U)))), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1397,7 +1373,7 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.choose( tu.store(tu.choose(
tu.icmp( tu.icmp(
ICmpInst::ICMP_SLT, ICmpInst::ICMP_SLT,
tu.ext( tu.ext(
@@ -1407,8 +1383,7 @@ private:
tu.load(rs2 + traits<ARCH>::X0, 0), tu.load(rs2 + traits<ARCH>::X0, 0),
64, false)), 64, false)),
tu.constant(1, 64U), tu.constant(1, 64U),
tu.constant(0, 64U)), 64); tu.constant(0, 64U)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1435,7 +1410,7 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.choose( tu.store(tu.choose(
tu.icmp( tu.icmp(
ICmpInst::ICMP_ULT, ICmpInst::ICMP_ULT,
tu.ext( tu.ext(
@@ -1447,8 +1422,7 @@ private:
64, 64,
true)), true)),
tu.constant(1, 64U), tu.constant(1, 64U),
tu.constant(0, 64U)), 64); tu.constant(0, 64U)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1475,10 +1449,9 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.l_xor( tu.store(tu.l_xor(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
tu.load(rs2 + traits<ARCH>::X0, 0)), 64); tu.load(rs2 + traits<ARCH>::X0, 0)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1505,14 +1478,13 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.lshr( tu.store(tu.lshr(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
tu.l_and( tu.l_and(
tu.load(rs2 + traits<ARCH>::X0, 0), tu.load(rs2 + traits<ARCH>::X0, 0),
tu.sub( tu.sub(
tu.constant(64, 64U), tu.constant(64, 64U),
tu.constant(1, 64U)))), 64); tu.constant(1, 64U)))), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1539,14 +1511,13 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.ashr( tu.store(tu.ashr(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
tu.l_and( tu.l_and(
tu.load(rs2 + traits<ARCH>::X0, 0), tu.load(rs2 + traits<ARCH>::X0, 0),
tu.sub( tu.sub(
tu.constant(64, 64U), tu.constant(64, 64U),
tu.constant(1, 64U)))), 64); tu.constant(1, 64U)))), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1573,10 +1544,9 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.l_or( tu.store(tu.l_or(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
tu.load(rs2 + traits<ARCH>::X0, 0)), 64); tu.load(rs2 + traits<ARCH>::X0, 0)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1603,10 +1573,9 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.l_and( tu.store(tu.l_and(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
tu.load(rs2 + traits<ARCH>::X0, 0)), 64); tu.load(rs2 + traits<ARCH>::X0, 0)), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1630,15 +1599,14 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto FENCEtmp0_val_v = tu.assignment("FENCEtmp0_val", tu.l_or(
tu.shl(
tu.constant(pred, 64U),
tu.constant(4, 64U)),
tu.constant(succ, 64U)), 64);
tu.write_mem( tu.write_mem(
traits<ARCH>::FENCE, traits<ARCH>::FENCE,
tu.constant(0, 64U), tu.constant(0, 64U),
FENCEtmp0_val_v); tu.trunc(tu.l_or(
tu.shl(
tu.constant(pred, 64U),
tu.constant(4, 64U)),
tu.constant(succ, 64U)), 64));
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
vm_base<ARCH>::gen_sync(tu, POST_SYNC, 37); vm_base<ARCH>::gen_sync(tu, POST_SYNC, 37);
@@ -1660,11 +1628,10 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto FENCEtmp0_val_v = tu.assignment("FENCEtmp0_val", tu.constant(imm, 64U), 64);
tu.write_mem( tu.write_mem(
traits<ARCH>::FENCE, traits<ARCH>::FENCE,
tu.constant(1, 64U), tu.constant(1, 64U),
FENCEtmp0_val_v); tu.trunc(tu.constant(imm, 64U), 64));
tu.close_scope(); tu.close_scope();
tu.store(tu.constant(std::numeric_limits<uint32_t>::max(), 32),traits<ARCH>::LAST_BRANCH); tu.store(tu.constant(std::numeric_limits<uint32_t>::max(), 32),traits<ARCH>::LAST_BRANCH);
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1795,16 +1762,14 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto FENCEtmp0_val_v = tu.assignment("FENCEtmp0_val", tu.constant(rs1, 64U), 64);
tu.write_mem( tu.write_mem(
traits<ARCH>::FENCE, traits<ARCH>::FENCE,
tu.constant(2, 64U), tu.constant(2, 64U),
FENCEtmp0_val_v); tu.trunc(tu.constant(rs1, 64U), 64));
auto FENCEtmp1_val_v = tu.assignment("FENCEtmp1_val", tu.constant(rs2, 64U), 64);
tu.write_mem( tu.write_mem(
traits<ARCH>::FENCE, traits<ARCH>::FENCE,
tu.constant(3, 64U), tu.constant(3, 64U),
FENCEtmp1_val_v); tu.trunc(tu.constant(rs2, 64U), 64));
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
vm_base<ARCH>::gen_sync(tu, POST_SYNC, 45); vm_base<ARCH>::gen_sync(tu, POST_SYNC, 45);
@@ -1829,22 +1794,19 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto rs_val_val = tu.load(rs1 + traits<ARCH>::X0, 0); auto rs_val_val = tu.assignment(tu.load(rs1 + traits<ARCH>::X0, 0), 64);
if(rd != 0){ if(rd != 0){
auto csr_val_val = tu.read_mem(traits<ARCH>::CSR, tu.constant(csr, 16U), 64); auto csr_val_val = tu.assignment(tu.read_mem(traits<ARCH>::CSR, tu.constant(csr, 16U), 64), 64);
auto CSRtmp0_val_v = tu.assignment("CSRtmp0_val", rs_val_val, 64);
tu.write_mem( tu.write_mem(
traits<ARCH>::CSR, traits<ARCH>::CSR,
tu.constant(csr, 16U), tu.constant(csr, 16U),
CSRtmp0_val_v); tu.trunc(rs_val_val, 64));
auto Xtmp1_val_v = tu.assignment("Xtmp1_val", csr_val_val, 64); tu.store(csr_val_val, rd + traits<ARCH>::X0);
tu.store(Xtmp1_val_v, rd + traits<ARCH>::X0);
} else { } else {
auto CSRtmp2_val_v = tu.assignment("CSRtmp2_val", rs_val_val, 64);
tu.write_mem( tu.write_mem(
traits<ARCH>::CSR, traits<ARCH>::CSR,
tu.constant(csr, 16U), tu.constant(csr, 16U),
CSRtmp2_val_v); tu.trunc(rs_val_val, 64));
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1870,20 +1832,18 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto xrd_val = tu.read_mem(traits<ARCH>::CSR, tu.constant(csr, 16U), 64); auto xrd_val = tu.assignment(tu.read_mem(traits<ARCH>::CSR, tu.constant(csr, 16U), 64), 64);
auto xrs1_val = tu.load(rs1 + traits<ARCH>::X0, 0); auto xrs1_val = tu.assignment(tu.load(rs1 + traits<ARCH>::X0, 0), 64);
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", xrd_val, 64); tu.store(xrd_val, rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
if(rs1 != 0){ if(rs1 != 0){
auto CSRtmp1_val_v = tu.assignment("CSRtmp1_val", tu.l_or(
xrd_val,
xrs1_val), 64);
tu.write_mem( tu.write_mem(
traits<ARCH>::CSR, traits<ARCH>::CSR,
tu.constant(csr, 16U), tu.constant(csr, 16U),
CSRtmp1_val_v); tu.trunc(tu.l_or(
xrd_val,
xrs1_val), 64));
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1909,20 +1869,18 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto xrd_val = tu.read_mem(traits<ARCH>::CSR, tu.constant(csr, 16U), 64); auto xrd_val = tu.assignment(tu.read_mem(traits<ARCH>::CSR, tu.constant(csr, 16U), 64), 64);
auto xrs1_val = tu.load(rs1 + traits<ARCH>::X0, 0); auto xrs1_val = tu.assignment(tu.load(rs1 + traits<ARCH>::X0, 0), 64);
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", xrd_val, 64); tu.store(xrd_val, rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
if(rs1 != 0){ if(rs1 != 0){
auto CSRtmp1_val_v = tu.assignment("CSRtmp1_val", tu.l_and(
xrd_val,
tu.l_not(xrs1_val)), 64);
tu.write_mem( tu.write_mem(
traits<ARCH>::CSR, traits<ARCH>::CSR,
tu.constant(csr, 16U), tu.constant(csr, 16U),
CSRtmp1_val_v); tu.trunc(tu.l_and(
xrd_val,
tu.l_not(xrs1_val)), 64));
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -1949,17 +1907,15 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.read_mem(traits<ARCH>::CSR, tu.constant(csr, 16U), 64), 64); tu.store(tu.read_mem(traits<ARCH>::CSR, tu.constant(csr, 16U), 64), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
auto CSRtmp1_val_v = tu.assignment("CSRtmp1_val", tu.ext(
tu.constant(zimm, 64U),
64,
true), 64);
tu.write_mem( tu.write_mem(
traits<ARCH>::CSR, traits<ARCH>::CSR,
tu.constant(csr, 16U), tu.constant(csr, 16U),
CSRtmp1_val_v); tu.trunc(tu.ext(
tu.constant(zimm, 64U),
64,
true), 64));
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
vm_base<ARCH>::gen_sync(tu, POST_SYNC, 49); vm_base<ARCH>::gen_sync(tu, POST_SYNC, 49);
@@ -1984,22 +1940,20 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto res_val = tu.read_mem(traits<ARCH>::CSR, tu.constant(csr, 16U), 64); auto res_val = tu.assignment(tu.read_mem(traits<ARCH>::CSR, tu.constant(csr, 16U), 64), 64);
if(zimm != 0){ if(zimm != 0){
auto CSRtmp0_val_v = tu.assignment("CSRtmp0_val", tu.l_or(
res_val,
tu.ext(
tu.constant(zimm, 64U),
64,
true)), 64);
tu.write_mem( tu.write_mem(
traits<ARCH>::CSR, traits<ARCH>::CSR,
tu.constant(csr, 16U), tu.constant(csr, 16U),
CSRtmp0_val_v); tu.trunc(tu.l_or(
res_val,
tu.ext(
tu.constant(zimm, 64U),
64,
true)), 64));
} }
if(rd != 0){ if(rd != 0){
auto Xtmp1_val_v = tu.assignment("Xtmp1_val", res_val, 64); tu.store(res_val, rd + traits<ARCH>::X0);
tu.store(Xtmp1_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -2025,22 +1979,20 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto res_val = tu.read_mem(traits<ARCH>::CSR, tu.constant(csr, 16U), 64); auto res_val = tu.assignment(tu.read_mem(traits<ARCH>::CSR, tu.constant(csr, 16U), 64), 64);
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", res_val, 64); tu.store(res_val, rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
if(zimm != 0){ if(zimm != 0){
auto CSRtmp1_val_v = tu.assignment("CSRtmp1_val", tu.l_and(
res_val,
tu.l_not(tu.ext(
tu.constant(zimm, 64U),
64,
true))), 64);
tu.write_mem( tu.write_mem(
traits<ARCH>::CSR, traits<ARCH>::CSR,
tu.constant(csr, 16U), tu.constant(csr, 16U),
CSRtmp1_val_v); tu.trunc(tu.l_and(
res_val,
tu.l_not(tu.ext(
tu.constant(zimm, 64U),
64,
true))), 64));
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -2066,17 +2018,16 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto offs_val = tu.add( auto offs_val = tu.assignment(tu.add(
tu.ext( tu.ext(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
64, false), 64, false),
tu.constant(imm, 64U)); tu.constant(imm, 64U)), 64);
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.ext( tu.store(tu.ext(
tu.read_mem(traits<ARCH>::MEM, offs_val, 32), tu.read_mem(traits<ARCH>::MEM, offs_val, 32),
64, 64,
true), 64); true), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -2102,17 +2053,16 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto offs_val = tu.add( auto offs_val = tu.assignment(tu.add(
tu.ext( tu.ext(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
64, false), 64, false),
tu.constant(imm, 64U)); tu.constant(imm, 64U)), 64);
if(rd != 0){ if(rd != 0){
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.ext( tu.store(tu.ext(
tu.read_mem(traits<ARCH>::MEM, offs_val, 64), tu.read_mem(traits<ARCH>::MEM, offs_val, 64),
64, 64,
false), 64); false), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -2138,16 +2088,15 @@ private:
auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]); auto cur_pc_val = tu.constant(pc.val, arch::traits<ARCH>::reg_bit_widths[traits<ARCH>::PC]);
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
auto offs_val = tu.add( auto offs_val = tu.assignment(tu.add(
tu.ext( tu.ext(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
64, false), 64, false),
tu.constant(imm, 64U)); tu.constant(imm, 64U)), 64);
auto MEMtmp0_val_v = tu.assignment("MEMtmp0_val", tu.load(rs2 + traits<ARCH>::X0, 0), 64);
tu.write_mem( tu.write_mem(
traits<ARCH>::MEM, traits<ARCH>::MEM,
offs_val, offs_val,
MEMtmp0_val_v); tu.trunc(tu.load(rs2 + traits<ARCH>::X0, 0), 64));
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
vm_base<ARCH>::gen_sync(tu, POST_SYNC, 54); vm_base<ARCH>::gen_sync(tu, POST_SYNC, 54);
@@ -2173,19 +2122,18 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto res_val = tu.add( auto res_val = tu.assignment(tu.add(
tu.ext( tu.ext(
tu.trunc( tu.trunc(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
32 32
), ),
32, false), 32, false),
tu.constant(imm, 32U)); tu.constant(imm, 32U)), 32);
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.ext( tu.store(tu.ext(
res_val, res_val,
64, 64,
false), 64); false), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -2212,17 +2160,16 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto sh_val_val = tu.shl( auto sh_val_val = tu.assignment(tu.shl(
tu.trunc( tu.trunc(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
32 32
), ),
tu.constant(shamt, 32U)); tu.constant(shamt, 32U)), 32);
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.ext( tu.store(tu.ext(
sh_val_val, sh_val_val,
64, 64,
false), 64); false), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -2249,17 +2196,16 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto sh_val_val = tu.lshr( auto sh_val_val = tu.assignment(tu.lshr(
tu.trunc( tu.trunc(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
32 32
), ),
tu.constant(shamt, 32U)); tu.constant(shamt, 32U)), 32);
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.ext( tu.store(tu.ext(
sh_val_val, sh_val_val,
64, 64,
false), 64); false), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -2286,17 +2232,16 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto sh_val_val = tu.ashr( auto sh_val_val = tu.assignment(tu.ashr(
tu.trunc( tu.trunc(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
32 32
), ),
tu.constant(shamt, 32U)); tu.constant(shamt, 32U)), 32);
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.ext( tu.store(tu.ext(
sh_val_val, sh_val_val,
64, 64,
false), 64); false), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -2320,7 +2265,7 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto res_val = tu.add( auto res_val = tu.assignment(tu.add(
tu.trunc( tu.trunc(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
32 32
@@ -2328,12 +2273,11 @@ private:
tu.trunc( tu.trunc(
tu.load(rs2 + traits<ARCH>::X0, 0), tu.load(rs2 + traits<ARCH>::X0, 0),
32 32
)); )), 32);
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.ext( tu.store(tu.ext(
res_val, res_val,
64, 64,
false), 64); false), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -2357,7 +2301,7 @@ private:
pc=pc+4; pc=pc+4;
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
auto res_val = tu.sub( auto res_val = tu.assignment(tu.sub(
tu.trunc( tu.trunc(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
32 32
@@ -2365,12 +2309,11 @@ private:
tu.trunc( tu.trunc(
tu.load(rs2 + traits<ARCH>::X0, 0), tu.load(rs2 + traits<ARCH>::X0, 0),
32 32
)); )), 32);
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.ext( tu.store(tu.ext(
res_val, res_val,
64, 64,
false), 64); false), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -2398,23 +2341,22 @@ private:
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
uint32_t mask_val = 0x1f; uint32_t mask_val = 0x1f;
auto count_val = tu.l_and( auto count_val = tu.assignment(tu.l_and(
tu.trunc( tu.trunc(
tu.load(rs2 + traits<ARCH>::X0, 0), tu.load(rs2 + traits<ARCH>::X0, 0),
32 32
), ),
tu.constant(mask_val, 32U)); tu.constant(mask_val, 32U)), 32);
auto sh_val_val = tu.shl( auto sh_val_val = tu.assignment(tu.shl(
tu.trunc( tu.trunc(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
32 32
), ),
count_val); count_val), 32);
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.ext( tu.store(tu.ext(
sh_val_val, sh_val_val,
64, 64,
false), 64); false), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -2442,23 +2384,22 @@ private:
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
uint32_t mask_val = 0x1f; uint32_t mask_val = 0x1f;
auto count_val = tu.l_and( auto count_val = tu.assignment(tu.l_and(
tu.trunc( tu.trunc(
tu.load(rs2 + traits<ARCH>::X0, 0), tu.load(rs2 + traits<ARCH>::X0, 0),
32 32
), ),
tu.constant(mask_val, 32U)); tu.constant(mask_val, 32U)), 32);
auto sh_val_val = tu.lshr( auto sh_val_val = tu.assignment(tu.lshr(
tu.trunc( tu.trunc(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
32 32
), ),
count_val); count_val), 32);
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.ext( tu.store(tu.ext(
sh_val_val, sh_val_val,
64, 64,
false), 64); false), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);
@@ -2486,23 +2427,22 @@ private:
tu.open_scope(); tu.open_scope();
if(rd != 0){ if(rd != 0){
uint32_t mask_val = 0x1f; uint32_t mask_val = 0x1f;
auto count_val = tu.l_and( auto count_val = tu.assignment(tu.l_and(
tu.trunc( tu.trunc(
tu.load(rs2 + traits<ARCH>::X0, 0), tu.load(rs2 + traits<ARCH>::X0, 0),
32 32
), ),
tu.constant(mask_val, 32U)); tu.constant(mask_val, 32U)), 32);
auto sh_val_val = tu.ashr( auto sh_val_val = tu.assignment(tu.ashr(
tu.trunc( tu.trunc(
tu.load(rs1 + traits<ARCH>::X0, 0), tu.load(rs1 + traits<ARCH>::X0, 0),
32 32
), ),
count_val); count_val), 32);
auto Xtmp0_val_v = tu.assignment("Xtmp0_val", tu.ext( tu.store(tu.ext(
sh_val_val, sh_val_val,
64, 64,
false), 64); false), rd + traits<ARCH>::X0);
tu.store(Xtmp0_val_v, rd + traits<ARCH>::X0);
} }
tu.close_scope(); tu.close_scope();
gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC); gen_set_pc(tu, pc, traits<ARCH>::NEXT_PC);