updates template

This commit is contained in:
Eyck-Alexander Jentzsch 2024-08-08 11:08:28 +02:00
parent 62d21e1156
commit 235a7e6e24
2 changed files with 207 additions and 275 deletions

View File

@ -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);

View File

@ -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);