-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathbanco_de_registradores.c
129 lines (124 loc) · 3.07 KB
/
banco_de_registradores.c
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include "banco_de_registradores.h"
void carregaRegistradores(Instrucao instrucao){
switch(instrucao.type){
case 0: // JUMPS
switch(bin2int(instrucao.op)){
case 0: // jf
aluB = bin2int(extendSignal(instrucao.offset8));
switch(bin2int(instrucao.cond)){
case 4: //0100
controle_alu.cond = alu_flags.neg;
break;
case 5: //0101
controle_alu.cond = alu_flags.zero;
break;
case 6: //0110
controle_alu.cond = alu_flags.carry;
break;
case 7: //0111
controle_alu.cond = alu_flags.negzero;
break;
case 0: //0000
controle_alu.cond = alu_flags.true;
break;
case 3: //0011
controle_alu.cond = alu_flags.overflow;
break;
}
break;
case 1: // jt
aluB = bin2int(extendSignal(instrucao.offset8));
switch(bin2int(instrucao.cond)){
case 4: //0100
controle_alu.cond = alu_flags.neg;
break;
case 5: //0101
controle_alu.cond = alu_flags.zero;
break;
case 6: //0110
controle_alu.cond = alu_flags.carry;
break;
case 7: //0111
controle_alu.cond = alu_flags.negzero;
break;
case 0: //0000
controle_alu.cond = alu_flags.true;
break;
case 3: //0011
controle_alu.cond = alu_flags.overflow;
break;
}
break;
case 2: // j
aluB = bin2int(extendSignal(instrucao.offset12));
break;
case 3: // jal / jr
aluB = bin2int(instrucao.rb);
break;
}
controle.ALUop = instrucao.op;
controle.OpOn = TRUE;
controle.RegWrite = FALSE;
controle.MemWrite = FALSE;
controle.MemRead = FALSE;
controle.IRWrite = FALSE;
controle.PCWriteCond = TRUE;
controle.RegDST = NULL;
break;
case 1:
aluA = bancoR.regs[bin2int(instrucao.ra)];
aluB = bancoR.regs[bin2int(instrucao.rb)];
controle.RegDST = bin2int(instrucao.wc);
controle.ALUop = instrucao.op;
controle.RegWrite = FALSE;
controle.MemWrite = FALSE;
controle.MemRead = TRUE;
controle.IRWrite = FALSE;
controle.PCWriteCond = FALSE;
break;
case 2:
aluA = bancoR.regs[bin2int(instrucao.rc)];
aluB = bin2int(extendSignal(instrucao.offset12));
controle.RegDST = bin2int(instrucao.wc);
controle.ALUop = instrucao.op;
controle.RegWrite = TRUE;
controle.MemWrite = FALSE;
controle.MemRead = FALSE;
controle.IRWrite = FALSE;
controle.PCWriteCond = FALSE;
break;
case 3:
aluA = bancoR.regs[bin2int(instrucao.rc)];
aluB = bin2int(extendSignal(instrucao.offset8));
controle.RegDST = bin2int(instrucao.wc);
controle.ALUop = instrucao.op;
controle.RegWrite = TRUE;
controle.MemWrite = FALSE;
controle.MemRead = FALSE;
controle.IRWrite = FALSE;
controle.PCWriteCond = FALSE;
break;
}
}
void InicializaBanco(BancoDeRegistradores *banco){
int i;
for(i = 0; i < 5; i++) banco->regs[i] = 0;
banco->sp = NULL;
banco->ra = NULL;
banco->fp = NULL;
}
void StoreReg(Registrador *destino, int valor){
*destino = valor;
}
Registrador LoadReg(Registrador *reg){
return *reg;
}
void PrintBanco(BancoDeRegistradores banco){
int i;
for(i = 0; i < 5; i++){
printf(" r%d: %x\n", i, banco.regs[i]);
}
printf(" ra: %p\n", banco.ra);
printf(" fp: %p\n", banco.fp);
printf(" sp: %p\n", banco.sp);
}