commit b7739ce0610723e174431f433a6335f33dec04d9 from: Gleb Nesterov date: Sun Mar 22 15:35:38 2026 UTC Add basic OP and OP-imm handlers commit - 94fb04263ddc9042a16e8123229ac8a66ce3f640 commit + b7739ce0610723e174431f433a6335f33dec04d9 blob - 758e9bd133624527bd2988b1e37dfbe8183d51a9 blob + 961761d22ce8fd4748b57645c841b5e25eaefceb --- rvvm/rvhandler.c +++ rvvm/rvhandler.c @@ -2,3 +2,107 @@ #include #include "rvhandler.h" + +void +exec_addi(struct rv_hart *h, struct rv_instr i) +{ + h->rfile[i.rd] = h->rfile[i.rs1] + i.imm; +} + +void +exec_andi(struct rv_hart *h, struct rv_instr i) +{ + h->rfile[i.rd] = h->rfile[i.rs1] & i.imm; +} + +void +exec_ori(struct rv_hart *h, struct rv_instr i) +{ + h->rfile[i.rd] = h->rfile[i.rs1] | i.imm; +} + +void +exec_xori(struct rv_hart *h, struct rv_instr i) +{ + h->rfile[i.rd] = h->rfile[i.rs1] ^ i.imm; +} + +void +exec_add(struct rv_hart *h, struct rv_instr i) +{ + h->rfile[i.rd] = h->rfile[i.rs1] + h->rfile[i.rs2]; +} + +void +exec_sub(struct rv_hart *h, struct rv_instr i) +{ + h->rfile[i.rd] = h->rfile[i.rs1] - h->rfile[i.rs2]; +} + +void +exec_and(struct rv_hart *h, struct rv_instr i) +{ + h->rfile[i.rd] = h->rfile[i.rs1] & h->rfile[i.rs2]; +} + +void +exec_addiw(struct rv_hart *h, struct rv_instr i) +{ + int32_t r; + + r = (int32_t)h->rfile[i.rs1] + (int32_t)i.imm; + h->rfile[i.rd] = (int64_t)r; +} + +void +exec_addw(struct rv_hart *h, struct rv_instr i) +{ + int32_t r; + + r = (int32_t)h->rfile[i.rs1] + (int32_t)h->rfile[i.rs2]; + h->rfile[i.rd] = (int64_t)r; +} + +void +exec_beq(struct rv_hart *h, struct rv_instr i) +{ + if (h->rfile[i.rs1] == h->rfile[i.rs2]) + h->next_pc = h->pc + i.imm; +} + +void +exec_bnq(struct rv_hart *h, struct rv_instr i) +{ + if (h->rfile[i.rs1] != h->rfile[i.rs2]) + h->next_pc = h->pc + i.imm; +} + +void +exec_ld(struct rv_hart *h, struct rv_instr i) +{ + (void)h; (void)i; +} + +void +exec_lw(struct rv_hart *h, struct rv_instr i) +{ + (void)h; (void)i; +} + +void +exec_sd(struct rv_hart *h, struct rv_instr i) +{ + (void)h; (void)i; +} + +void +exec_sw(struct rv_hart *h, struct rv_instr i) +{ + (void)h; (void)i; +} + +void +exec_ecall(struct rv_hart *h, struct rv_instr i) +{ + (void)h; (void)i; +}