📄 rf.c
字号:
#include <stdio.h>
#include "cpu.h"
extern FILE *lf_fp_code,*reg_trace_fp,*pc_trace_fp,*sysad_trace_fp;
void write_back(){
/////////////////////////////Write Back//////////////////////////
void cp0_reg_write_bach(int cp0_reg_num,long cp0_reg_value);
// if(pc_wp >= 0){
// fprintf(pc_trace_fp,"0x%08x\t0x%08x\n",0xbfc00000+pc_wp*4,pc_address_wp);
//}
//if((pc_wp >= 0) && (nullify_flag_wp == 0) && (exception_invalid_instr_flag != 1)){
//
// fprintf(pc_trace_fp,"0x%08x\t0x%08x\n",0xbfc00000+pc_wp*4,pc_address_wp);
//
//}
if((pc_wp >= 0) && (nullify_flag_wp == 0)){
fprintf(pc_trace_fp,"0x%08x\n",pc_address_wp);
}
if((exception_invalid_instr_flag == 0)||(exception_invalid_instr_flag == 5)){
if(exception_invalid_instr_flag == 5){
exception_invalid_instr_flag=exception_invalid_instr_flag - 1;
}
if(load_store_flag_wp && (nullify_flag_op == 0)){
if(normal_instr_num_wp == 47){
//cache instruction
switch(opb_wp)
{case 0 : icache(opa_wp,2);
#ifdef DEBUG
printf("icache instruction\n");
#endif
break;
case 1 :dcache(opa_wp,0,0,2);
#ifdef DEBUG
printf("dcache instruction\n");
#endif
break;
case 16 :icache(opa_wp,3);
#ifdef DEBUG
printf("icache instruction\n");
#endif
break;
case 17 :dcache(opa_wp,0,0,3);
#ifdef DEBUG
printf("dcache instruction\n");
#endif
break;
default: printf("Find unexist cache function!\n");
}
}
}
if(write_trace_flag_wp && (nullify_flag_op == 0)){
printf("write back!\n");
if((result_regnum_wp>=0)&&(result_regnum_wp<32)&&(result_regnum_wp!=0)){
//printf("write back!!!!!!!!!!!!!!!!!!!!!!!!!\n");
switch(load_store_byte_select_wp){
case 1:result_first_wp=(result_first_wp>>24)&(0x000000ff);
GPR[result_regnum_wp]=(GPR[result_regnum_wp]&(0xffffff00))|(result_first_wp);
break;
case 3:result_first_wp=(result_first_wp>>16)&(0x0000ffff);
GPR[result_regnum_wp]=(GPR[result_regnum_wp]&(0xffff0000))|(result_first_wp);
break;
case 7:result_first_wp=(result_first_wp>>8)&(0x00ffffff);
GPR[result_regnum_wp]=(GPR[result_regnum_wp]&(0xff000000))|(result_first_wp);
break;
case 8:result_first_wp=(result_first_wp<<24)&(0xff000000);
GPR[result_regnum_wp]=(GPR[result_regnum_wp]&(0x00ffffff))|(result_first_wp);
break;
case 12:result_first_wp=(result_first_wp<<16)&(0xffff0000);
GPR[result_regnum_wp]=(GPR[result_regnum_wp]&(0x0000ffff))|(result_first_wp);
break;
case 14:result_first_wp=(result_first_wp<<8)&(0xffffff00);
GPR[result_regnum_wp]=(GPR[result_regnum_wp]&(0x000000ff))|(result_first_wp);
break;
case 15:GPR[result_regnum_wp]=result_first_wp;
break;
default: printf("write back to register error!\n");
}
//GPR[result_regnum_wp]=result_first_wp;
//fprintf(reg_trace_fp,"write back one time!\n");
printf("0x%08x\t%08x\t0x%08x\t0x%08x\n",pc_address_op,instruction_op,result_regnum_wp,GPR[result_regnum_wp]);
fprintf(reg_trace_fp,"0x%08x\t%08x\t0x%08x\t0x%08x\n",pc_address_op,instruction_op,result_regnum_wp,GPR[result_regnum_wp]);
// fprintf(pc_trace_fp,"0x%x\t0x%x\n",0xbfc00000+pc_wp*4,pc_address_wp);
}else if(result_regnum_wp==100){
HI=result_first_wp;
}else if(result_regnum_wp==200){
LO=result_first_wp;
}else if(result_regnum_wp==300){
HI=result_first_wp;
LO=result_second_wp;
}else if(((result_regnum_wp>=400)&&(result_regnum_wp<434))){
// CPR[result_regnum_wp-400]=result_first_wp;
//write back to cp0 register in cp0 module
cp0_reg_write_bach(result_regnum_wp,result_first_wp);
}else if(result_regnum_wp==500){
switch(cp0_co_instr_num_wp)
{case 1:Index=CPR[0];
mmu(1); //tlbr
CPR[10]=Entryhi;
CPR[2]=Entrylo0;
CPR[3]=Entrylo1;
CPR[5]=Pagemask;
break;
case 2: printf("cpr[10]=%08x\n",CPR[10]);
Entryhi=CPR[10];
Entrylo0=CPR[2];
Entrylo1=CPR[3];
Index=CPR[0];
Random=CPR[1];
mmu(2); //tlbwi
break;
case 6: Entryhi=CPR[10];
Entrylo0=CPR[2];
Entrylo1=CPR[3];
Index=CPR[0];
Random=CPR[1];
mmu(6); //tlbwr
break;
case 8: Entryhi=CPR[10];
mmu(8); //tlbp
CPR[0]=Index;
break;
case 24:printf("eret instruction!\n");
break;
default:printf("tlb instruction error in write back!\n");
}
}else{
#ifdef DEBUG
printf("result_regnum_wp=%d \n",result_regnum_wp);
#endif
printf("error! Write Back occur errors ");
}
write_trace_flag_wp=0;
}
/* if(load_store_flag_ep){
// printf("*********************************************************\n");
fprintf(sysad_trace_fp,"0x%x\t0x%08x\t0x%08x\n",pc_address_ep,opa_ep,opb_ep);
}*/
}else{
exception_invalid_instr_flag=exception_invalid_instr_flag-1;
}
//////////////////////////////////end///////////////////////////////
}
void decode_pre(){
/////////////////////////////////////Decode pre//////////////////////////////////////////
opa_wp=opa_mp;
opb_wp=opb_mp;
opa_mp=opa_ep;
opb_mp=opb_ep;
opa_ep=opa_dp;
opb_ep=opb_dp;
load_store_flag_wp=load_store_flag_mp;
load_store_flag_mp=load_store_flag_ep;
load_store_flag_ep=load_store_flag_dp;
result_regnum_wp=result_regnum_mp;
result_regnum_mp=result_regnum_ep;
result_regnum_ep=result_regnum_dp;
write_trace_flag_wp=write_trace_flag_mp;
write_trace_flag_mp=write_trace_flag_ep;
write_trace_flag_ep=write_trace_flag_dp;
instruction_type_ep=instruction_type_dp;
normal_instr_num_wp=normal_instr_num_mp;
normal_instr_num_mp=normal_instr_num_ep;
normal_instr_num_ep=normal_instr_num_dp;
special_instr_num_ep=special_instr_num_dp;
special2_instr_num_ep=special2_instr_num_dp;
cp0_co_instr_num_wp=cp0_co_instr_num_mp;
cp0_co_instr_num_mp=cp0_co_instr_num_ep;
cp0_co_instr_num_ep=cp0_co_instr_num_dp;
regimm_instr_num_ep=regimm_instr_num_dp;
cp0_instr_num_ep=cp0_instr_num_dp;
load_store_byte_select_wp=load_store_byte_select_mp;
load_store_byte_select_mp=load_store_byte_select_ep;
load_store_byte_select_ep=load_store_byte_select_dp;
// nullify_flag_ep=nullify_flag_ep;
branch_address_offset_ep=branch_address_offset_dp;
/////////////////////////////////////////////////////////////////////////////////////////
}
void instruction_decode(){
////////////////////////////Decode instruction////////////////////
opcode=((instruction_dp>>26)&(0x0000003f));
special_opcode=((instruction_dp)&(0x0000003f));
special2_opcode=((instruction_dp)&(0x0000003f));
cp0_co_opcode=((instruction_dp)&(0x0000003f));
regimm_opcode=((instruction_dp>>16)&(0x0000001f));
cp0_opcode=((instruction_dp>>21)&(0x0000001f));
rt_opcode=((instruction_dp>>16)&(0x0000001f));
rs_opcode=((instruction_dp>>21)&(0x0000001f));
rd_opcode=((instruction_dp>>11)&(0x0000001f));
sa_opcode=((instruction_dp>>6)&(0x0000001f));
base_opcode=((instruction_dp>>21)&(0x0000001f));
op_opcode=((instruction_dp>>16)&(0x0000001f));
immediate_opcode=(((instruction_dp>>15)&(0x00000001)) == 1)? (long)(instruction_dp|(0xffff0000)) : (instruction_dp)&(0x0000ffff);
offset_opcode=(((instruction_dp>>15)&(0x00000001)) == 1)? (long)(instruction_dp|(0xffff0000)) : (instruction_dp)&(0x0000ffff);
target_opcode=(instruction_dp)&(0x03ffffff);
sel_opcode=instruction_dp&(0x00000003);
/* for(i=0;i<6;i++){
opcode[i]=instruction_dp[i];
special_opcode[i]=instruction_dp[i+26];
special2_opcode[i]=instruction_dp[i+26];
cp0_co_opcode[i]=instruction_dp[i+26];
}
for(i=0;i<5;i++){
regimm_opcode[i]=instruction_dp[i+11];
cp0_opcode[i]=instruction_dp[i+6];
rt_opcode[i]=instruction_dp[i+11];
rs_opcode[i]=instruction_dp[i+6];
rd_opcode[i]=instruction_dp[i+16];
sa_opcode[i]=instruction_dp[i+21];
base_opcode[i]=instruction_dp[i+6];
}
for(i=0;i<16;i++){
immediate_opcode[i]=instruction_dp[i+16];
offset_opcode[i]=instruction_dp[i+16];
}
for(i=0;i<26;i++){
target_opcode[i]=instruction_dp[i+6];
}
for(i=0;i<3;i++){
sel_opcode[i]=instruction_dp[i+29];
}*/
sel=sel_opcode;
rt=rt_opcode;
rs=rs_opcode;
rd=rd_opcode;
sa=sa_opcode;
base=base_opcode;
op=op_opcode;
immediate=immediate_opcode;
offset=offset_opcode;
target=target_opcode;
instruction_type_dp=opcode;
normal_instr_num_dp=opcode;
special_instr_num_dp=special_opcode;
special2_instr_num_dp=special2_opcode;
cp0_co_instr_num_dp=cp0_co_opcode;
regimm_instr_num_dp=regimm_opcode;
cp0_instr_num_dp=cp0_opcode;
/* sel=change_nbit(sel_opcode,3);
rt=change_nbit(rt_opcode,5);
rs=change_nbit(rs_opcode,5);
rd=change_nbit(rd_opcode,5);
sa=change_nbit(sa_opcode,5);
base=change_nbit(base_opcode,5);
immediate=change_signed_nbit(immediate_opcode,16);
offset=change_signed_nbit(offset_opcode,16);
target=change_nbit(target_opcode,26);
instruction_type_dp=change_nbit(opcode,6);
normal_instr_num_dp=change_nbit(opcode,6);
special_instr_num_dp=change_nbit(special_opcode,6);
special2_instr_num_dp=change_nbit(special2_opcode,6);
cp0_co_instr_num_dp=change_nbit(cp0_co_opcode,6);
regimm_instr_num_dp=change_nbit(regimm_opcode,5);
cp0_instr_num_dp=change_nbit(cp0_opcode,5);*/
// printf("rt=%d, rs=%d, rd=%d, sa=%d\n", rt,rs,rd,sa);
// printf("immediate=%d, offset=%d, target=%d, sa=%d,sel=%d\n", immediate,offset,target,sa,sel);
if(instruction_type_dp==0){
// special instrction
//printf("special instrction\n");
switch(special_instr_num_dp)
{case 0 : //printf(" sll \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]));
opb_dp=sa;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -