-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathRType.cpp
More file actions
executable file
·84 lines (74 loc) · 2.59 KB
/
RType.cpp
File metadata and controls
executable file
·84 lines (74 loc) · 2.59 KB
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
/*---------------------------------------------
have been tested!
-----------------------------------------------*/
#include<string>
#include<iostream>
#include"ir.h"
using namespace std;
string R_type(int head,string ins)
{
int ir_No,i,cnt = -1;
string ir;
string tmp, reg[3] = {"","",""};
ir = ins.substr(head, ins.find(' ') - head);
for (ir_No = 0; ir_No < IR_QUANTITY; ir_No++)
if (ir == ir_set[ir_No]) break;
for (i = ins.find(' '); i <= ins.length(); i++)
{
if (ins[i] == '$')
{
cnt++;
while (ins[i] != ',' && i <= ins.length())
reg[cnt] += ins[i++];
}
}
switch (ir_No)
{
case 0: return "000000" + Reg_Num(reg[1]) + Reg_Num(reg[2]) + Reg_Num(reg[0]) + "00000" + "100000"; //add
case 1: return "000000" + Reg_Num(reg[1]) + Reg_Num(reg[2]) + Reg_Num(reg[0]) + "00000" + "100010"; //sub
case 2: return "000000" + Reg_Num(reg[1]) + Reg_Num(reg[2]) + Reg_Num(reg[0]) + "00000" + "100100"; //and
case 3: return "000000" + Reg_Num(reg[1]) + Reg_Num(reg[2]) + Reg_Num(reg[0]) + "00000" + "100101"; //or
case 4: return "000000" + Reg_Num(reg[1]) + Reg_Num(reg[2]) + Reg_Num(reg[0]) + "00000" + "101010"; //slt
/* case 5: return "00000000000" + Reg_Num(reg[1]) + Reg_Num(reg[0]) + Turn_5_Bin(reg[2]) + "000000"; //sll
case 6: return "00000000000" + Reg_Num(reg[1]) + Reg_Num(reg[0]) + Turn_5_Bin(reg[2]) + "000010"; //srl
case 7: return "00000000000" + Reg_Num(reg[1]) + Reg_Num(reg[0]) + Turn_5_Bin(reg[2]) + "000011"; //sra*/
}
}
string R_type2(int head, string ins)
{
int ir_No, i, cnt = -1;
string ir;
string tmp, reg[2] = { "", ""},imm="";
ir = ins.substr(head, ins.find(' ') - head);
for (ir_No = 0; ir_No < IR_QUANTITY; ir_No++)
if (ir == ir_set[ir_No]) break;
//cout << ir_No << endl;
for (i = ins.find(' '); i <= ins.length(); i++)
{
if (ins[i] == '$')
{
cnt++;
while (ins[i] != ',' && i <= ins.length())
reg[cnt] += ins[i++];
}
}
for (i = ins.rfind(','); i <= ins.length(); i++)
{
//cout << ins[i]<<ins[i-2] << endl;
if (ins[i] >= '0'&&ins[i] <= '9' && (ins[i - 2] != '$'))
{
//cout << ins[i] << endl;
for (; i <= ins.length(); i++)
imm += ins[i];
break;
}
}
//cout << Turn_5_Bin(imm) << endl;
//cout << "here" << endl;
switch (ir_No)
{
case 5: return "00000000000" + Reg_Num(reg[1]) + Reg_Num(reg[0]) + Turn_5_Bin(imm) + "000000"; //sll
case 6: return "00000000000" + Reg_Num(reg[1]) + Reg_Num(reg[0]) + Turn_5_Bin(imm) + "000010"; //srl
case 7: return "00000000000" + Reg_Num(reg[1]) + Reg_Num(reg[0]) + Turn_5_Bin(imm) + "000011"; //sra
}
}