updates template
This commit is contained in:
parent
62d21e1156
commit
235a7e6e24
|
@ -195,7 +195,7 @@ private:
|
||||||
tu("print_disass(core_ptr, {:#x}, \"{}\");", pc.val, std::string("illegal_instruction"));
|
tu("print_disass(core_ptr, {:#x}, \"{}\");", pc.val, std::string("illegal_instruction"));
|
||||||
}
|
}
|
||||||
pc = pc + ((instr & 3) == 3 ? 4 : 2);
|
pc = pc + ((instr & 3) == 3 ? 4 : 2);
|
||||||
gen_raise_trap(tu, 0, 2); // illegal instruction trap
|
gen_raise_trap(tu, 0, static_cast<int32_t>(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION));
|
||||||
this->gen_set_tval(tu, instr);
|
this->gen_set_tval(tu, instr);
|
||||||
vm_impl::gen_sync(tu, iss::POST_SYNC, instr_descr.size());
|
vm_impl::gen_sync(tu, iss::POST_SYNC, instr_descr.size());
|
||||||
vm_impl::gen_trap_check(tu);
|
vm_impl::gen_trap_check(tu);
|
||||||
|
|
|
@ -351,8 +351,7 @@ private:
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.constant((uint32_t)((int32_t)imm),32));
|
||||||
tu.constant((uint32_t)((int32_t)imm),32));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
auto returnValue = std::make_tuple(CONT);
|
auto returnValue = std::make_tuple(CONT);
|
||||||
|
@ -387,8 +386,7 @@ private:
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.constant((uint32_t)(PC+(int32_t)imm),32));
|
||||||
tu.constant((uint32_t)(PC+(int32_t)imm),32));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
auto returnValue = std::make_tuple(CONT);
|
auto returnValue = std::make_tuple(CONT);
|
||||||
|
@ -429,8 +427,7 @@ private:
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.constant((uint32_t)(PC+4),32));
|
||||||
tu.constant((uint32_t)(PC+4),32));
|
|
||||||
}
|
}
|
||||||
auto PC_val_v = tu.assignment("PC_val", new_pc,32);
|
auto PC_val_v = tu.assignment("PC_val", new_pc,32);
|
||||||
tu.store(traits::NEXT_PC, PC_val_v);
|
tu.store(traits::NEXT_PC, PC_val_v);
|
||||||
|
@ -483,8 +480,7 @@ private:
|
||||||
this->gen_raise_trap(tu, 0, 0);
|
this->gen_raise_trap(tu, 0, 0);
|
||||||
tu.open_else();
|
tu.open_else();
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.constant((uint32_t)(PC+4),32));
|
||||||
tu.constant((uint32_t)(PC+4),32));
|
|
||||||
}
|
}
|
||||||
auto PC_val_v = tu.assignment("PC_val", new_pc,32);
|
auto PC_val_v = tu.assignment("PC_val", new_pc,32);
|
||||||
tu.store(traits::NEXT_PC, PC_val_v);
|
tu.store(traits::NEXT_PC, PC_val_v);
|
||||||
|
@ -810,8 +806,7 @@ private:
|
||||||
tu.constant((int16_t)sext<12>(imm),16))),32,false),32);
|
tu.constant((int16_t)sext<12>(imm),16))),32,false),32);
|
||||||
auto res = tu.assignment(tu.ext(tu.read_mem(traits::MEM, load_address, 8),8,true),8);
|
auto res = tu.assignment(tu.ext(tu.read_mem(traits::MEM, load_address, 8),8,true),8);
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.ext(res,32,false));
|
||||||
tu.ext(res,32,false));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
auto returnValue = std::make_tuple(CONT);
|
auto returnValue = std::make_tuple(CONT);
|
||||||
|
@ -851,8 +846,7 @@ private:
|
||||||
tu.constant((int16_t)sext<12>(imm),16))),32,false),32);
|
tu.constant((int16_t)sext<12>(imm),16))),32,false),32);
|
||||||
auto res = tu.assignment(tu.ext(tu.read_mem(traits::MEM, load_address, 16),16,true),16);
|
auto res = tu.assignment(tu.ext(tu.read_mem(traits::MEM, load_address, 16),16,true),16);
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.ext(res,32,false));
|
||||||
tu.ext(res,32,false));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
auto returnValue = std::make_tuple(CONT);
|
auto returnValue = std::make_tuple(CONT);
|
||||||
|
@ -892,8 +886,7 @@ private:
|
||||||
tu.constant((int16_t)sext<12>(imm),16))),32,false),32);
|
tu.constant((int16_t)sext<12>(imm),16))),32,false),32);
|
||||||
auto res = tu.assignment(tu.ext(tu.read_mem(traits::MEM, load_address, 32),32,true),32);
|
auto res = tu.assignment(tu.ext(tu.read_mem(traits::MEM, load_address, 32),32,true),32);
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.ext(res,32,false));
|
||||||
tu.ext(res,32,false));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
auto returnValue = std::make_tuple(CONT);
|
auto returnValue = std::make_tuple(CONT);
|
||||||
|
@ -933,8 +926,7 @@ private:
|
||||||
tu.constant((int16_t)sext<12>(imm),16))),32,false),32);
|
tu.constant((int16_t)sext<12>(imm),16))),32,false),32);
|
||||||
auto res = tu.assignment(tu.read_mem(traits::MEM, load_address, 8),8);
|
auto res = tu.assignment(tu.read_mem(traits::MEM, load_address, 8),8);
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.ext(res,32,false));
|
||||||
tu.ext(res,32,false));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
auto returnValue = std::make_tuple(CONT);
|
auto returnValue = std::make_tuple(CONT);
|
||||||
|
@ -974,8 +966,7 @@ private:
|
||||||
tu.constant((int16_t)sext<12>(imm),16))),32,false),32);
|
tu.constant((int16_t)sext<12>(imm),16))),32,false),32);
|
||||||
auto res = tu.assignment(tu.read_mem(traits::MEM, load_address, 16),16);
|
auto res = tu.assignment(tu.read_mem(traits::MEM, load_address, 16),16);
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.ext(res,32,false));
|
||||||
tu.ext(res,32,false));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
auto returnValue = std::make_tuple(CONT);
|
auto returnValue = std::make_tuple(CONT);
|
||||||
|
@ -1122,8 +1113,7 @@ private:
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.ext((tu.add(
|
||||||
tu.ext((tu.add(
|
|
||||||
tu.load(rs1 + traits::X0, 0),
|
tu.load(rs1 + traits::X0, 0),
|
||||||
tu.constant((int16_t)sext<12>(imm),16))),32,false));
|
tu.constant((int16_t)sext<12>(imm),16))),32,false));
|
||||||
}
|
}
|
||||||
|
@ -1161,8 +1151,7 @@ private:
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.conditionalAssignment((tu.icmp(ICmpInst::ICMP_SLT,
|
||||||
tu.conditionalAssignment((tu.icmp(ICmpInst::ICMP_SLT,
|
|
||||||
tu.ext(tu.load(rs1 + traits::X0, 0),32,true),
|
tu.ext(tu.load(rs1 + traits::X0, 0),32,true),
|
||||||
tu.constant((int16_t)sext<12>(imm),16))), tu.constant(1,8),tu.constant(0,8)));
|
tu.constant((int16_t)sext<12>(imm),16))), tu.constant(1,8),tu.constant(0,8)));
|
||||||
}
|
}
|
||||||
|
@ -1200,8 +1189,7 @@ private:
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.conditionalAssignment((tu.icmp(ICmpInst::ICMP_ULT,
|
||||||
tu.conditionalAssignment((tu.icmp(ICmpInst::ICMP_ULT,
|
|
||||||
tu.load(rs1 + traits::X0, 0),
|
tu.load(rs1 + traits::X0, 0),
|
||||||
tu.constant((uint32_t)((int16_t)sext<12>(imm)),32))), tu.constant(1,8),tu.constant(0,8)));
|
tu.constant((uint32_t)((int16_t)sext<12>(imm)),32))), tu.constant(1,8),tu.constant(0,8)));
|
||||||
}
|
}
|
||||||
|
@ -1239,8 +1227,7 @@ private:
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.bitwise_xor(
|
||||||
tu.bitwise_xor(
|
|
||||||
tu.load(rs1 + traits::X0, 0),
|
tu.load(rs1 + traits::X0, 0),
|
||||||
tu.constant((uint32_t)((int16_t)sext<12>(imm)),32)));
|
tu.constant((uint32_t)((int16_t)sext<12>(imm)),32)));
|
||||||
}
|
}
|
||||||
|
@ -1278,8 +1265,7 @@ private:
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.bitwise_or(
|
||||||
tu.bitwise_or(
|
|
||||||
tu.load(rs1 + traits::X0, 0),
|
tu.load(rs1 + traits::X0, 0),
|
||||||
tu.constant((uint32_t)((int16_t)sext<12>(imm)),32)));
|
tu.constant((uint32_t)((int16_t)sext<12>(imm)),32)));
|
||||||
}
|
}
|
||||||
|
@ -1317,8 +1303,7 @@ private:
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.bitwise_and(
|
||||||
tu.bitwise_and(
|
|
||||||
tu.load(rs1 + traits::X0, 0),
|
tu.load(rs1 + traits::X0, 0),
|
||||||
tu.constant((uint32_t)((int16_t)sext<12>(imm)),32)));
|
tu.constant((uint32_t)((int16_t)sext<12>(imm)),32)));
|
||||||
}
|
}
|
||||||
|
@ -1356,8 +1341,7 @@ private:
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.shl(
|
||||||
tu.shl(
|
|
||||||
tu.load(rs1 + traits::X0, 0),
|
tu.load(rs1 + traits::X0, 0),
|
||||||
tu.constant(shamt,8)));
|
tu.constant(shamt,8)));
|
||||||
}
|
}
|
||||||
|
@ -1395,8 +1379,7 @@ private:
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.lshr(
|
||||||
tu.lshr(
|
|
||||||
tu.load(rs1 + traits::X0, 0),
|
tu.load(rs1 + traits::X0, 0),
|
||||||
tu.constant(shamt,8)));
|
tu.constant(shamt,8)));
|
||||||
}
|
}
|
||||||
|
@ -1434,8 +1417,7 @@ private:
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.ext((tu.ashr(
|
||||||
tu.ext((tu.ashr(
|
|
||||||
tu.ext(tu.load(rs1 + traits::X0, 0),32,true),
|
tu.ext(tu.load(rs1 + traits::X0, 0),32,true),
|
||||||
tu.constant(shamt,8))),32,false));
|
tu.constant(shamt,8))),32,false));
|
||||||
}
|
}
|
||||||
|
@ -1473,8 +1455,7 @@ private:
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.ext((tu.add(
|
||||||
tu.ext((tu.add(
|
|
||||||
tu.load(rs1 + traits::X0, 0),
|
tu.load(rs1 + traits::X0, 0),
|
||||||
tu.load(rs2 + traits::X0, 0))),32,false));
|
tu.load(rs2 + traits::X0, 0))),32,false));
|
||||||
}
|
}
|
||||||
|
@ -1512,8 +1493,7 @@ private:
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.ext((tu.sub(
|
||||||
tu.ext((tu.sub(
|
|
||||||
tu.load(rs1 + traits::X0, 0),
|
tu.load(rs1 + traits::X0, 0),
|
||||||
tu.load(rs2 + traits::X0, 0))),32,false));
|
tu.load(rs2 + traits::X0, 0))),32,false));
|
||||||
}
|
}
|
||||||
|
@ -1551,8 +1531,7 @@ private:
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.shl(
|
||||||
tu.shl(
|
|
||||||
tu.load(rs1 + traits::X0, 0),
|
tu.load(rs1 + traits::X0, 0),
|
||||||
(tu.bitwise_and(
|
(tu.bitwise_and(
|
||||||
tu.load(rs2 + traits::X0, 0),
|
tu.load(rs2 + traits::X0, 0),
|
||||||
|
@ -1592,8 +1571,7 @@ private:
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.conditionalAssignment(tu.icmp(ICmpInst::ICMP_SLT,
|
||||||
tu.conditionalAssignment(tu.icmp(ICmpInst::ICMP_SLT,
|
|
||||||
tu.ext(tu.load(rs1 + traits::X0, 0),32,true),
|
tu.ext(tu.load(rs1 + traits::X0, 0),32,true),
|
||||||
tu.ext(tu.load(rs2 + traits::X0, 0),32,true)), tu.constant(1,8),tu.constant(0,8)));
|
tu.ext(tu.load(rs2 + traits::X0, 0),32,true)), tu.constant(1,8),tu.constant(0,8)));
|
||||||
}
|
}
|
||||||
|
@ -1631,8 +1609,7 @@ private:
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.conditionalAssignment(tu.icmp(ICmpInst::ICMP_ULT,
|
||||||
tu.conditionalAssignment(tu.icmp(ICmpInst::ICMP_ULT,
|
|
||||||
tu.load(rs1 + traits::X0, 0),
|
tu.load(rs1 + traits::X0, 0),
|
||||||
tu.load(rs2 + traits::X0, 0)), tu.constant(1,8),tu.constant(0,8)));
|
tu.load(rs2 + traits::X0, 0)), tu.constant(1,8),tu.constant(0,8)));
|
||||||
}
|
}
|
||||||
|
@ -1670,8 +1647,7 @@ private:
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.bitwise_xor(
|
||||||
tu.bitwise_xor(
|
|
||||||
tu.load(rs1 + traits::X0, 0),
|
tu.load(rs1 + traits::X0, 0),
|
||||||
tu.load(rs2 + traits::X0, 0)));
|
tu.load(rs2 + traits::X0, 0)));
|
||||||
}
|
}
|
||||||
|
@ -1709,8 +1685,7 @@ private:
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.lshr(
|
||||||
tu.lshr(
|
|
||||||
tu.load(rs1 + traits::X0, 0),
|
tu.load(rs1 + traits::X0, 0),
|
||||||
(tu.bitwise_and(
|
(tu.bitwise_and(
|
||||||
tu.load(rs2 + traits::X0, 0),
|
tu.load(rs2 + traits::X0, 0),
|
||||||
|
@ -1750,8 +1725,7 @@ private:
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.ext((tu.ashr(
|
||||||
tu.ext((tu.ashr(
|
|
||||||
tu.ext(tu.load(rs1 + traits::X0, 0),32,true),
|
tu.ext(tu.load(rs1 + traits::X0, 0),32,true),
|
||||||
(tu.bitwise_and(
|
(tu.bitwise_and(
|
||||||
tu.load(rs2 + traits::X0, 0),
|
tu.load(rs2 + traits::X0, 0),
|
||||||
|
@ -1791,8 +1765,7 @@ private:
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.bitwise_or(
|
||||||
tu.bitwise_or(
|
|
||||||
tu.load(rs1 + traits::X0, 0),
|
tu.load(rs1 + traits::X0, 0),
|
||||||
tu.load(rs2 + traits::X0, 0)));
|
tu.load(rs2 + traits::X0, 0)));
|
||||||
}
|
}
|
||||||
|
@ -1830,8 +1803,7 @@ private:
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.bitwise_and(
|
||||||
tu.bitwise_and(
|
|
||||||
tu.load(rs1 + traits::X0, 0),
|
tu.load(rs1 + traits::X0, 0),
|
||||||
tu.load(rs2 + traits::X0, 0)));
|
tu.load(rs2 + traits::X0, 0)));
|
||||||
}
|
}
|
||||||
|
@ -2005,8 +1977,7 @@ private:
|
||||||
auto xrs1 = tu.assignment(tu.load(rs1 + traits::X0, 0),32);
|
auto xrs1 = tu.assignment(tu.load(rs1 + traits::X0, 0),32);
|
||||||
if(rd!=0){ auto xrd = tu.assignment(tu.read_mem(traits::CSR, csr, 32),32);
|
if(rd!=0){ auto xrd = tu.assignment(tu.read_mem(traits::CSR, csr, 32),32);
|
||||||
tu.write_mem(traits::CSR, csr, xrs1);
|
tu.write_mem(traits::CSR, csr, xrs1);
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, xrd);
|
||||||
xrd);
|
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
tu.write_mem(traits::CSR, csr, xrs1);
|
tu.write_mem(traits::CSR, csr, xrs1);
|
||||||
|
@ -2052,8 +2023,7 @@ private:
|
||||||
xrs1));
|
xrs1));
|
||||||
}
|
}
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, xrd);
|
||||||
xrd);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
auto returnValue = std::make_tuple(CONT);
|
auto returnValue = std::make_tuple(CONT);
|
||||||
|
@ -2096,8 +2066,7 @@ private:
|
||||||
tu.logical_neg(xrs1)));
|
tu.logical_neg(xrs1)));
|
||||||
}
|
}
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, xrd);
|
||||||
xrd);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
auto returnValue = std::make_tuple(CONT);
|
auto returnValue = std::make_tuple(CONT);
|
||||||
|
@ -2135,8 +2104,7 @@ private:
|
||||||
auto xrd = tu.assignment(tu.read_mem(traits::CSR, csr, 32),32);
|
auto xrd = tu.assignment(tu.read_mem(traits::CSR, csr, 32),32);
|
||||||
tu.write_mem(traits::CSR, csr, tu.constant((uint32_t)zimm,32));
|
tu.write_mem(traits::CSR, csr, tu.constant((uint32_t)zimm,32));
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, xrd);
|
||||||
xrd);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
auto returnValue = std::make_tuple(CONT);
|
auto returnValue = std::make_tuple(CONT);
|
||||||
|
@ -2178,8 +2146,7 @@ private:
|
||||||
tu.constant((uint32_t)zimm,32)));
|
tu.constant((uint32_t)zimm,32)));
|
||||||
}
|
}
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, xrd);
|
||||||
xrd);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
auto returnValue = std::make_tuple(CONT);
|
auto returnValue = std::make_tuple(CONT);
|
||||||
|
@ -2221,8 +2188,7 @@ private:
|
||||||
tu.constant(~ ((uint32_t)zimm),32)));
|
tu.constant(~ ((uint32_t)zimm),32)));
|
||||||
}
|
}
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, xrd);
|
||||||
xrd);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
auto returnValue = std::make_tuple(CONT);
|
auto returnValue = std::make_tuple(CONT);
|
||||||
|
@ -2290,8 +2256,7 @@ private:
|
||||||
tu.ext(tu.load(rs1 + traits::X0, 0),32,true),
|
tu.ext(tu.load(rs1 + traits::X0, 0),32,true),
|
||||||
tu.ext(tu.load(rs2 + traits::X0, 0),32,true)),64);
|
tu.ext(tu.load(rs2 + traits::X0, 0),32,true)),64);
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.ext(res,32,false));
|
||||||
tu.ext(res,32,false));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
auto returnValue = std::make_tuple(CONT);
|
auto returnValue = std::make_tuple(CONT);
|
||||||
|
@ -2330,8 +2295,7 @@ private:
|
||||||
tu.ext(tu.load(rs1 + traits::X0, 0),32,true),
|
tu.ext(tu.load(rs1 + traits::X0, 0),32,true),
|
||||||
tu.ext(tu.load(rs2 + traits::X0, 0),32,true)),64);
|
tu.ext(tu.load(rs2 + traits::X0, 0),32,true)),64);
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.ext((tu.ashr(
|
||||||
tu.ext((tu.ashr(
|
|
||||||
res,
|
res,
|
||||||
tu.constant(static_cast<uint32_t>(traits:: XLEN),32))),32,false));
|
tu.constant(static_cast<uint32_t>(traits:: XLEN),32))),32,false));
|
||||||
}
|
}
|
||||||
|
@ -2372,8 +2336,7 @@ private:
|
||||||
tu.ext(tu.load(rs1 + traits::X0, 0),32,true),
|
tu.ext(tu.load(rs1 + traits::X0, 0),32,true),
|
||||||
tu.load(rs2 + traits::X0, 0)),64);
|
tu.load(rs2 + traits::X0, 0)),64);
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.ext((tu.ashr(
|
||||||
tu.ext((tu.ashr(
|
|
||||||
res,
|
res,
|
||||||
tu.constant(static_cast<uint32_t>(traits:: XLEN),32))),32,false));
|
tu.constant(static_cast<uint32_t>(traits:: XLEN),32))),32,false));
|
||||||
}
|
}
|
||||||
|
@ -2414,8 +2377,7 @@ private:
|
||||||
tu.load(rs1 + traits::X0, 0),
|
tu.load(rs1 + traits::X0, 0),
|
||||||
tu.load(rs2 + traits::X0, 0)),64);
|
tu.load(rs2 + traits::X0, 0)),64);
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.ext((tu.lshr(
|
||||||
tu.ext((tu.lshr(
|
|
||||||
res,
|
res,
|
||||||
tu.constant(static_cast<uint32_t>(traits:: XLEN),32))),32,false));
|
tu.constant(static_cast<uint32_t>(traits:: XLEN),32))),32,false));
|
||||||
}
|
}
|
||||||
|
@ -2465,17 +2427,14 @@ private:
|
||||||
tu.icmp(ICmpInst::ICMP_EQ,
|
tu.icmp(ICmpInst::ICMP_EQ,
|
||||||
divisor,
|
divisor,
|
||||||
tu.constant(- 1,8))));
|
tu.constant(- 1,8))));
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.constant(MMIN,32));
|
||||||
tu.constant(MMIN,32));
|
|
||||||
tu.open_else();
|
tu.open_else();
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.ext((tu.sdiv(
|
||||||
tu.ext((tu.sdiv(
|
|
||||||
dividend,
|
dividend,
|
||||||
divisor)),32,false));
|
divisor)),32,false));
|
||||||
tu.close_scope();
|
tu.close_scope();
|
||||||
tu.open_else();
|
tu.open_else();
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.constant((uint32_t)- 1,32));
|
||||||
tu.constant((uint32_t)- 1,32));
|
|
||||||
tu.close_scope();
|
tu.close_scope();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2515,15 +2474,13 @@ private:
|
||||||
tu.load(rs2 + traits::X0, 0),
|
tu.load(rs2 + traits::X0, 0),
|
||||||
tu.constant(0,8)));
|
tu.constant(0,8)));
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.udiv(
|
||||||
tu.udiv(
|
|
||||||
tu.load(rs1 + traits::X0, 0),
|
tu.load(rs1 + traits::X0, 0),
|
||||||
tu.load(rs2 + traits::X0, 0)));
|
tu.load(rs2 + traits::X0, 0)));
|
||||||
}
|
}
|
||||||
tu.open_else();
|
tu.open_else();
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.constant((uint32_t)- 1,32));
|
||||||
tu.constant((uint32_t)- 1,32));
|
|
||||||
}
|
}
|
||||||
tu.close_scope();
|
tu.close_scope();
|
||||||
}
|
}
|
||||||
|
@ -2571,21 +2528,18 @@ private:
|
||||||
tu.ext(tu.load(rs2 + traits::X0, 0),32,true),
|
tu.ext(tu.load(rs2 + traits::X0, 0),32,true),
|
||||||
tu.constant(- 1,8))));
|
tu.constant(- 1,8))));
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.constant(0,8));
|
||||||
tu.constant(0,8));
|
|
||||||
}
|
}
|
||||||
tu.open_else();
|
tu.open_else();
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.ext((tu.srem(
|
||||||
tu.ext((tu.srem(
|
|
||||||
tu.ext(tu.load(rs1 + traits::X0, 0),32,true),
|
tu.ext(tu.load(rs1 + traits::X0, 0),32,true),
|
||||||
tu.ext(tu.load(rs2 + traits::X0, 0),32,true))),32,false));
|
tu.ext(tu.load(rs2 + traits::X0, 0),32,true))),32,false));
|
||||||
}
|
}
|
||||||
tu.close_scope();
|
tu.close_scope();
|
||||||
tu.open_else();
|
tu.open_else();
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.load(rs1 + traits::X0, 0));
|
||||||
tu.load(rs1+ traits::X0, 0));
|
|
||||||
}
|
}
|
||||||
tu.close_scope();
|
tu.close_scope();
|
||||||
}
|
}
|
||||||
|
@ -2625,15 +2579,13 @@ private:
|
||||||
tu.load(rs2 + traits::X0, 0),
|
tu.load(rs2 + traits::X0, 0),
|
||||||
tu.constant(0,8)));
|
tu.constant(0,8)));
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.urem(
|
||||||
tu.urem(
|
|
||||||
tu.load(rs1 + traits::X0, 0),
|
tu.load(rs1 + traits::X0, 0),
|
||||||
tu.load(rs2 + traits::X0, 0)));
|
tu.load(rs2 + traits::X0, 0)));
|
||||||
}
|
}
|
||||||
tu.open_else();
|
tu.open_else();
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.load(rs1 + traits::X0, 0));
|
||||||
tu.load(rs1+ traits::X0, 0));
|
|
||||||
}
|
}
|
||||||
tu.close_scope();
|
tu.close_scope();
|
||||||
}
|
}
|
||||||
|
@ -2665,8 +2617,7 @@ private:
|
||||||
tu.open_scope();
|
tu.open_scope();
|
||||||
this->gen_set_tval(tu, instr);
|
this->gen_set_tval(tu, instr);
|
||||||
if(imm) {
|
if(imm) {
|
||||||
tu.store(rd+8 + traits::X0,
|
tu.store(rd+8 + traits::X0, tu.ext((tu.add(
|
||||||
tu.ext((tu.add(
|
|
||||||
tu.load(2 + traits::X0, 0),
|
tu.load(2 + traits::X0, 0),
|
||||||
tu.constant(imm,16))),32,false));
|
tu.constant(imm,16))),32,false));
|
||||||
}
|
}
|
||||||
|
@ -2704,8 +2655,7 @@ private:
|
||||||
auto offs = tu.assignment(tu.ext((tu.add(
|
auto offs = tu.assignment(tu.ext((tu.add(
|
||||||
tu.load(rs1+8 + traits::X0, 0),
|
tu.load(rs1+8 + traits::X0, 0),
|
||||||
tu.constant(uimm,8))),32,false),32);
|
tu.constant(uimm,8))),32,false),32);
|
||||||
tu.store(rd+8 + traits::X0,
|
tu.store(rd+8 + traits::X0, tu.ext(tu.ext(tu.read_mem(traits::MEM, offs, 32),32,true),32,false));
|
||||||
tu.ext(tu.ext(tu.read_mem(traits::MEM, offs, 32),32,true),32,false));
|
|
||||||
auto returnValue = std::make_tuple(CONT);
|
auto returnValue = std::make_tuple(CONT);
|
||||||
|
|
||||||
tu.close_scope();
|
tu.close_scope();
|
||||||
|
@ -2770,8 +2720,7 @@ private:
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(rs1!=0) {
|
if(rs1!=0) {
|
||||||
tu.store(rs1 + traits::X0,
|
tu.store(rs1 + traits::X0, tu.ext((tu.add(
|
||||||
tu.ext((tu.add(
|
|
||||||
tu.load(rs1 + traits::X0, 0),
|
tu.load(rs1 + traits::X0, 0),
|
||||||
tu.constant((int8_t)sext<6>(imm),8))),32,false));
|
tu.constant((int8_t)sext<6>(imm),8))),32,false));
|
||||||
}
|
}
|
||||||
|
@ -2828,8 +2777,7 @@ private:
|
||||||
tu.open_scope();
|
tu.open_scope();
|
||||||
this->gen_set_tval(tu, instr);
|
this->gen_set_tval(tu, instr);
|
||||||
tu.store(traits::LAST_BRANCH, tu.constant(static_cast<int>(NO_JUMP),32));
|
tu.store(traits::LAST_BRANCH, tu.constant(static_cast<int>(NO_JUMP),32));
|
||||||
tu.store(1 + traits::X0,
|
tu.store(1 + traits::X0, tu.constant((uint32_t)(PC+2),32));
|
||||||
tu.constant((uint32_t)(PC+2),32));
|
|
||||||
auto PC_val_v = tu.assignment("PC_val", (uint32_t)(PC+(int16_t)sext<12>(imm)),32);
|
auto PC_val_v = tu.assignment("PC_val", (uint32_t)(PC+(int16_t)sext<12>(imm)),32);
|
||||||
tu.store(traits::NEXT_PC, PC_val_v);
|
tu.store(traits::NEXT_PC, PC_val_v);
|
||||||
tu.store(traits::LAST_BRANCH, tu.constant(static_cast<int>(KNOWN_JUMP), 2));
|
tu.store(traits::LAST_BRANCH, tu.constant(static_cast<int>(KNOWN_JUMP), 2));
|
||||||
|
@ -2865,8 +2813,7 @@ private:
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.constant((uint32_t)((int8_t)sext<6>(imm)),32));
|
||||||
tu.constant((uint32_t)((int8_t)sext<6>(imm)),32));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
auto returnValue = std::make_tuple(CONT);
|
auto returnValue = std::make_tuple(CONT);
|
||||||
|
@ -2900,8 +2847,7 @@ private:
|
||||||
this->gen_raise_trap(tu, 0, static_cast<int32_t>(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION));
|
this->gen_raise_trap(tu, 0, static_cast<int32_t>(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION));
|
||||||
}
|
}
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.constant((uint32_t)((int32_t)sext<18>(imm)),32));
|
||||||
tu.constant((uint32_t)((int32_t)sext<18>(imm)),32));
|
|
||||||
}
|
}
|
||||||
auto returnValue = std::make_tuple(CONT);
|
auto returnValue = std::make_tuple(CONT);
|
||||||
|
|
||||||
|
@ -2930,8 +2876,7 @@ private:
|
||||||
tu.open_scope();
|
tu.open_scope();
|
||||||
this->gen_set_tval(tu, instr);
|
this->gen_set_tval(tu, instr);
|
||||||
if(nzimm) {
|
if(nzimm) {
|
||||||
tu.store(2 + traits::X0,
|
tu.store(2 + traits::X0, tu.ext((tu.add(
|
||||||
tu.ext((tu.add(
|
|
||||||
tu.load(2 + traits::X0, 0),
|
tu.load(2 + traits::X0, 0),
|
||||||
tu.constant((int16_t)sext<10>(nzimm),16))),32,false));
|
tu.constant((int16_t)sext<10>(nzimm),16))),32,false));
|
||||||
}
|
}
|
||||||
|
@ -2991,8 +2936,7 @@ private:
|
||||||
gen_set_pc(tu, pc, traits::NEXT_PC);
|
gen_set_pc(tu, pc, traits::NEXT_PC);
|
||||||
tu.open_scope();
|
tu.open_scope();
|
||||||
this->gen_set_tval(tu, instr);
|
this->gen_set_tval(tu, instr);
|
||||||
tu.store(rs1+8 + traits::X0,
|
tu.store(rs1+8 + traits::X0, tu.lshr(
|
||||||
tu.lshr(
|
|
||||||
tu.load(rs1+8 + traits::X0, 0),
|
tu.load(rs1+8 + traits::X0, 0),
|
||||||
tu.constant(shamt,8)));
|
tu.constant(shamt,8)));
|
||||||
auto returnValue = std::make_tuple(CONT);
|
auto returnValue = std::make_tuple(CONT);
|
||||||
|
@ -3022,14 +2966,12 @@ private:
|
||||||
gen_set_pc(tu, pc, traits::NEXT_PC);
|
gen_set_pc(tu, pc, traits::NEXT_PC);
|
||||||
tu.open_scope();
|
tu.open_scope();
|
||||||
this->gen_set_tval(tu, instr);
|
this->gen_set_tval(tu, instr);
|
||||||
if(shamt){ tu.store(rs1+8 + traits::X0,
|
if(shamt){ tu.store(rs1+8 + traits::X0, tu.ext((tu.ashr(
|
||||||
tu.ext((tu.ashr(
|
|
||||||
(tu.ext(tu.load(rs1+8 + traits::X0, 0),32,true)),
|
(tu.ext(tu.load(rs1+8 + traits::X0, 0),32,true)),
|
||||||
tu.constant(shamt,8))),32,false));
|
tu.constant(shamt,8))),32,false));
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(static_cast<uint32_t>(traits:: XLEN)==128){ tu.store(rs1+8 + traits::X0,
|
if(static_cast<uint32_t>(traits:: XLEN)==128){ tu.store(rs1+8 + traits::X0, tu.ext((tu.ashr(
|
||||||
tu.ext((tu.ashr(
|
|
||||||
(tu.ext(tu.load(rs1+8 + traits::X0, 0),32,true)),
|
(tu.ext(tu.load(rs1+8 + traits::X0, 0),32,true)),
|
||||||
tu.constant(64,8))),32,false));
|
tu.constant(64,8))),32,false));
|
||||||
}
|
}
|
||||||
|
@ -3061,8 +3003,7 @@ private:
|
||||||
gen_set_pc(tu, pc, traits::NEXT_PC);
|
gen_set_pc(tu, pc, traits::NEXT_PC);
|
||||||
tu.open_scope();
|
tu.open_scope();
|
||||||
this->gen_set_tval(tu, instr);
|
this->gen_set_tval(tu, instr);
|
||||||
tu.store(rs1+8 + traits::X0,
|
tu.store(rs1+8 + traits::X0, tu.ext((tu.bitwise_and(
|
||||||
tu.ext((tu.bitwise_and(
|
|
||||||
tu.load(rs1+8 + traits::X0, 0),
|
tu.load(rs1+8 + traits::X0, 0),
|
||||||
tu.constant((int8_t)sext<6>(imm),8))),32,false));
|
tu.constant((int8_t)sext<6>(imm),8))),32,false));
|
||||||
auto returnValue = std::make_tuple(CONT);
|
auto returnValue = std::make_tuple(CONT);
|
||||||
|
@ -3092,8 +3033,7 @@ private:
|
||||||
gen_set_pc(tu, pc, traits::NEXT_PC);
|
gen_set_pc(tu, pc, traits::NEXT_PC);
|
||||||
tu.open_scope();
|
tu.open_scope();
|
||||||
this->gen_set_tval(tu, instr);
|
this->gen_set_tval(tu, instr);
|
||||||
tu.store(rd+8 + traits::X0,
|
tu.store(rd+8 + traits::X0, tu.ext((tu.sub(
|
||||||
tu.ext((tu.sub(
|
|
||||||
tu.load(rd+8 + traits::X0, 0),
|
tu.load(rd+8 + traits::X0, 0),
|
||||||
tu.load(rs2+8 + traits::X0, 0))),32,false));
|
tu.load(rs2+8 + traits::X0, 0))),32,false));
|
||||||
auto returnValue = std::make_tuple(CONT);
|
auto returnValue = std::make_tuple(CONT);
|
||||||
|
@ -3123,8 +3063,7 @@ private:
|
||||||
gen_set_pc(tu, pc, traits::NEXT_PC);
|
gen_set_pc(tu, pc, traits::NEXT_PC);
|
||||||
tu.open_scope();
|
tu.open_scope();
|
||||||
this->gen_set_tval(tu, instr);
|
this->gen_set_tval(tu, instr);
|
||||||
tu.store(rd+8 + traits::X0,
|
tu.store(rd+8 + traits::X0, tu.bitwise_xor(
|
||||||
tu.bitwise_xor(
|
|
||||||
tu.load(rd+8 + traits::X0, 0),
|
tu.load(rd+8 + traits::X0, 0),
|
||||||
tu.load(rs2+8 + traits::X0, 0)));
|
tu.load(rs2+8 + traits::X0, 0)));
|
||||||
auto returnValue = std::make_tuple(CONT);
|
auto returnValue = std::make_tuple(CONT);
|
||||||
|
@ -3154,8 +3093,7 @@ private:
|
||||||
gen_set_pc(tu, pc, traits::NEXT_PC);
|
gen_set_pc(tu, pc, traits::NEXT_PC);
|
||||||
tu.open_scope();
|
tu.open_scope();
|
||||||
this->gen_set_tval(tu, instr);
|
this->gen_set_tval(tu, instr);
|
||||||
tu.store(rd+8 + traits::X0,
|
tu.store(rd+8 + traits::X0, tu.bitwise_or(
|
||||||
tu.bitwise_or(
|
|
||||||
tu.load(rd+8 + traits::X0, 0),
|
tu.load(rd+8 + traits::X0, 0),
|
||||||
tu.load(rs2+8 + traits::X0, 0)));
|
tu.load(rs2+8 + traits::X0, 0)));
|
||||||
auto returnValue = std::make_tuple(CONT);
|
auto returnValue = std::make_tuple(CONT);
|
||||||
|
@ -3185,8 +3123,7 @@ private:
|
||||||
gen_set_pc(tu, pc, traits::NEXT_PC);
|
gen_set_pc(tu, pc, traits::NEXT_PC);
|
||||||
tu.open_scope();
|
tu.open_scope();
|
||||||
this->gen_set_tval(tu, instr);
|
this->gen_set_tval(tu, instr);
|
||||||
tu.store(rd+8 + traits::X0,
|
tu.store(rd+8 + traits::X0, tu.bitwise_and(
|
||||||
tu.bitwise_and(
|
|
||||||
tu.load(rd+8 + traits::X0, 0),
|
tu.load(rd+8 + traits::X0, 0),
|
||||||
tu.load(rs2+8 + traits::X0, 0)));
|
tu.load(rs2+8 + traits::X0, 0)));
|
||||||
auto returnValue = std::make_tuple(CONT);
|
auto returnValue = std::make_tuple(CONT);
|
||||||
|
@ -3321,8 +3258,7 @@ private:
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(rs1!=0) {
|
if(rs1!=0) {
|
||||||
tu.store(rs1 + traits::X0,
|
tu.store(rs1 + traits::X0, tu.shl(
|
||||||
tu.shl(
|
|
||||||
tu.load(rs1 + traits::X0, 0),
|
tu.load(rs1 + traits::X0, 0),
|
||||||
tu.constant(nzuimm,8)));
|
tu.constant(nzuimm,8)));
|
||||||
}
|
}
|
||||||
|
@ -3361,8 +3297,7 @@ private:
|
||||||
auto offs = tu.assignment(tu.ext((tu.add(
|
auto offs = tu.assignment(tu.ext((tu.add(
|
||||||
tu.load(2 + traits::X0, 0),
|
tu.load(2 + traits::X0, 0),
|
||||||
tu.constant(uimm,8))),32,false),32);
|
tu.constant(uimm,8))),32,false),32);
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.ext(tu.ext(tu.read_mem(traits::MEM, offs, 32),32,true),32,false));
|
||||||
tu.ext(tu.ext(tu.read_mem(traits::MEM, offs, 32),32,true),32,false));
|
|
||||||
}
|
}
|
||||||
auto returnValue = std::make_tuple(CONT);
|
auto returnValue = std::make_tuple(CONT);
|
||||||
|
|
||||||
|
@ -3396,8 +3331,7 @@ private:
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.load(rs2 + traits::X0, 0));
|
||||||
tu.load(rs2+ traits::X0, 0));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
auto returnValue = std::make_tuple(CONT);
|
auto returnValue = std::make_tuple(CONT);
|
||||||
|
@ -3494,8 +3428,7 @@ private:
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(rd!=0) {
|
if(rd!=0) {
|
||||||
tu.store(rd + traits::X0,
|
tu.store(rd + traits::X0, tu.ext((tu.add(
|
||||||
tu.ext((tu.add(
|
|
||||||
tu.load(rd + traits::X0, 0),
|
tu.load(rd + traits::X0, 0),
|
||||||
tu.load(rs2 + traits::X0, 0))),32,false));
|
tu.load(rs2 + traits::X0, 0))),32,false));
|
||||||
}
|
}
|
||||||
|
@ -3533,8 +3466,7 @@ private:
|
||||||
else{
|
else{
|
||||||
auto addr_mask = (uint32_t)- 2;
|
auto addr_mask = (uint32_t)- 2;
|
||||||
auto new_pc = tu.assignment(tu.load(rs1 + traits::X0, 0),32);
|
auto new_pc = tu.assignment(tu.load(rs1 + traits::X0, 0),32);
|
||||||
tu.store(1 + traits::X0,
|
tu.store(1 + traits::X0, tu.constant((uint32_t)(PC+2),32));
|
||||||
tu.constant((uint32_t)(PC+2),32));
|
|
||||||
auto PC_val_v = tu.assignment("PC_val", tu.bitwise_and(
|
auto PC_val_v = tu.assignment("PC_val", tu.bitwise_and(
|
||||||
new_pc,
|
new_pc,
|
||||||
tu.constant(addr_mask,32)),32);
|
tu.constant(addr_mask,32)),32);
|
||||||
|
@ -3645,7 +3577,7 @@ private:
|
||||||
tu("print_disass(core_ptr, {:#x}, \"{}\");", pc.val, std::string("illegal_instruction"));
|
tu("print_disass(core_ptr, {:#x}, \"{}\");", pc.val, std::string("illegal_instruction"));
|
||||||
}
|
}
|
||||||
pc = pc + ((instr & 3) == 3 ? 4 : 2);
|
pc = pc + ((instr & 3) == 3 ? 4 : 2);
|
||||||
gen_raise_trap(tu, 0, 2); // illegal instruction trap
|
gen_raise_trap(tu, 0, static_cast<int32_t>(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION));
|
||||||
this->gen_set_tval(tu, instr);
|
this->gen_set_tval(tu, instr);
|
||||||
vm_impl::gen_sync(tu, iss::POST_SYNC, instr_descr.size());
|
vm_impl::gen_sync(tu, iss::POST_SYNC, instr_descr.size());
|
||||||
vm_impl::gen_trap_check(tu);
|
vm_impl::gen_trap_check(tu);
|
||||||
|
|
Loading…
Reference in New Issue