函数调用正常
This commit is contained in:
104
cpu/riscv.c
104
cpu/riscv.c
@@ -145,16 +145,10 @@ void ins_add(riscv_t* riscv, int rs2, int rs1, int rd) {
|
||||
}
|
||||
|
||||
void ins_addi(riscv_t* riscv, int rs1, int imm, int rd) {
|
||||
if (imm & (1 << 11)) {
|
||||
imm |= 0xfffff800;
|
||||
}
|
||||
riscv->reg[rd] = riscv->reg[rs1] + imm;
|
||||
riscv->reg[rd] = (int)riscv->reg[rs1] + imm;
|
||||
}
|
||||
|
||||
void ins_addiw(riscv_t* riscv, int rs1, int imm, int rd) {
|
||||
if (imm & (1 << 11)) {
|
||||
imm |= 0xfffff800;
|
||||
}
|
||||
riscv->reg[rd] = riscv->reg[rs1] + imm;
|
||||
}
|
||||
|
||||
@@ -167,9 +161,6 @@ void ins_and(riscv_t* riscv, int rs2, int rs1, int rd) {
|
||||
}
|
||||
|
||||
void ins_andi(riscv_t* riscv, int rs1, int imm, int rd) {
|
||||
if (imm & (1 << 11)) {
|
||||
imm |= 0xfffff800;
|
||||
}
|
||||
riscv->reg[rd] = riscv->reg[rs1] & imm;
|
||||
}
|
||||
|
||||
@@ -273,31 +264,37 @@ void ins_jalr(riscv_t* riscv, int rs1, int imm, int rd) {
|
||||
|
||||
void ins_lb(riscv_t* riscv, int rs1, int imm, int rd) {
|
||||
uint32_t addr = riscv->reg[rs1] + imm;
|
||||
printf("lb %08x,imm=%d\n",addr,imm);
|
||||
riscv->reg[rd] = (int)mem_wrb(addr);
|
||||
}
|
||||
|
||||
void ins_lbu(riscv_t* riscv, int rs1, int imm, int rd) {
|
||||
uint32_t addr = riscv->reg[rs1] + imm;
|
||||
printf("lbu %08x,imm=%d\n",addr,imm);
|
||||
riscv->reg[rd] = mem_wrb(addr);
|
||||
}
|
||||
|
||||
void ins_lh(riscv_t* riscv, int rs1, int imm, int rd) {
|
||||
uint32_t addr = riscv->reg[rs1] + imm;
|
||||
printf("lh %08x,imm=%d\n",addr,imm);
|
||||
riscv->reg[rd] = (int)mem_wrh(addr);
|
||||
}
|
||||
|
||||
void ins_lhu(riscv_t* riscv, int rs1, int imm, int rd) {
|
||||
uint32_t addr = riscv->reg[rs1] + imm;
|
||||
printf("lhu %08x,imm=%d\n",addr,imm);
|
||||
riscv->reg[rd] = mem_wrh(addr);
|
||||
}
|
||||
|
||||
void ins_lw(riscv_t* riscv, int rs1, int imm, int rd) {
|
||||
uint32_t addr = riscv->reg[rs1] + imm;
|
||||
printf("lw %08x,imm=%d\n",addr,imm);
|
||||
riscv->reg[rd] = mem_wr(addr);
|
||||
}
|
||||
|
||||
void ins_lwu(riscv_t* riscv, int rs1, int imm, int rd) {
|
||||
uint32_t addr = riscv->reg[rs1] + imm;
|
||||
printf("lwu %08x,imm=%d\n",addr,imm);
|
||||
riscv->reg[rd] = mem_wr(addr);
|
||||
}
|
||||
|
||||
@@ -315,24 +312,24 @@ void ins_or(riscv_t* riscv, int rs2, int rs1, int rd) {
|
||||
}
|
||||
|
||||
void ins_ori(riscv_t* riscv, int rs1, int imm, int rd) {
|
||||
if (imm & (1 << 11)) {
|
||||
imm |= 0xfffff800;
|
||||
}
|
||||
riscv->reg[rd] = riscv->reg[rs1] | imm;
|
||||
}
|
||||
|
||||
void ins_sb(riscv_t* riscv, int rs2, int rs1, int imm) {
|
||||
uint32_t addr = riscv->reg[rs1] + imm;
|
||||
printf("sb %08x,imm=%d\n",addr,imm);
|
||||
mem_wrb(addr) = riscv->reg[rs2];
|
||||
}
|
||||
|
||||
void ins_sh(riscv_t* riscv, int rs2, int rs1, int imm) {
|
||||
uint32_t addr = riscv->reg[rs1] + imm;
|
||||
printf("sh %08x,imm=%d\n",addr,imm);
|
||||
mem_wrh(addr) = riscv->reg[rs2];
|
||||
}
|
||||
|
||||
void ins_sw(riscv_t* riscv, int rs2, int rs1, int imm) {
|
||||
uint32_t addr = riscv->reg[rs1] + imm;
|
||||
printf("sw %08x,imm=%d\n",addr,imm);
|
||||
mem_wr(addr) = riscv->reg[rs2];
|
||||
}
|
||||
|
||||
@@ -357,16 +354,10 @@ void ins_slt(riscv_t* riscv, int rs2, int rs1, int rd) {
|
||||
}
|
||||
|
||||
void ins_slti(riscv_t* riscv, int rs1, int imm, int rd) {
|
||||
if (imm & (1 << 11)) {
|
||||
imm |= 0xfffff800;
|
||||
}
|
||||
riscv->reg[rd] = (int)riscv->reg[rs1] < imm;
|
||||
}
|
||||
|
||||
void ins_sltiu(riscv_t* riscv, int rs1, int imm, int rd) {
|
||||
if (imm & (1 << 11)) {
|
||||
imm |= 0xfffff800;
|
||||
}
|
||||
riscv->reg[rd] = riscv->reg[rs1] < (uint32_t)imm;
|
||||
}
|
||||
|
||||
@@ -423,38 +414,51 @@ void ins_xor(riscv_t* riscv, int rs2, int rs1, int rd) {
|
||||
}
|
||||
|
||||
void ins_xori(riscv_t* riscv, int rs1, int imm, int rd) {
|
||||
if (imm & (1 << 11)) {
|
||||
imm |= 0xfffff800;
|
||||
}
|
||||
riscv->reg[rd] = riscv->reg[rs1] ^ imm;
|
||||
}
|
||||
|
||||
|
||||
// 不需要做符号扩展
|
||||
#define imm_u_type(_ins,_imm) {\
|
||||
_imm = (_ins >> 12) << 12;\
|
||||
}
|
||||
|
||||
// 20位符号扩展
|
||||
#define imm_j_type(_ins,_imm) {\
|
||||
_imm = ((_ins >> 21) & 0x3ff) << 1;\
|
||||
_imm |= ((_ins >> 20) & 1) << 11;\
|
||||
_imm |= ((_ins >> 12) & 0xff) << 12;\
|
||||
_imm |= ((_ins >> 31) & 1) << 20;\
|
||||
if(_imm&(1<<20)){\
|
||||
_imm|=0xfff00000;\
|
||||
}\
|
||||
}
|
||||
|
||||
// 12位符号扩展
|
||||
#define imm_i_type(_ins,_imm) {\
|
||||
_imm = (_ins >> 20) & 0xfff;\
|
||||
if(_imm&(1<<11)){\
|
||||
_imm|=0xfffff000;\
|
||||
}\
|
||||
}
|
||||
|
||||
// 13位符号扩展
|
||||
#define imm_b_type(_ins,_imm) {\
|
||||
_imm = ((_ins >> 31) & 1) << 12;\
|
||||
_imm |= ((_ins >> 7) & 0x1) << 11;\
|
||||
_imm |= ((_ins >> 8) & 0xf) << 1;\
|
||||
_imm |= ((_ins >> 25) & 0x1f) << 5;\
|
||||
if(_imm&(1<<12)){\
|
||||
_imm|=0xfffff000;\
|
||||
}\
|
||||
}
|
||||
|
||||
// 12位符号扩展
|
||||
#define imm_s_type(_ins,_imm) {\
|
||||
_imm = ((_ins >> 7) & 0x1f);\
|
||||
_imm |= (_ins >> 25) << 5;\
|
||||
if(_imm&(1<<11)){\
|
||||
_imm|=0xfffff000;\
|
||||
}\
|
||||
}
|
||||
|
||||
#define imm_csr(_ins,_imm) {\
|
||||
@@ -516,7 +520,7 @@ int riscv_decode(riscv_t* riscv, uint32_t ins) {
|
||||
}
|
||||
break;
|
||||
case opcode_lb:
|
||||
imm_i_type(imm, ins);
|
||||
imm_i_type(ins, imm);
|
||||
switch (funct3)
|
||||
{
|
||||
case 0x0:
|
||||
@@ -539,6 +543,7 @@ int riscv_decode(riscv_t* riscv, uint32_t ins) {
|
||||
}
|
||||
break;
|
||||
case opcode_sb:
|
||||
imm_s_type(ins, imm);
|
||||
switch (funct3) {
|
||||
case 0x0:
|
||||
ins_sb(riscv, rs2, rs1, imm);
|
||||
@@ -674,20 +679,59 @@ int riscv_init(riscv_t* riscv, uint32_t* rom, uint32_t rom_addr_base, uint32_t r
|
||||
}
|
||||
|
||||
|
||||
int riscv_print(riscv_t* riscv) {
|
||||
printf("x0(zero): %08x\n", riscv->zero);
|
||||
printf("x1(ra): %08x\n", riscv->ra);
|
||||
printf("x2(sp): %08x\n", riscv->sp);
|
||||
printf("x3(gp): %08x\n", riscv->gp);
|
||||
printf("x4(tp): %08x\n", riscv->tp);
|
||||
printf("x5(t0): %08x\n", riscv->t0);
|
||||
printf("x6(t1): %08x\n", riscv->t1);
|
||||
printf("x7(t2): %08x\n", riscv->t2);
|
||||
printf("x8(fp): %08x\n", riscv->fp);
|
||||
printf("x9(s0): %08x\n", riscv->s0);
|
||||
printf("x10(s1): %08x\n", riscv->s1);
|
||||
printf("x11(a0): %08x\n", riscv->a0);
|
||||
printf("x12(a1): %08x\n", riscv->a1);
|
||||
printf("x13(a2): %08x\n", riscv->a2);
|
||||
printf("x14(a3): %08x\n", riscv->a3);
|
||||
printf("x15(a4): %08x\n", riscv->a4);
|
||||
printf("x16(a5): %08x\n", riscv->a5);
|
||||
printf("x17(a6): %08x\n", riscv->a6);
|
||||
printf("x18(s2): %08x\n", riscv->s2);
|
||||
printf("x19(s3): %08x\n", riscv->s3);
|
||||
printf("x20(s4): %08x\n", riscv->s4);
|
||||
printf("x21(s5): %08x\n", riscv->s5);
|
||||
printf("x22(s6): %08x\n", riscv->s6);
|
||||
printf("x23(s7): %08x\n", riscv->s7);
|
||||
printf("x24(s8): %08x\n", riscv->s8);
|
||||
printf("x25(s9): %08x\n", riscv->s9);
|
||||
printf("x26(s10): %08x\n", riscv->s10);
|
||||
printf("x27(s11): %08x\n", riscv->s11);
|
||||
printf("x28(t3): %08x\n", riscv->t3);
|
||||
printf("x29(t4): %08x\n", riscv->t4);
|
||||
printf("x30(t5): %08x\n", riscv->t5);
|
||||
printf("x31(t6): %08x\n", riscv->t6);
|
||||
}
|
||||
|
||||
int riscv_run(riscv_t* riscv) {
|
||||
int ret = 0;
|
||||
uint32_t pc;
|
||||
while (1) {
|
||||
uint32_t instr = riscv->rom[(riscv->pc-riscv->rom_addr_base) >> 2];
|
||||
printf("pc: %08x instr: %08x\n", riscv->pc, instr);
|
||||
riscv->pc += 4;
|
||||
if(riscv->pc >= riscv->rom_addr_base + riscv->rom_size){
|
||||
if(riscv->pc >= riscv->rom_addr_base + riscv->rom_size || riscv->pc < riscv->rom_addr_base){
|
||||
printf("riscv run out of rom\n");
|
||||
break;
|
||||
}
|
||||
uint32_t instr = riscv->rom[(riscv->pc-riscv->rom_addr_base) >> 2];
|
||||
printf("pc: %08x instr: %08x\n", riscv->pc, instr);
|
||||
pc = riscv->pc;
|
||||
ret = riscv_decode(riscv, instr);
|
||||
for (int i = 0;i < 32;i++) {
|
||||
printf("reg[%d]: %08x\n", i, riscv->reg[i]);
|
||||
riscv->zero = 0;
|
||||
// 如果指令修改了pc,则以修改后的为准,如果pc未被修改,则继续执行下一条指令
|
||||
if (riscv->pc == pc) {
|
||||
riscv->pc += 4;
|
||||
}
|
||||
riscv_print(riscv);
|
||||
if(ret){
|
||||
break;
|
||||
}
|
||||
|
@@ -22,7 +22,7 @@ CFLAG=[
|
||||
"-Wall",
|
||||
"-Werror",
|
||||
"-g",
|
||||
"-Os",
|
||||
"-O0",
|
||||
"-fno-omit-frame-pointer",
|
||||
"-msave-restore"
|
||||
]
|
||||
|
@@ -1,10 +1,13 @@
|
||||
|
||||
|
||||
int add(int a, int b) {
|
||||
return a+b;
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
int a=1;
|
||||
int b=2;
|
||||
int c=a+b;
|
||||
int c = add(a, b);
|
||||
return c;
|
||||
}
|
@@ -3,6 +3,8 @@
|
||||
.globl _start
|
||||
.type _start,@function
|
||||
|
||||
.extern main
|
||||
_start:
|
||||
|
||||
la sp, _sp
|
||||
j main
|
Reference in New Issue
Block a user