📄 rf.c
字号:
ErrorEPC=pc_address_dp;
EPC=pc_address_dp;
CPR[30]=pc_address_dp;
CPR[14]=pc_address_dp;
}
}else if(instruction_type_dp==16){
// cp0 instrction
//printf("cp0 instrction\n");
if((cp0_instr_num_dp>=0)&&(cp0_instr_num_dp<16)){
switch(cp0_instr_num_dp)
{case 0 : //printf(" mfc0 \n");
if((rd==16)&&(sel==1)){
opa_dp=(result_regnum_ep==432)? result_first_ep : ((result_regnum_mp==432)? result_first_mp : ((result_regnum_wp==432)? result_first_wp : CPR[32]));
//opa_dp=CPR[32];
}else if((rd==28)&&(sel==1)){
opa_dp=(result_regnum_ep==433)? result_first_ep : ((result_regnum_mp==433)? result_first_mp : ((result_regnum_wp==433)? result_first_wp : CPR[33]));
//opa_dp=CPR[33];
}else{
opa_dp=(result_regnum_ep==(400+rd))? result_first_ep : ((result_regnum_mp==(400+rd))? result_first_mp : ((result_regnum_wp==(400+rd))? result_first_wp : CPR[rd]));
// opa_dp=CPR[rd];
}
opb_dp=0;
result_regnum_dp=rt;
write_trace_flag_dp=1;
jump_flag=0;
branch_address_offset_dp=0;
jump_address=0;
load_store_flag_dp=0;
load_store_byte_select_dp=0x000f;
break;
case 4 : //printf(" mtc0 \n");
opa_dp=(result_regnum_ep==rt)? result_first_ep : ((result_regnum_mp==rt)? result_first_mp : ((result_regnum_wp==rt)? result_first_wp : GPR[rt]));
// opa_dp=GPR[rd];
opb_dp=sel;
if((rd==16)&&(sel==1)){
result_regnum_dp=432;
}else if((rd==28)&&(sel==1)){
result_regnum_dp=433;
}else{
result_regnum_dp=rd+400;
}
write_trace_flag_dp=1;
jump_flag=0;
branch_address_offset_dp=0;
jump_address=0;
load_store_flag_dp=0;
load_store_byte_select_dp=0x000f;
break;
default : printf("cp0 (normal) instruction error!\n");
exception_flag_dp=18;
ErrorEPC=pc_address_dp;
EPC=pc_address_dp;
CPR[30]=pc_address_dp;
CPR[14]=pc_address_dp;
}
}else if((cp0_instr_num_dp>=16)&&(cp0_instr_num_dp<32)){
switch(cp0_co_instr_num_dp)
{case 1 : //printf(" tlbr \n");
// opa_dp=(result_regnum_ep==400)? result_first_ep : ((result_regnum_mp==400)? result_first_mp : ((result_regnum_wp==400)? result_first_wp : CPR[0]));
opa_dp=0;
opb_dp=0;
result_regnum_dp=500;
write_trace_flag_dp=1;
jump_flag=0;
branch_address_offset_dp=offset;
jump_address=0;
load_store_flag_dp=0;
load_store_byte_select_dp=0x000f;
ip_stop=5;
dp_stop=5;
break;
case 2 : //printf(" tlbwi \n");
opa_dp=0;
opb_dp=0;
result_regnum_dp=500;
write_trace_flag_dp=1;
jump_flag=0;
branch_address_offset_dp=offset;
jump_address=0;
load_store_flag_dp=0;
load_store_byte_select_dp=0x000f;
ip_stop=5;
dp_stop=5;
break;
case 6 : //printf(" tlbwr \n");
opa_dp=0;
opb_dp=0;
result_regnum_dp=500;
write_trace_flag_dp=1;
jump_flag=0;
branch_address_offset_dp=offset;
jump_address=0;
load_store_flag_dp=0;
load_store_byte_select_dp=0x000f;
ip_stop=5;
dp_stop=5;
break;
case 8 : //printf(" tlbp \n");
// opa_dp=(result_regnum_ep==410)? result_first_ep : ((result_regnum_mp==410)? result_first_mp : ((result_regnum_wp==410)? result_first_wp : CPR[10]));
opa_dp=0;
opb_dp=0;
result_regnum_dp=500;
write_trace_flag_dp=1;
jump_flag=0;
branch_address_offset_dp=offset;
jump_address=0;
load_store_flag_dp=0;
load_store_byte_select_dp=0x000f;
ip_stop=5;
dp_stop=5;
break;
case 24 : //printf(" eret \n");
opa_dp=0;
opb_dp=0;
result_regnum_dp=0;
write_trace_flag_dp=0;
jump_flag=0;
branch_address_offset_dp=0;
jump_address=0;
load_store_flag_dp=0;
exception_flag_dp=31;
load_store_byte_select_dp=0x0000;
ip_stop=0;
dp_stop=0;
break;
case 31 : //printf(" deret \n");
break;
case 32 : //printf(" wait \n");
break;
default : printf("regimm instruction error!\n");
exception_flag_dp=18;
ErrorEPC=pc_address_dp;
EPC=pc_address_dp;
CPR[30]=pc_address_dp;
CPR[14]=pc_address_dp;
}
}else{
printf("cp0 instruction error!\n");
}
}else if(instruction_type_dp==28){
// special2 instrction
//printf("special2 instrction\n");
switch(special2_instr_num_dp)
{case 0 : //printf(" madd \n");
opa_dp=(result_regnum_ep==rs)? result_first_ep : ((result_regnum_mp==rs)? result_first_mp : ((result_regnum_wp==rs)? result_first_wp : GPR[rs]));
opb_dp=(result_regnum_ep==rt)? result_first_ep : ((result_regnum_mp==rt)? result_first_mp : ((result_regnum_wp==rt)? result_first_wp : GPR[rt]));
result_regnum_dp=300;
write_trace_flag_dp=1;
jump_flag=0;
branch_address_offset_dp=0;
jump_address=0;
load_store_flag_dp=0;
load_store_byte_select_dp=0x000f;
ip_stop=1;
dp_stop=1;
break;
case 1 : //printf(" maddu \n");
opa_dp=(result_regnum_ep==rs)? result_first_ep : ((result_regnum_mp==rs)? result_first_mp : ((result_regnum_wp==rs)? result_first_wp : GPR[rs]));
opb_dp=(result_regnum_ep==rt)? result_first_ep : ((result_regnum_mp==rt)? result_first_mp : ((result_regnum_wp==rt)? result_first_wp : GPR[rt]));
result_regnum_dp=300;
write_trace_flag_dp=1;
jump_flag=0;
branch_address_offset_dp=0;
jump_address=0;
load_store_flag_dp=0;
load_store_byte_select_dp=0x000f;
ip_stop=1;
dp_stop=1;
break;
case 2 : //printf(" mul \n");
opa_dp=(result_regnum_ep==rs)? result_first_ep : ((result_regnum_mp==rs)? result_first_mp : ((result_regnum_wp==rs)? result_first_wp : GPR[rs]));
opb_dp=(result_regnum_ep==rt)? result_first_ep : ((result_regnum_mp==rt)? result_first_mp : ((result_regnum_wp==rt)? result_first_wp : GPR[rt]));
result_regnum_dp=rd;
write_trace_flag_dp=1;
jump_flag=0;
branch_address_offset_dp=0;
jump_address=0;
load_store_flag_dp=0;
load_store_byte_select_dp=0x000f;
ip_stop=1;
dp_stop=1;
break;
case 4 : //printf(" msub \n");
opa_dp=(result_regnum_ep==rs)? result_first_ep : ((result_regnum_mp==rs)? result_first_mp : ((result_regnum_wp==rs)? result_first_wp : GPR[rs]));
opb_dp=(result_regnum_ep==rt)? result_first_ep : ((result_regnum_mp==rt)? result_first_mp : ((result_regnum_wp==rt)? result_first_wp : GPR[rt]));
result_regnum_dp=300;
write_trace_flag_dp=1;
jump_flag=0;
branch_address_offset_dp=0;
jump_address=0;
load_store_flag_dp=0;
load_store_byte_select_dp=0x000f;
ip_stop=1;
dp_stop=1;
break;
case 5 : //printf(" msubu \n");
opa_dp=(result_regnum_ep==rs)? result_first_ep : ((result_regnum_mp==rs)? result_first_mp : ((result_regnum_wp==rs)? result_first_wp : GPR[rs]));
opb_dp=(result_regnum_ep==rt)? result_first_ep : ((result_regnum_mp==rt)? result_first_mp : ((result_regnum_wp==rt)? result_first_wp : GPR[rt]));
result_regnum_dp=300;
write_trace_flag_dp=1;
jump_flag=0;
branch_address_offset_dp=0;
jump_address=0;
load_store_flag_dp=0;
load_store_byte_select_dp=0x000f;
ip_stop=1;
dp_stop=1;
break;
case 32 : //printf(" clz \n");
opa_dp=(result_regnum_ep==rs)? result_first_ep : ((result_regnum_mp==rs)? result_first_mp : ((result_regnum_wp==rs)? result_first_wp : GPR[rs]));
opb_dp=0;
result_regnum_dp=rd;
write_trace_flag_dp=1;
jump_flag=0;
branch_address_offset_dp=0;
jump_address=0;
load_store_flag_dp=0;
load_store_byte_select_dp=0x000f;
break;
case 33 : //printf(" clo \n");
opa_dp=(result_regnum_ep==rs)? result_first_ep : ((result_regnum_mp==rs)? result_first_mp : ((result_regnum_wp==rs)? result_first_wp : GPR[rs]));
opb_dp=0;
result_regnum_dp=rd;
write_trace_flag_dp=1;
jump_flag=0;
branch_address_offset_dp=0;
jump_address=0;
load_store_flag_dp=0;
load_store_byte_select_dp=0x000f;
break;
case 63 : //printf(" sdbbp \n"); break; //目前不需要处理
default : printf("special2 instruction error!\n");
exception_flag_dp=18;
ErrorEPC=pc_address_dp;
EPC=pc_address_dp;
CPR[30]=pc_address_dp;
CPR[14]=pc_address_dp;
}
}else{
// normal instrction
//printf("normal instrction\n");
switch(normal_instr_num_dp)
{ case 2 : //printf(" j \n");
opa_dp=target;
opb_dp=0;
result_regnum_dp=0;
write_trace_flag_dp=0;
jump_flag=1;
branch_address_offset_dp=0;
jump_address=((pc_address_dp&(0xf0000000))|((opa_dp<<2)&(0x0fffffff)));
load_store_flag_dp=0;
load_store_byte_select_dp=0x0000;
#ifdef DEBUG
// printf("j instruction target=%08x,jump_address=%08x\n",target,jump_address);
#endif
break;
case 3 : //printf(" jal \n");
opa_dp=target;
opb_dp=0;
result_regnum_dp=31;
write_trace_flag_dp=1;
jump_flag=1;
branch_address_offset_dp=0;
jump_address=((pc_address_dp&(0xf0000000))|((opa_dp<<2)&(0x0fffffff)));
load_store_flag_dp=0;
load_store_byte_select_dp=0x000f;
#ifdef DEBUG
// printf("j instruction target=%08x,jump_address=%08x\n",target,jump_address);
#endif
break;
case 4 : //printf(" beq \n");
opa_dp=(result_regnum_ep==rs)? result_first_ep : ((result_regnum_mp==rs)? result_first_mp : ((result_regnum_wp==rs)? result_first_wp : GPR[rs]));
opb_dp=(result_regnum_ep==rt)? result_first_ep : ((result_regnum_mp==rt)? result_first_mp : ((result_regnum_wp==rt)? result_first_wp : GPR[rt]));
result_regnum_dp=0;
write_trace_flag_dp=0;
jump_flag=0;
branch_address_offset_dp=offset;
jump_address=0;
load_store_flag_dp=0;
load_store_byte_select_dp=0x0000;
#ifdef DEBUG
printf("result_first_ep=,%08x,result_first_mp=,%08x,result_first_wp=,%08x,GPR[rs]=%08x",result_first_ep,result_first_mp,result_first_wp,GPR[rs]);
printf("result_regnum_ep=,%08x,result_regnum_mp=,%08x,result_regnum_wp=,%08x,GPR[rt]=%08x",result_regnum_ep,result_regnum_mp,result_regnum_wp,GPR[rt]);
#endif
break;
case 5 : //printf(" bne \n");
opa_dp=(result_regnum_ep==rs)? result_first_ep : ((result_regnum_mp==rs)? result_first_mp : ((result_regnum_wp==rs)? result_first_wp : GPR[rs]));
opb_dp=(result_regnum_ep==rt)? result_first_ep : ((result_regnum_mp==rt)? result_first_mp : ((result_regnum_wp==rt)? result_first_wp : GPR[rt]));
result_regnum_dp=0;
write_trace_flag_dp=0;
jump_flag=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -