From be0f783af8eb50025241b239fe896200e298e40e Mon Sep 17 00:00:00 2001 From: Eyck-Alexander Jentzsch Date: Sat, 28 Dec 2024 09:14:24 +0100 Subject: [PATCH] adds cycle increment to tcc --- src/iss/arch/tgc5c.h | 2 - src/vm/tcc/vm_tgc5c.cpp | 93 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 91 insertions(+), 4 deletions(-) diff --git a/src/iss/arch/tgc5c.h b/src/iss/arch/tgc5c.h index b62d6da..c946c1c 100644 --- a/src/iss/arch/tgc5c.h +++ b/src/iss/arch/tgc5c.h @@ -189,7 +189,6 @@ struct tgc5c: public arch_if { uint8_t* get_regs_base_ptr() override; - inline bool should_stop() { return interrupt_sim; } inline uint64_t stop_code() { return interrupt_sim; } @@ -199,7 +198,6 @@ struct tgc5c: public arch_if { virtual iss::sync_type needed_sync() const { return iss::NO_SYNC; } - #pragma pack(push, 1) struct TGC5C_regs { uint32_t X0 = 0; diff --git a/src/vm/tcc/vm_tgc5c.cpp b/src/vm/tcc/vm_tgc5c.cpp index 169dc74..85723e6 100644 --- a/src/vm/tcc/vm_tgc5c.cpp +++ b/src/vm/tcc/vm_tgc5c.cpp @@ -92,7 +92,7 @@ protected: super::setup_module(m); } - compile_ret_t gen_single_inst_behavior(virt_addr_t &,tu_builder&) override; + compile_ret_t gen_single_inst_behavior(virt_addr_t &, tu_builder&) override; void gen_trap_behavior(tu_builder& tu) override; @@ -344,6 +344,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)) { @@ -379,6 +380,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)) { @@ -414,6 +416,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); tu.store(traits::LAST_BRANCH, tu.constant(static_cast(NO_JUMP),32)); @@ -460,6 +463,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); tu.store(traits::LAST_BRANCH, tu.constant(static_cast(NO_JUMP),32)); @@ -517,6 +521,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); tu.store(traits::LAST_BRANCH, tu.constant(static_cast(NO_JUMP),32)); @@ -566,6 +571,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); tu.store(traits::LAST_BRANCH, tu.constant(static_cast(NO_JUMP),32)); @@ -615,6 +621,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); tu.store(traits::LAST_BRANCH, tu.constant(static_cast(NO_JUMP),32)); @@ -664,6 +671,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); tu.store(traits::LAST_BRANCH, tu.constant(static_cast(NO_JUMP),32)); @@ -713,6 +721,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); tu.store(traits::LAST_BRANCH, tu.constant(static_cast(NO_JUMP),32)); @@ -762,6 +771,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); tu.store(traits::LAST_BRANCH, tu.constant(static_cast(NO_JUMP),32)); @@ -811,6 +821,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { @@ -851,6 +862,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { @@ -891,6 +903,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { @@ -931,6 +944,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { @@ -971,6 +985,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { @@ -1011,6 +1026,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rs2>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { @@ -1048,6 +1064,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rs2>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { @@ -1085,6 +1102,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rs2>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { @@ -1122,6 +1140,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { @@ -1160,6 +1179,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { @@ -1198,6 +1218,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { @@ -1236,6 +1257,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { @@ -1274,6 +1296,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { @@ -1312,6 +1335,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { @@ -1350,6 +1374,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { @@ -1388,6 +1413,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { @@ -1426,6 +1452,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { @@ -1464,6 +1491,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { @@ -1502,6 +1530,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { @@ -1540,6 +1569,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { @@ -1580,6 +1610,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { @@ -1618,6 +1649,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { @@ -1656,6 +1688,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { @@ -1694,6 +1727,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { @@ -1734,6 +1768,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { @@ -1774,6 +1809,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { @@ -1812,6 +1848,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { @@ -1852,6 +1889,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); tu.write_mem(traits::FENCE, static_cast(traits:: fence), tu.constant((uint8_t)pred<<4|succ,8)); @@ -1877,6 +1915,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); tu.store(traits::LAST_BRANCH, tu.constant(static_cast(NO_JUMP),32)); @@ -1903,6 +1942,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); tu.store(traits::LAST_BRANCH, tu.constant(static_cast(NO_JUMP),32)); @@ -1929,6 +1969,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); tu.store(traits::LAST_BRANCH, tu.constant(static_cast(NO_JUMP),32)); @@ -1955,6 +1996,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); tu.callf("wait", tu.constant(1,8)); @@ -1984,6 +2026,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { @@ -2025,6 +2068,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { @@ -2068,6 +2112,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)) { @@ -2111,6 +2156,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)) { @@ -2149,6 +2195,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)) { @@ -2191,6 +2238,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)) { @@ -2233,6 +2281,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); tu.write_mem(traits::FENCE, static_cast(traits:: fencei), tu.constant(imm,16)); @@ -2262,6 +2311,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { @@ -2301,6 +2351,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { @@ -2342,6 +2393,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { @@ -2383,6 +2435,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { @@ -2424,6 +2477,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { @@ -2488,6 +2542,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { @@ -2538,6 +2593,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { @@ -2605,6 +2661,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 4; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rs1>=static_cast(traits:: RFS)||rs2>=static_cast(traits:: RFS)) { @@ -2654,6 +2711,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(imm) { @@ -2690,6 +2748,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); auto offs = tu.assignment(tu.ext((tu.add( @@ -2722,6 +2781,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); auto offs = tu.assignment(tu.ext((tu.add( @@ -2753,6 +2813,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rs1>=static_cast(traits:: RFS)) { @@ -2788,6 +2849,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); auto returnValue = CONT; @@ -2814,6 +2876,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); tu.store(traits::LAST_BRANCH, tu.constant(static_cast(NO_JUMP),32)); @@ -2846,6 +2909,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)) { @@ -2881,6 +2945,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(imm==0||rd>=static_cast(traits:: RFS)) { @@ -2913,6 +2978,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(nzimm) { @@ -2946,6 +3012,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); @@ -2974,6 +3041,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); tu.store(rs1+8 + traits::X0, tu.lshr( @@ -3004,6 +3072,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(shamt){ tu.store(rs1+8 + traits::X0, tu.ext((tu.ashr( @@ -3041,6 +3110,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); tu.store(rs1+8 + traits::X0, tu.ext((tu.bitwise_and( @@ -3071,6 +3141,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); tu.store(rd+8 + traits::X0, tu.ext((tu.sub( @@ -3101,6 +3172,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); tu.store(rd+8 + traits::X0, tu.bitwise_xor( @@ -3131,6 +3203,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); tu.store(rd+8 + traits::X0, tu.bitwise_or( @@ -3161,6 +3234,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); tu.store(rd+8 + traits::X0, tu.bitwise_and( @@ -3190,6 +3264,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); tu.store(traits::LAST_BRANCH, tu.constant(static_cast(NO_JUMP),32)); @@ -3221,6 +3296,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); tu.store(traits::LAST_BRANCH, tu.constant(static_cast(NO_JUMP),32)); @@ -3258,6 +3334,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); tu.store(traits::LAST_BRANCH, tu.constant(static_cast(NO_JUMP),32)); @@ -3295,6 +3372,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rs1>=static_cast(traits:: RFS)) { @@ -3332,6 +3410,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)||rd==0) { @@ -3368,6 +3447,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)) { @@ -3402,6 +3482,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); tu.store(traits::LAST_BRANCH, tu.constant(static_cast(NO_JUMP),32)); @@ -3437,6 +3518,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); this->gen_raise_trap(tu, 0, 2); @@ -3465,6 +3547,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rd>=static_cast(traits:: RFS)) { @@ -3501,6 +3584,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); tu.store(traits::LAST_BRANCH, tu.constant(static_cast(NO_JUMP),32)); @@ -3539,6 +3623,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); this->gen_raise_trap(tu, 0, 3); @@ -3567,6 +3652,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); if(rs2>=static_cast(traits:: RFS)) { @@ -3600,6 +3686,7 @@ private: auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); pc=pc+ 2; gen_set_pc(tu, pc, traits::NEXT_PC); + tu("(*cycle)++;"); tu.open_scope(); this->gen_set_tval(tu, instr); this->gen_raise_trap(tu, 0, static_cast(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); @@ -3697,13 +3784,15 @@ template void vm_impl::gen_trap_behavior(tu_builder& tu) { tu.store(traits::LAST_BRANCH, tu.constant(static_cast(UNKNOWN_JUMP),32)); tu("return *next_pc;"); } - template void vm_impl::add_prologue(tu_builder& tu){ std::ostringstream os; os << tu.add_reg_ptr("trap_state", arch::traits::TRAP_STATE, this->regs_base_ptr); os << tu.add_reg_ptr("pending_trap", arch::traits::PENDING_TRAP, this->regs_base_ptr); + os << tu.add_reg_ptr("cycle", arch::traits::CYCLE, this->regs_base_ptr); + tu.add_prologue(os.str()); } + } // namespace tgc5c template <>