diff options
| -rw-r--r-- | src/asm.cpp | 143 | ||||
| -rw-r--r-- | src/asm.hpp | 74 |
2 files changed, 217 insertions, 0 deletions
diff --git a/src/asm.cpp b/src/asm.cpp new file mode 100644 index 0000000..d79f086 --- /dev/null +++ b/src/asm.cpp @@ -0,0 +1,143 @@ +#include <cstdint> +#include <map> +#include <string> +#include "asm.hpp" + +namespace { +std::map<std::string, instruction_t> instructions = { + {"lb", {}}, + {"lh", {}}, + {"lw", {}}, + {"ld", {}}, + {"lbu", {}}, + {"lhu", {}}, + {"lwu", {}}, + {"sb", {}}, + {"sh", {}}, + {"sw", {}}, + {"sd", {}}, + {"li", {}}, + {"lui", {}}, + {"auipc", {}}, + {"mv", {}}, + {"sext.b", {}}, + {"sext.h", {}}, + {"sext.w", {}}, + {"zext.b", {}}, + {"zext.h", {}}, + {"zext.w", {}}, + {"rev8", {}}, + {"czero.eqz", {}}, + {"czero.nez", {}}, + {"addi", {}}, + {"add", {}}, + {"sh1add", {}}, + {"sh2add", {}}, + {"sh3add", {}}, + {"add.wu", {}}, + {"sh1add.wu", {}}, + {"sh2add.wu", {}}, + {"sh3add.wu", {}}, + {"addiw", {}}, + {"addw", {}}, + {"sub", {}}, + {"subw", {}}, + {"neg", {}}, + {"negw", {}}, + {"mul", {}}, + {"mulw", {}}, + {"mulh", {}}, + {"mulhu", {}}, + {"mulhsu", {}}, + {"div", {}}, + {"divu", {}}, + {"rem", {}}, + {"remu", {}}, + {"min", {}}, + {"max", {}}, + {"minu", {}}, + {"maxu", {}}, + {"seqz", {}}, + {"snez", {}}, + {"slti", {}}, + {"slt", {}}, + {"sltiu", {}}, + {"sltu", {}}, + {"bexti", {}}, + {"bext", {}}, + {"andi", {}}, + {"and", {}}, + {"andn", {}}, + {"bclri", {}}, + {"bclr", {}}, + {"ori", {}}, + {"or", {}}, + {"orn", {}}, + {"bseti", {}}, + {"bset", {}}, + {"xori", {}}, + {"xor", {}}, + {"xnor", {}}, + {"binvi", {}}, + {"binv", {}}, + {"not", {}}, + {"orc.b", {}}, + {"slli", {}}, + {"sll", {}}, + {"slliw", {}}, + {"sllw", {}}, + {"slli.wu", {}}, + {"srli", {}}, + {"srl", {}}, + {"srliw", {}}, + {"srlw", {}}, + {"srai", {}}, + {"sra", {}}, + {"sraiw", {}}, + {"sraw", {}}, + {"rori", {}}, + {"ror", {}}, + {"rol", {}}, + {"roriw", {}}, + {"rorw", {}}, + {"rolw", {}}, + {"clz", {}}, + {"clzw", {}}, + {"ctz", {}}, + {"ctzw", {}}, + {"cpop", {}}, + {"cpopw", {}}, + {"j", {}}, + {"jal", {}}, + {"jr", {}}, + {"jalr", {}}, + {"call", {}}, + {"tail", {}}, + {"ret", {}}, + {"beq", {}}, + {"bne", {}}, + {"blt", {}}, + {"bgt", {}}, + {"bge", {}}, + {"ble", {}}, + {"bltu", {}}, + {"bgtu", {}}, + {"bgeu", {}}, + {"bleu", {}}, + {"nop", {}}, + {"ecall", {}}, + {"ebreak", {}}, +}; + +std::map<std::string, uint8_t> registers = { + {"x0", 0}, {"x1", 1}, {"x2", 2}, {"x3", 3}, {"x4", 4}, {"x5", 5}, {"x6", 6}, {"x7", 7}, {"x8", 8}, + {"x9", 9}, {"x10", 10}, {"x11", 11}, {"x12", 12}, {"x13", 13}, {"x14", 14}, {"x15", 15}, {"x16", 16}, {"x17", 17}, + {"x18", 18}, {"x19", 19}, {"x20", 20}, {"x21", 21}, {"x22", 22}, {"x23", 23}, {"x24", 24}, {"x25", 25}, {"x26", 26}, + {"x27", 27}, {"x28", 28}, {"x29", 29}, {"x30", 30}, {"x31", 31}, {"zero", 0}, {"ra", 1}, {"sp", 2}, {"gp", 3}, + {"tp", 4}, {"t0", 5}, {"t1", 6}, {"t2", 7}, {"s0", 8}, {"fp", 8}, {"s1", 9}, {"a0", 10}, {"a1", 11}, + {"a2", 12}, {"a3", 13}, {"a4", 14}, {"a5", 15}, {"a6", 16}, {"a7", 17}, {"s2", 18}, {"s3", 19}, {"s4", 20}, + {"s5", 21}, {"s6", 22}, {"s7", 23}, {"s8", 24}, {"s9", 25}, {"s10", 26}, {"s11", 27}, {"t3", 28}, {"t4", 29}, + {"t5", 30}, {"t6", 31}, +}; +} // namespace + diff --git a/src/asm.hpp b/src/asm.hpp new file mode 100644 index 0000000..4d5eb73 --- /dev/null +++ b/src/asm.hpp @@ -0,0 +1,74 @@ +#ifndef SRC_ASM_HPP_ +#define SRC_ASM_HPP_ + +#include <cstdint> + +enum class type_t {R, I, S, U, B, J}; + +struct r_type { + uint32_t funct7 : 7; + uint32_t rs2 : 5; + uint32_t rs1 : 5; + uint32_t funct3 : 3; + uint32_t rd : 5; + uint32_t opcode : 7; +}; + +struct i_type { + uint32_t imm : 12; + uint32_t rs1 : 5; + uint32_t funct3 : 3; + uint32_t rd : 5; + uint32_t opcode : 7; +}; + +struct s_type { + uint32_t imm_hi : 7; + uint32_t rs2 : 5; + uint32_t rs1 : 5; + uint32_t funct3 : 3; + uint32_t imm_lo : 5; + uint32_t opcode : 7; +}; + +struct u_type { + uint32_t imm : 10; + uint32_t rd : 5; + uint32_t opcode : 7; +}; + +struct b_type { + uint32_t a : 1; + uint32_t imm_hi : 6; + uint32_t rs2 : 5; + uint32_t rs1 : 5; + uint32_t funct3 : 3; + uint32_t imm_lo : 4; + uint32_t b : 1; + uint32_t opcode : 7; +}; + +struct j_type { + uint32_t a : 1; + uint32_t imm_lo : 10; + uint32_t b : 1; + uint32_t imm_hi : 8; + uint32_t rd : 5; + uint32_t opcode : 7; +}; + +struct instruction_t { + type_t t; + union { + r_type r; + i_type i; + s_type s; + u_type u; + b_type b; + j_type j; + uint32_t value; + }; +}; + +#endif // SRC_ASM_HPP_ + |
