@@ -90,7 +90,9 @@ void MipsTranslator::translateBlock(Block* b) {
90
90
}
91
91
// 这里:暂时是把所有临时变量全部写回了,但是其实没这个必要,稍后可以加以改进
92
92
for (int i = 0 ; i < TMPREG; i++) {
93
- varReg[Tuser[i]] = -1 ;
93
+ if (Tstatus[i] == REGVAR) {
94
+ varReg[Tuser[i]] = -1 ;
95
+ }
94
96
Tstatus[i] = REGFREE;
95
97
Tuser[i] = -1 ;
96
98
}
@@ -195,10 +197,14 @@ vector<int> MipsTranslator::TregisterAlloc(int var, int isImmediate
195
197
for (int i = 0 ; i < TMPREG; i++) {
196
198
if (Tstatus[i] == REGFREE) {
197
199
// 如果找到了free状态的直接使用即可
198
- if (isImmediate|| var== -1 ) {
199
- Tstatus[i] = REGOCCUPY ;// 改状态
200
+ if (! isImmediate && var == -1 ) {
201
+ Tstatus[i] = REGTMP ;// 改状态
200
202
Tuser[i] = -1 ;// 改使用者
201
203
}
204
+ else if (isImmediate) {
205
+ Tstatus[i] = REGOCCUPY;// 改状态
206
+ Tuser[i] = var;// 改使用者
207
+ }
202
208
else {
203
209
Tstatus[i] = REGVAR;
204
210
Tuser[i] = var;
@@ -214,7 +220,7 @@ vector<int> MipsTranslator::TregisterAlloc(int var, int isImmediate
214
220
find (conflictVar.begin (), conflictVar.end (), Tuser[i]) != conflictVar.end ()) {
215
221
continue ;// 不分配相关变量的寄存器
216
222
}
217
- else if (Tstatus[i] == REGOCCUPY &&
223
+ else if (( Tstatus[i] == REGOCCUPY||Tstatus[i]==REGTMP) &&
218
224
find (conflictReg.begin (), conflictReg.end (), Tregister[i]) != conflictReg.end ()) {
219
225
continue ;// 不分配相关变量占用的寄存器
220
226
}
@@ -225,10 +231,14 @@ vector<int> MipsTranslator::TregisterAlloc(int var, int isImmediate
225
231
if (entry->scope == " " ) {
226
232
continue ;
227
233
}
228
- if (isImmediate || var == -1 ) {
229
- Tstatus[i] = REGOCCUPY ;// 改状态
234
+ if (! isImmediate && var == -1 ) {
235
+ Tstatus[i] = REGTMP ;// 改状态
230
236
Tuser[i] = -1 ;// 改使用者
231
237
}
238
+ else if (isImmediate ) {
239
+ Tstatus[i] = REGOCCUPY;// 改状态
240
+ Tuser[i] =var;// 改使用者(常数)
241
+ }
232
242
else {
233
243
Tstatus[i] = REGVAR;
234
244
Tuser[i] = var;
@@ -244,21 +254,23 @@ vector<int> MipsTranslator::TregisterAlloc(int var, int isImmediate
244
254
find (conflictVar.begin (), conflictVar.end (), Tuser[i]) != conflictVar.end ()) {
245
255
continue ;// 不分配相关的寄存器
246
256
}
247
- else if (Tstatus[i] == REGOCCUPY &&
257
+ else if (( Tstatus[i] == REGOCCUPY || Tstatus[i] == REGTMP) &&
248
258
find (conflictReg.begin (), conflictReg.end (), Tregister[i]) != conflictReg.end ()) {
249
259
continue ;// 不分配相关变量占用的寄存器
250
260
}
251
261
else {
252
262
// 找到了一个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;// 改状态
258
267
Tuser[i] = -1 ;// 改使用者
259
268
}
269
+ else if (isImmediate) {
270
+ Tstatus[i] = REGOCCUPY;// 改状态
271
+ Tuser[i] = var;// 改使用者(常数)
272
+ }
260
273
else {
261
- // 若是变量
262
274
Tstatus[i] = REGVAR;
263
275
Tuser[i] = var;
264
276
varReg[var] = Tregister[i];// 登记
@@ -268,10 +280,14 @@ vector<int> MipsTranslator::TregisterAlloc(int var, int isImmediate
268
280
else {
269
281
// 需要写回
270
282
int old = Tuser[i];
271
- if (isImmediate || var == -1 ) {
272
- Tstatus[i] = REGOCCUPY ;// 改状态
283
+ if (! isImmediate && var == -1 ) {
284
+ Tstatus[i] = REGTMP ;// 改状态
273
285
Tuser[i] = -1 ;// 改使用者
274
286
}
287
+ else if (isImmediate) {
288
+ Tstatus[i] = REGOCCUPY;// 改状态
289
+ Tuser[i] = var;// 改使用者
290
+ }
275
291
else {
276
292
Tstatus[i] = REGVAR;
277
293
Tuser[i] = var;
@@ -300,6 +316,12 @@ int MipsTranslator::loadOperand(int var, int isImmediate
300
316
}
301
317
else if (isImmediate) {
302
318
// 是立即数
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
+ }
303
325
vector<int >res = TregisterAlloc (var, isImmediate, conflictVar
304
326
, conflictReg, activeVariable);
305
327
if (res[1 ] != -1 ) { writeback (res[1 ], res[0 ]); }// 写回
0 commit comments