提交 3f6ca5ea 编写于 作者: Z Zihao Yu

mips32: pass part of cputests

* TODO: muldiv, ldst with byte and half-word
上级 9b9ff4fb
......@@ -164,6 +164,18 @@ static inline void rtl_msb(rtlreg_t* dest, const rtlreg_t* src1, int width) {
}
}
static inline void rtl_mux(rtlreg_t* dest, const rtlreg_t* cond, const rtlreg_t* src1, const rtlreg_t* src2) {
// dest <- (cond ? src1 : src2)
// TODO();
rtl_setrelopi(RELOP_EQ, &t0, cond, 0);
rtl_subi(&t0, &t0, 1);
// t0 = mask
rtl_and(dest, src1, &t0);
rtl_not(&t0, &t0);
rtl_and(&t0, src2, &t0);
rtl_or(dest, &t0, dest);
}
#include "arch/rtl.h"
#endif
......@@ -56,7 +56,13 @@ make_DHelper(B) {
}
make_DHelper(shift) {
decode_op_r(id_src, decinfo.arch.instr.rt, true);
decode_op_i(id_src2, decinfo.arch.instr.sa, true);
decode_op_i(id_src, decinfo.arch.instr.sa, true);
decode_op_r(id_src2, decinfo.arch.instr.rt, true);
decode_op_r(id_dest, decinfo.arch.instr.rd, false);
}
make_DHelper(cmov) {
decode_op_r(id_src, decinfo.arch.instr.rs, true);
decode_op_r(id_src2, decinfo.arch.instr.rt, true);
decode_op_r(id_dest, decinfo.arch.instr.rd, true);
}
......@@ -2,10 +2,15 @@
make_EHelper(lui);
make_EHelper(add);
make_EHelper(sub);
make_EHelper(slt);
make_EHelper(sltu);
make_EHelper(or);
make_EHelper(xor);
make_EHelper(sll);
make_EHelper(srl);
make_EHelper(sra);
make_EHelper(movn);
make_EHelper(load);
make_EHelper(store);
......@@ -13,8 +18,10 @@ make_EHelper(store);
make_EHelper(j);
make_EHelper(jal);
make_EHelper(jr);
make_EHelper(jalr);
make_EHelper(bne);
make_EHelper(beq);
make_EHelper(blez);
make_EHelper(inv);
make_EHelper(nemu_trap);
......@@ -14,6 +14,20 @@ make_EHelper(add) {
print_asm_template3(add);
}
make_EHelper(sub) {
rtl_sub(&t0, &id_src->val, &id_src2->val);
rtl_sr(id_dest->reg, &t0, 4);
print_asm_template3(sub);
}
make_EHelper(slt) {
rtl_setrelop(RELOP_LT, &t0, &id_src->val, &id_src2->val);
rtl_sr(id_dest->reg, &t0, 4);
print_asm_template3(slt);
}
make_EHelper(sltu) {
rtl_setrelop(RELOP_LTU, &t0, &id_src->val, &id_src2->val);
rtl_sr(id_dest->reg, &t0, 4);
......@@ -36,8 +50,29 @@ make_EHelper(xor) {
}
make_EHelper(sll) {
rtl_shl(&t0, &id_src->val, &id_src2->val);
rtl_shl(&t0, &id_src2->val, &id_src->val);
rtl_sr(id_dest->reg, &t0, 4);
print_asm_template3(sll);
}
make_EHelper(srl) {
rtl_shr(&t0, &id_src2->val, &id_src->val);
rtl_sr(id_dest->reg, &t0, 4);
print_asm_template3(srl);
}
make_EHelper(sra) {
rtl_sar(&t0, &id_src2->val, &id_src->val);
rtl_sr(id_dest->reg, &t0, 4);
print_asm_template3(sra);
}
make_EHelper(movn) {
rtl_mux(&t1, &id_src2->val, &id_src->val, &id_dest->val);
rtl_sr(id_dest->reg, &t1, 4);
print_asm_template3(movn);
}
......@@ -20,6 +20,14 @@ make_EHelper(jr) {
print_asm_template1(jr);
}
make_EHelper(jalr) {
rtl_addi(&t0, &cpu.pc, 8);
rtl_sr(id_dest->reg, &t0, 4);
rtl_jr(&id_src->val);
print_asm_template1(jalr);
}
make_EHelper(bne) {
rtl_jrelop(RELOP_NE, &id_src->val, &id_src2->val, decinfo.jmp_pc);
......@@ -31,3 +39,9 @@ make_EHelper(beq) {
print_asm_template3(beq);
}
make_EHelper(blez) {
rtl_jrelop(RELOP_LE, &id_src->val, &id_src2->val, decinfo.jmp_pc);
print_asm_template3(blez);
}
......@@ -2,12 +2,12 @@
#include "all-instr.h"
static OpcodeEntry special_table [64] = {
/* b000 */ IDEX(shift, sll), EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
/* b001 */ IDEX(R, jr), EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
/* b000 */ IDEX(shift, sll), EMPTY, IDEX(shift, srl), EMPTY, EMPTY, EMPTY, IDEX(R, srl), IDEX(R, sra),
/* b001 */ IDEX(R, jr), IDEX(R, jalr), EMPTY, IDEX(cmov, movn), EMPTY, EMPTY, EMPTY, EMPTY,
/* b010 */ EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
/* b011 */ EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
/* b100 */ EMPTY, IDEX(R, add), EMPTY, EMPTY, EMPTY, IDEX(R, or), EMPTY, EMPTY,
/* b101 */ EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
/* b100 */ EMPTY, IDEX(R, add), EMPTY, IDEX(R, sub), EMPTY, IDEX(R, or), IDEX(R, xor), EMPTY,
/* b101 */ EMPTY, EMPTY, IDEX(R, slt), IDEX(R, sltu), EMPTY, EMPTY, EMPTY, EMPTY,
/* b110 */ EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
/* b111 */ EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
};
......@@ -17,8 +17,8 @@ static make_EHelper(special) {
}
static OpcodeEntry opcode_table [64] = {
/* b000 */ EX(special), EMPTY, IDEX(J, j), IDEX(J, jal), IDEX(B, beq), IDEX(B, bne), EMPTY, EMPTY,
/* b001 */ EMPTY, IDEX(I, add), EMPTY, IDEX(I, sltu), EMPTY, EMPTY, IDEX(I, xor), IDEX(I, lui),
/* b000 */ EX(special), EMPTY, IDEX(J, j), IDEX(J, jal), IDEX(B, beq), IDEX(B, bne), IDEX(B, blez), EMPTY,
/* b001 */ EMPTY, IDEX(I, add), IDEX(I, slt), IDEX(I, sltu), EMPTY, EMPTY, IDEX(I, xor), IDEX(I, lui),
/* b010 */ EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
/* b011 */ EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
/* b100 */ EMPTY, EMPTY, EMPTY, IDEX(I, load), EMPTY, EMPTY, EMPTY, EMPTY,
......
......@@ -34,5 +34,6 @@ make_DHelper(R);
make_DHelper(B);
make_DHelper(store);
make_DHelper(shift);
make_DHelper(cmov);
#endif
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册