instruction parsing_instr(const char *buffer, const int index) { instruction i = {0, }; uint32_t b = fromBinary((char*)buffer); mem_write_32(MEM_TEXT_START + index, b); i.value = b; i.opcode = (short)(b >> 26); if (i.opcode == 0x02 || i.opcode == 0x03) { // J Type i.r_t.target = b << 6 >> 6; return i; }
int cache_line_write_to_mem (uint8 *data, pa_t p_addr) { int i, rc; for (i = 0; i < 64; i++) { rc = mem_write_32 (p_addr, ((uint32 *)data)[i]); if (rc < 0) { printf ("ERROR: mem_write_32 failed for p_addr %x\n", p_addr); return -1; } } return 0; }
mem_wb_reg run_MEM() { ex_mem_reg EX_MEM = CURRENT_STATE.EX_MEM; mem_wb_reg reg; mem_wb_reg MEM_WB = CURRENT_STATE.MEM_WB; //handling lw, sw if(EX_MEM.cMemRd) { //TODO: read from memory!(hazardous!) if(DEBUG) printf("EX_MEM ALU: %d\n",EX_MEM.ALUResult); reg.memV = mem_read_32(EX_MEM.ALUResult); if(DEBUG) printf("reg.memV: %d\n",reg.memV); } if(EX_MEM.cMemWrt) { //TODO: write to memory! if(MEM_WB.cRegWrt && EX_MEM.cMemWrt && MEM_WB.wrtReg == EX_MEM.wrtReg) { if(noforward_set) { CURRENT_STATE.MEM_bubble_count = 1; memset(®, 0, sizeof(reg)); return reg; } mem_write_32(EX_MEM.ALUResult, MEM_WB.memV); } else mem_write_32(EX_MEM.ALUResult, EX_MEM.wrtData); } reg.PC = EX_MEM.PC; if(EX_MEM.cMemRd) reg.ALUResult = reg.memV; else reg.ALUResult = EX_MEM.ALUResult; reg.wrtReg = EX_MEM.wrtReg; reg.cMem2Reg = EX_MEM.cMem2Reg; reg.cRegWrt = EX_MEM.cRegWrt; return reg; }
instruction parsing_instr(const char *buffer, const int index) { instruction instr = INST_INFO[index]; uint32_t inst_binary = fromBinary((char *) buffer); mem_write_32(MEM_TEXT_START + index, inst_binary); instr.value = inst_binary; instr.opcode = inst_binary >> 26; switch (instr.opcode) { // R-type case 0: instr.func_code = inst_binary & 0x3F; switch (instr.func_code) { // JR case 8: instr.r_t.r_i.rs = (inst_binary >> 21) & 0x1F; break; // SLL case 0: // SRL case 2: instr.r_t.r_i.rt = (inst_binary >> 16) & 0x1F; instr.r_t.r_i.r_i.r.rd = (inst_binary >> 11) & 0x1F; instr.r_t.r_i.r_i.r.shamt = (inst_binary >> 6) & 0x1F; break; // ADDU, AND, NOR, OR, SLTU, SUBU default: instr.r_t.r_i.rs = (inst_binary >> 21) & 0x1F; instr.r_t.r_i.rt = (inst_binary >> 16) & 0x1F; instr.r_t.r_i.r_i.r.rd = (inst_binary >> 11) & 0x1F; break; } break; // J-type case 2: case 3: instr.r_t.target = inst_binary & 0x3FFFFFF; break; // I-type default: instr.r_t.r_i.rt = (inst_binary >> 16) & 0x1F; instr.r_t.r_i.r_i.imm = inst_binary & 0xFFFF; // Not LUI if (instr.opcode != 15) { instr.r_t.r_i.rs = (inst_binary >> 21) & 0x1F; } break; }
/* * Procedure : load_program * Purpose : Load program and service routines into mem. */ void load_program(FILE *prog) { int ii, word; /* Open program file. */ if (prog == NULL) { printf("[Error] Can't open program file\n"); exit(-1); } /* Read in the program. */ ii = 0; while (fscanf(prog, "%x\n", &word) != EOF) { mem_write_32(MEM_TEXT_START + ii, word); ii += 4; } CURRENT_STATE.PC = MEM_TEXT_START; return; }
void process_instruction(){ /* Your code */ CURRENT_STATE.PC+=4; int index = (CURRENT_STATE.PC - MEM_TEXT_START - 4)/4 ; // printf(" index %d, NUM_INST %d \n",index,NUM_INST); if( index+1 >= NUM_INST ) { RUN_BIT=FALSE; // printf("Run bit unset pc: %x\n",CURRENT_STATE.PC); } short opcode = INST_INFO[ index ].opcode; short func_code = INST_INFO[ index ].func_code; char rs; char rt; char rd; unsigned int rs_data; unsigned int rt_data; unsigned int rd_data; char shamt; unsigned int imm; switch(opcode) { case 0: // 000000 ~ switch(func_code) { case 0: // sll rt = INST_INFO[ index ].r_t.r_i.rt; rd = INST_INFO[ index ].r_t.r_i.r_i.r.rd; shamt = INST_INFO[ index ].r_t.r_i.r_i.r.shamt; CURRENT_STATE.REGS[ rd ] = CURRENT_STATE.REGS[ rt ] << shamt; break; case 2: // srl rt = INST_INFO[ index ].r_t.r_i.rt; rd = INST_INFO[ index ].r_t.r_i.r_i.r.rd; shamt = INST_INFO[ index ].r_t.r_i.r_i.r.shamt; CURRENT_STATE.REGS[ rd ] = CURRENT_STATE.REGS[ rt ] >> shamt; break; case 8: // jr CURRENT_STATE.PC = CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rs ]; break; case 33: // addu rs = INST_INFO[ index ].r_t.r_i.rs; rt = INST_INFO[ index ].r_t.r_i.rt; rd = INST_INFO[ index ].r_t.r_i.r_i.r.rd; CURRENT_STATE.REGS[ rd ] = CURRENT_STATE.REGS[ rs ]+ CURRENT_STATE.REGS[ rt ]; break; case 35: // subu rs = INST_INFO[ index ].r_t.r_i.rs; rt = INST_INFO[ index ].r_t.r_i.rt; rd = INST_INFO[ index ].r_t.r_i.r_i.r.rd; CURRENT_STATE.REGS[ rd ] = CURRENT_STATE.REGS[ rs ] - CURRENT_STATE.REGS[ rt ]; break; case 36: // and rs = INST_INFO[ index ].r_t.r_i.rs; rt = INST_INFO[ index ].r_t.r_i.rt; rd = INST_INFO[ index ].r_t.r_i.r_i.r.rd; CURRENT_STATE.REGS[ rd ] = CURRENT_STATE.REGS[ rs ] & CURRENT_STATE.REGS[ rt ]; break; case 37: // or rs = INST_INFO[ index ].r_t.r_i.rs; rt = INST_INFO[ index ].r_t.r_i.rt; rd = INST_INFO[ index ].r_t.r_i.r_i.r.rd; CURRENT_STATE.REGS[ rd ] = (CURRENT_STATE.REGS[ rs ] | CURRENT_STATE.REGS[ rt ]); break; case 39: // nor rs = INST_INFO[ index ].r_t.r_i.rs; rt = INST_INFO[ index ].r_t.r_i.rt; rd = INST_INFO[ index ].r_t.r_i.r_i.r.rd; CURRENT_STATE.REGS[ rd ] = ~(CURRENT_STATE.REGS[ rs ] | CURRENT_STATE.REGS[ rt ]); break; case 43: // sltu rs = INST_INFO[ index ].r_t.r_i.rs; rt = INST_INFO[ index ].r_t.r_i.rt; rd = INST_INFO[ index ].r_t.r_i.r_i.r.rd; if( CURRENT_STATE.REGS[rs] < CURRENT_STATE.REGS[rt] ) { CURRENT_STATE.REGS[rd] = 1; } else { CURRENT_STATE.REGS[rd] = 0; } break; } break; case 2: // j CURRENT_STATE.PC = (CURRENT_STATE.PC & 0xf0000000) | INST_INFO[ index ].r_t.target<<2; break; case 3: // jal CURRENT_STATE.REGS[31] = CURRENT_STATE.PC; CURRENT_STATE.PC = (CURRENT_STATE.PC & 0xf0000000) | INST_INFO[ index ].r_t.target<<2; break; case 4: // beq rs_data = CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rs ]; rt_data = CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rt ]; imm = INST_INFO[ index ].r_t.r_i.r_i.imm; if( rs_data == rt_data ) { CURRENT_STATE.PC += imm<<2; } break; case 5: // bne rs_data = CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rs ]; rt_data = CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rt ]; imm = INST_INFO[ index ].r_t.r_i.r_i.imm; if( rs_data != rt_data ) { CURRENT_STATE.PC += imm<<2; } break; case 9: // addiu rs_data = CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rs ]; imm = INST_INFO[ index ].r_t.r_i.r_i.imm; // printf("rs_data is %d imm is %hd \n",rs_data,imm); CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rt ] = rs_data+imm; break; case 11:// sltiu rs_data = CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rs ]; imm = INST_INFO[ index ].r_t.r_i.r_i.imm; // printf("imm is %x\n", imm); if( rs_data< imm) { CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rt ] = 1; } else { CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rt ] = 0; } break; case 12:// andi rs_data = CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rs ]; imm = (unsigned short) INST_INFO[ index ].r_t.r_i.r_i.imm; // printf(" rs_data %p imm %p",rs_data,imm); CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rt ] = rs_data&imm; break; case 13:// ori // printf(" reg num is %hd\n",INST_INFO[ index ].r_t.r_i.rs ); rs_data = CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rs ]; // printf("rs is %p \n",rs); imm = (unsigned short) INST_INFO[ index ].r_t.r_i.r_i.imm; CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rt ] = rs_data|imm; break; case 15:// lui imm = (unsigned short) INST_INFO[ index ].r_t.r_i.r_i.imm; // printf("rt is %hd\n",INST_INFO[ index ].r_t.r_i.rt); CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rt ] = imm<<16; // printf("imm<<16 is p\n",imm<<16); break; case 35:// lw rt = INST_INFO[ index ].r_t.r_i.rt; rs_data = CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rs ]; imm = INST_INFO[ index ].r_t.r_i.r_i.imm; CURRENT_STATE.REGS[ rt ] = mem_read_32( rs_data+imm ); break; case 43:// sw rt_data = CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rt ]; rs_data = CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rs ]; imm = INST_INFO[ index ].r_t.r_i.r_i.imm; mem_write_32( imm+rs_data, rt_data ); break; } }
void parsing_data(const char *buffer, const int index) { uint32_t word; word = fromBinary(buffer); mem_write_32(MEM_DATA_START + index, word); }
instruction parsing_instr(const char *buffer, const int index) { instruction instr; char opcode[7],rs[6],rt[6],rd[6],shamt[6],imm[17],target[27],func_code[7] = {0}; int word; word = fromBinary(buffer); mem_write_32(MEM_TEXT_START + index, word); sscanf(buffer, "%6s", opcode); instr.value = word; instr.opcode = (short)fromBinary(opcode); switch(instr.opcode) { //Type I case 0x9: //(0x001001)ADDIU case 0xc: //(0x001100)ANDI case 0xf: //(0x001111)LUI case 0xd: //(0x001101)ORI case 0xb: //(0x001011)SLTIU case 0x23: //(0x100011)LW case 0x2b: //(0x101011)SW case 0x4: //(0x000100)BEQ case 0x5: //(0x000101)BNE sscanf(buffer,"%6s%5s%5s%16s",opcode,rs,rt,imm); instr.r_t.r_i.rs = (unsigned char)fromBinary(rs); instr.r_t.r_i.rt = (unsigned char)fromBinary(rt); instr.r_t.r_i.r_i.imm = (short)fromBinary(imm); break; //TYPE R case 0x0: //(0x000000)ADDU, AND, NOR, OR, SLTU, SLL, SRL, SUBU if JR sscanf(buffer,"%6s%5s%5s%5s%5s%6s",opcode,rs,rt,rd,shamt,func_code); instr.func_code = (short)fromBinary(func_code); //JR exception if(instr.func_code == 0x8) instr.r_t.r_i.rs = (unsigned char)fromBinary(rs); else { instr.r_t.r_i.rs = (unsigned char)fromBinary(rs); instr.r_t.r_i.rt = (unsigned char)fromBinary(rt); instr.r_t.r_i.r_i.r.rd = (unsigned char)fromBinary(rd); instr.r_t.r_i.r_i.r.shamt = (unsigned char)fromBinary(shamt); } break; //TYPE J case 0x2: //(0x000010)J case 0x3: //(0x000011)JAL sscanf(buffer,"%6s%26s",opcode,target); instr.r_t.target = fromBinary(target); break; default: printf("Not available instruction\n"); assert(0); } return instr; }
void parsing_data(const char *buffer, const int index) { mem_write_32 (MEM_DATA_START + index, strtol (buffer, NULL, 2)); }
void parsing_data(const char *buffer, const int index) { mem_write_32(0x10000000+index, fromBinary((char *)buffer)); /* Your code */ }