提交 7f83b501 编写于 作者: P Parallels

Pass qemu diff-test, improve code style

上级 495c2d73
......@@ -2,7 +2,7 @@
#define __COMMON_H__
#define DEBUG
//#define DIFF_TEST
#define DIFF_TEST
#define ISA64
......
......@@ -100,9 +100,7 @@ make_EHelper(lui) {
make_EHelper(addw) {
rtl_add(&s0, &id_src->val, &id_src2->val);
rtl_li(&s1, 32);
rtl_shl(&s0, &s0, &s1);
rtl_sar64(&s0, &s0, &s1);
rtl_sext(&s0, &s0, 4);
rtl_sr(id_dest->reg, &s0, 4);
print_asm_template3(addw);
......@@ -110,9 +108,7 @@ make_EHelper(addw) {
make_EHelper(subw) {
rtl_sub(&s0, &id_src->val, &id_src2->val);
rtl_li(&s1, 32);
rtl_shl(&s0, &s0, &s1);
rtl_sar64(&s0, &s0, &s1);
rtl_sext(&s0, &s0, 4);
rtl_sr(id_dest->reg, &s0, 4);
print_asm_template3(subw);
......@@ -121,9 +117,7 @@ make_EHelper(subw) {
make_EHelper(sllw) {
rtl_andi(&id_src2->val, &id_src2->val, 0x1f);
rtl_shl(&s0, &id_src->val, &id_src2->val);
rtl_li(&s1, 32);
rtl_shl(&s0, &s0, &s1);
rtl_sar64(&s0, &s0, &s1);
rtl_sext(&s0, &s0, 4);
rtl_sr(id_dest->reg, &s0, 4);
print_asm_template3(sllw);
......@@ -133,9 +127,7 @@ make_EHelper(srlw) {
if (decinfo.isa.instr.funct7 == 32) {
// sraw
rtl_sar(&s0, &id_src->val, &id_src2->val);
rtl_li(&s1, 32);
rtl_shl(&s0, &s0, &s1);
rtl_sar64(&s0, &s0, &s1);
rtl_sext(&s0, &s0, 4);
print_asm_template3(sraw);
}
else {
......@@ -143,9 +135,7 @@ make_EHelper(srlw) {
rtl_andi(&id_src2->val, &id_src2->val, 0x1f);
rtl_shr64(&s0, &id_src->val, &id_src2->val);
rtl_li(&s1, 32);
rtl_shl(&s0, &s0, &s1);
rtl_sar64(&s0, &s0, &s1);
rtl_sext(&s0, &s0, 4);
print_asm_template3(srlw);
}
......
......@@ -5,9 +5,7 @@ make_EHelper(ld) {
#ifdef ISA64
if (decinfo.width == 4) { // for lw
rtl_li(&s1, 32);
rtl_shl(&s0, &s0, &s1);
rtl_sar64(&s0, &s0, &s1);
rtl_sext(&s0, &s0, 4);
}
#endif
......
......@@ -55,9 +55,7 @@ make_EHelper(remu) {
make_EHelper(mulw) {
rtl_imul_lo(&s0, &id_src->val, &id_src2->val);
rtl_li(&s1, 32);
rtl_shl(&s0, &s0, &s1);
rtl_sar64(&s0, &s0, &s1);
rtl_sext(&s0, &s0, 4);
rtl_sr(id_dest->reg, &s0, 4);
print_asm_template3(mulw);
......@@ -65,9 +63,7 @@ make_EHelper(mulw) {
make_EHelper(divw) {
rtl_idiv_q64(&s0, &id_src->val, &id_src2->val);
rtl_li(&s1, 32);
rtl_shl(&s0, &s0, &s1);
rtl_sar64(&s0, &s0, &s1);
rtl_sext(&s0, &s0, 4);
rtl_sr(id_dest->reg, &s0, 4);
print_asm_template3(div);
......@@ -75,9 +71,7 @@ make_EHelper(divw) {
make_EHelper(remw) {
rtl_idiv_r64(&s0, &id_src->val, &id_src2->val);
rtl_li(&s1, 32);
rtl_shl(&s0, &s0, &s1);
rtl_sar64(&s0, &s0, &s1);
rtl_sext(&s0, &s0, 4);
rtl_sr(id_dest->reg, &s0, 4);
print_asm_template3(remw);
......@@ -85,9 +79,7 @@ make_EHelper(remw) {
make_EHelper(divuw) {
rtl_div_q64(&s0, &id_src->val, &id_src2->val);
rtl_li(&s1, 32);
rtl_shl(&s0, &s0, &s1);
rtl_sar64(&s0, &s0, &s1);
rtl_sext(&s0, &s0, 4);
rtl_sr(id_dest->reg, &s0, 4);
print_asm_template3(divuw);
......@@ -95,9 +87,7 @@ make_EHelper(divuw) {
make_EHelper(remuw) {
rtl_idiv_r64(&s0, &id_src->val, &id_src2->val);
rtl_li(&s1, 32);
rtl_shl(&s0, &s0, &s1);
rtl_sar64(&s0, &s0, &s1);
rtl_sext(&s0, &s0, 4);
rtl_sr(id_dest->reg, &s0, 4);
print_asm_template3(remuw);
......
......@@ -67,6 +67,7 @@ void init_difftest(char *ref_so_file, long img_size) {
"If it is not necessary, you can turn it off in include/common.h.", ref_so_file);
ref_difftest_init();
Log("Init done\n");
ref_difftest_memcpy_from_dut(PC_START, guest_to_host(IMAGE_START), img_size);
ref_difftest_setregs(&cpu);
}
......
......@@ -31,7 +31,9 @@ void difftest_setregs(const void *r) {
}
void difftest_exec(uint64_t n) {
while (n --) gdb_si();
while (n --) {
gdb_si();
}
}
void difftest_init(void) {
......
......@@ -90,6 +90,7 @@ bool gdb_setregs(union isa_gdb_regs *r) {
}
bool gdb_si(void) {
char buf[] = "vCont;s:1";
gdb_send(conn, (const uint8_t *)buf, strlen(buf));
size_t size;
......
......@@ -8,11 +8,11 @@
union isa_gdb_regs {
struct {
uint64_t gpr[32];
uint64_t pc;
uint32_t gpr[32];
uint32_t pc;
};
struct {
uint64_t array[77];
uint32_t array[77];
};
};
......
......@@ -35,17 +35,30 @@ static uint32_t initcode[] = {
void init_isa(void) {
// put initcode to QEMU to setup a PMP to permit access to all of memory in S mode
bool ok = gdb_memcpy_to_qemu(0x0000000080000000, initcode, sizeof(initcode));
bool ok = gdb_memcpy_to_qemu(0x80000000, initcode, sizeof(initcode));
assert(ok == 1);
union isa_gdb_regs r;
gdb_getregs(&r);
r.pc = 0x0000000080000000;
r.pc = 0x80000000;
ok = gdb_setregs(&r);
assert(ok == 1);
gdb_getregs(&r);
/*
int i;
printf("print regs:\n");
for (i = 0; i < 32; i++) {
printf("0x%x\n", r.gpr[i]);
}
printf("0x%x\nend print\n", r.pc);
fflush(stdout);*/
// execute enough instructions
difftest_exec(20);
difftest_exec(19);
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册