Skip to content

Commit 918a861

Browse files
增加了已分配寄存器的常量的优化
1 parent 3d5fe05 commit 918a861

File tree

4 files changed

+57
-33
lines changed

4 files changed

+57
-33
lines changed

MipsTranslator.cpp

+37-15
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,9 @@ void MipsTranslator::translateBlock(Block* b) {
9090
}
9191
//这里:暂时是把所有临时变量全部写回了,但是其实没这个必要,稍后可以加以改进
9292
for (int i = 0; i < TMPREG; i++) {
93-
varReg[Tuser[i]] = -1;
93+
if (Tstatus[i] == REGVAR) {
94+
varReg[Tuser[i]] = -1;
95+
}
9496
Tstatus[i] = REGFREE;
9597
Tuser[i] = -1;
9698
}
@@ -195,10 +197,14 @@ vector<int> MipsTranslator::TregisterAlloc(int var, int isImmediate
195197
for (int i = 0; i < TMPREG; i++) {
196198
if (Tstatus[i] == REGFREE) {
197199
//如果找到了free状态的直接使用即可
198-
if (isImmediate||var==-1) {
199-
Tstatus[i] = REGOCCUPY;//改状态
200+
if (!isImmediate && var == -1) {
201+
Tstatus[i] = REGTMP;//改状态
200202
Tuser[i] = -1;//改使用者
201203
}
204+
else if (isImmediate) {
205+
Tstatus[i] = REGOCCUPY;//改状态
206+
Tuser[i] = var;//改使用者
207+
}
202208
else {
203209
Tstatus[i] = REGVAR;
204210
Tuser[i] = var;
@@ -214,7 +220,7 @@ vector<int> MipsTranslator::TregisterAlloc(int var, int isImmediate
214220
find(conflictVar.begin(), conflictVar.end(), Tuser[i]) != conflictVar.end()) {
215221
continue;//不分配相关变量的寄存器
216222
}
217-
else if (Tstatus[i] == REGOCCUPY &&
223+
else if ((Tstatus[i] == REGOCCUPY||Tstatus[i]==REGTMP)&&
218224
find(conflictReg.begin(), conflictReg.end(), Tregister[i]) != conflictReg.end()) {
219225
continue;//不分配相关变量占用的寄存器
220226
}
@@ -225,10 +231,14 @@ vector<int> MipsTranslator::TregisterAlloc(int var, int isImmediate
225231
if (entry->scope == "") {
226232
continue;
227233
}
228-
if (isImmediate || var == -1) {
229-
Tstatus[i] = REGOCCUPY;//改状态
234+
if (!isImmediate && var == -1) {
235+
Tstatus[i] = REGTMP;//改状态
230236
Tuser[i] = -1;//改使用者
231237
}
238+
else if (isImmediate ) {
239+
Tstatus[i] = REGOCCUPY;//改状态
240+
Tuser[i] =var;//改使用者(常数)
241+
}
232242
else {
233243
Tstatus[i] = REGVAR;
234244
Tuser[i] = var;
@@ -244,21 +254,23 @@ vector<int> MipsTranslator::TregisterAlloc(int var, int isImmediate
244254
find(conflictVar.begin(), conflictVar.end(), Tuser[i]) != conflictVar.end()) {
245255
continue;//不分配相关的寄存器
246256
}
247-
else if (Tstatus[i] == REGOCCUPY &&
257+
else if ((Tstatus[i] == REGOCCUPY || Tstatus[i] == REGTMP) &&
248258
find(conflictReg.begin(), conflictReg.end(), Tregister[i]) != conflictReg.end()) {
249259
continue;//不分配相关变量占用的寄存器
250260
}
251261
else {
252262
//找到了一个T寄存器
253-
if (Tstatus[i] == REGOCCUPY) {
254-
//若是occupy状态无需写回
255-
if (isImmediate || var == -1) {
256-
//若是立即数/临时寄存器
257-
Tstatus[i] = REGOCCUPY;//改状态
263+
if (Tstatus[i] == REGOCCUPY||Tstatus[i]==REGTMP) {
264+
//若是occupy状态或是临时占用无需写回
265+
if (!isImmediate && var == -1) {
266+
Tstatus[i] = REGTMP;//改状态
258267
Tuser[i] = -1;//改使用者
259268
}
269+
else if (isImmediate) {
270+
Tstatus[i] = REGOCCUPY;//改状态
271+
Tuser[i] = var;//改使用者(常数)
272+
}
260273
else {
261-
//若是变量
262274
Tstatus[i] = REGVAR;
263275
Tuser[i] = var;
264276
varReg[var] = Tregister[i];//登记
@@ -268,10 +280,14 @@ vector<int> MipsTranslator::TregisterAlloc(int var, int isImmediate
268280
else {
269281
//需要写回
270282
int old = Tuser[i];
271-
if (isImmediate || var == -1) {
272-
Tstatus[i] = REGOCCUPY;//改状态
283+
if (!isImmediate && var == -1) {
284+
Tstatus[i] = REGTMP;//改状态
273285
Tuser[i] = -1;//改使用者
274286
}
287+
else if (isImmediate) {
288+
Tstatus[i] = REGOCCUPY;//改状态
289+
Tuser[i] = var;//改使用者
290+
}
275291
else {
276292
Tstatus[i] = REGVAR;
277293
Tuser[i] = var;
@@ -300,6 +316,12 @@ int MipsTranslator::loadOperand(int var, int isImmediate
300316
}
301317
else if (isImmediate) {
302318
//是立即数
319+
bool found = false;
320+
for (int i = 0; i < TMPREG; i++) {
321+
if (Tstatus[i] == REGOCCUPY && Tuser[i] == var) {
322+
return Tregister[i];
323+
}
324+
}
303325
vector<int>res = TregisterAlloc(var, isImmediate, conflictVar
304326
, conflictReg, activeVariable);
305327
if (res[1] != -1) { writeback(res[1], res[0]); }//写回

MipsTranslator.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@
44
#include<fstream>
55
#define GLOBALREG 8
66
#define TMPREG 10
7+
//是直接就是被临时分配的寄存器
8+
#define REGTMP 3
9+
//占用状态指里面存储着常数
710
#define REGOCCUPY 2
8-
//占用状态指里面存储着常数或是直接就是被临时分配的寄存器
11+
912
#define REGVAR 1
1013
#define REGFREE 0
1114
using namespace std;

mips.txt

+15-16
Original file line numberDiff line numberDiff line change
@@ -366,39 +366,38 @@ mul $t4,$t3,$t3##TMP71 = #TMP63 * #TMP63
366366

367367
mul $t5,$t4,$t3##TMP72 = #TMP71 * #TMP63
368368

369-
li $t7,10 # load immediate 10
370-
div $t0,$t7
369+
div $t0,$t1
371370
mflo $t6##TMP44 = #TMP50 / 10
372371

373-
mul $t8,$t6,10##TMP45 = #TMP44 * 10
372+
mul $t7,$t6,10##TMP45 = #TMP44 * 10
374373

375-
subu $t9,$t0,$t8##TMP64 = #TMP50 - #TMP45
374+
subu $t8,$t0,$t7##TMP64 = #TMP50 - #TMP45
376375

377-
mul $t0,$t9,$t9##TMP68 = #TMP64 * #TMP64
376+
mul $t9,$t8,$t8##TMP68 = #TMP64 * #TMP64
378377

379-
mul $t2,$t0,$t9##TMP69 = #TMP68 * #TMP64
378+
mul $t0,$t9,$t8##TMP69 = #TMP68 * #TMP64
380379

381380
li $t4,100 # load immediate 100
382381
div $s0,$t4
383-
mflo $t0##TMP65 = i / 100
382+
mflo $t2##TMP65 = i / 100
384383

385-
mul $t6,$t0,$t0##TMP66 = #TMP65 * #TMP65
384+
mul $t6,$t2,$t2##TMP66 = #TMP65 * #TMP65
386385

387-
mul $t8,$t6,$t0##TMP67 = #TMP66 * #TMP65
386+
mul $t7,$t6,$t2##TMP67 = #TMP66 * #TMP65
388387

389-
addu $t6,$t8,$t2##TMP70 = #TMP67 + #TMP69
388+
addu $t6,$t7,$t0##TMP70 = #TMP67 + #TMP69
390389

391-
addu $t2,$t6,$t5##TMP73 = #TMP70 + #TMP72
390+
addu $t0,$t6,$t5##TMP73 = #TMP70 + #TMP72
392391

393-
mul $t5,$t9,10##TMP58 = #TMP64 * 10
392+
mul $t5,$t8,10##TMP58 = #TMP64 * 10
394393

395-
mul $t6,$t0,100##TMP57 = #TMP65 * 100
394+
mul $t6,$t2,100##TMP57 = #TMP65 * 100
396395

397-
addu $t0,$t6,$t5##TMP59 = #TMP57 + #TMP58
396+
addu $t2,$t6,$t5##TMP59 = #TMP57 + #TMP58
398397

399-
addu $t5,$t0,$t3##TMP60 = #TMP59 + #TMP63
398+
addu $t5,$t2,$t3##TMP60 = #TMP59 + #TMP63
400399

401-
bne $t5,$t2,label$15
400+
bne $t5,$t0,label$15
402401
##TMP74 = #TMP60 == #TMP73
403402

404403
#BZ #TMP74 _label15

testfile.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -126,4 +126,4 @@ void main()
126126
swap(5, 10 ) ;
127127

128128
complete_flower_num() ;
129-
}
129+
}

0 commit comments

Comments
 (0)