Commit Diff


commit - 94fb04263ddc9042a16e8123229ac8a66ce3f640
commit + b7739ce0610723e174431f433a6335f33dec04d9
blob - 758e9bd133624527bd2988b1e37dfbe8183d51a9
blob + 961761d22ce8fd4748b57645c841b5e25eaefceb
--- rvvm/rvhandler.c
+++ rvvm/rvhandler.c
@@ -2,3 +2,107 @@
 #include <stdio.h>
 
 #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;
+}