summaryrefslogtreecommitdiff
path: root/src/sim/wb.cc
blob: ac47f25797f1040d427e6978bb131b30b82c08e1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include "wb.h"
#include "accessor.h"
#include "instrDTO.h"
#include "response.h"
#include "stage.h"

WB::WB(Stage *stage) : Stage(stage) { this->id = WRITE; }

void WB::advance_helper() {
    if(this -> curr_instr) {
        if(this->curr_instr->get_type() == R || this->curr_instr->get_type() == I){ 
            if(this->checked_out.size() > 0) {
                signed int reg = this->checked_out.front();
                this->checked_out.pop_front();
                if(reg >= GPR_NUM){
                    // TODO: handle vector instructions
                } else {
                    if(this->curr_instr->get_mnemonic() != STORE && this->curr_instr->get_mnemonic() != STOREV){
                        this->gprs[reg] = this->curr_instr->get_s1();
                    }
                }
            }
        } else if (this->curr_instr->get_type() == J) {
            // TODO:handle push pop
            // branch taken
            if(this->pc != this->curr_instr->get_s1()) {
                if(this->curr_instr->get_mnemonic() == JAL){
                    // set link register to next instruction
                    this->gprs[1] = this->pc + 1;
                }
                this->pc = this->curr_instr->get_s1();  
                //clear pending registers and squash pipeline
                this->checked_out = {};
                this->next->squash();
            }
        }
    }
    this->status = OK;
}