Skip to content

Commit 606ef13

Browse files
针对所有跳转语句的优化
1 parent 764911b commit 606ef13

File tree

2 files changed

+54
-21
lines changed

2 files changed

+54
-21
lines changed

MipsTranslator.cpp

+22-3
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,11 @@ void MipsTranslator::translateBlock(Block* b) {
5656
}
5757
for (int i = 0; i < b->v.size(); i++) {
5858
if (i+1<b->v.size()
59-
&&(b->v[i].op==MIDEQL||b->v[i].op==MIDNEQ)
59+
&&(b->v[i].op==MIDEQL||b->v[i].op==MIDNEQ|| b->v[i].op == MIDGRE
60+
||b->v[i].op == MIDGEQ|| b->v[i].op == MIDLSS
61+
|| b->v[i].op == MIDLEQ)
6062
&&(b->v[i+1].op==MIDBZ||b->v[i+1].op==MIDBNZ)) {
61-
//针对跳转语句的beq bne优化
63+
//针对跳转语句优化
6264
MidCode c1 = b->v[i];
6365
MidCode c2 = b->v[i + 1];
6466
if (c2.operand1 == c1.target && !c2.isImmediate1//保证是同一个变量
@@ -1277,9 +1279,26 @@ void MipsTranslator::translate(vector<MidCode>c,int type) {
12771279
|| (c[0].op == MIDNEQ && c[1].op == MIDBNZ)) {
12781280
out << "bne " << name[operand1] << "," << name[operand2] << ",label$" << -c[1].operand2 << endl;
12791281
}
1280-
else {
1282+
else if((c[0].op == MIDEQL && c[1].op == MIDBNZ)
1283+
|| (c[0].op == MIDNEQ && c[1].op == MIDBZ)){
12811284
out << "beq " << name[operand1] << "," << name[operand2] << ",label$" << -c[1].operand2 << endl;
12821285
}
1286+
else if (c[0].op == MIDGEQ && c[1].op == MIDBZ ||
1287+
c[0].op == MIDLSS && c[1].op == MIDBNZ) {
1288+
out << "blt " << name[operand1] << "," << name[operand2] << ",label$" << -c[1].operand2 << endl;
1289+
}
1290+
else if (c[0].op == MIDGEQ && c[1].op == MIDBNZ ||
1291+
c[0].op == MIDLSS && c[1].op == MIDBZ) {
1292+
out << "bge " << name[operand1] << "," << name[operand2] << ",label$" << -c[1].operand2 << endl;
1293+
}
1294+
else if (c[0].op == MIDGRE && c[1].op == MIDBZ ||
1295+
c[0].op == MIDLEQ && c[1].op == MIDBNZ) {
1296+
out << "ble " << name[operand1] << "," << name[operand2] << ",label$" << -c[1].operand2 << endl;
1297+
}
1298+
else if (c[0].op == MIDGRE && c[1].op == MIDBNZ ||
1299+
c[0].op == MIDLEQ && c[1].op == MIDBZ) {
1300+
out << "bgt " << name[operand1] << "," << name[operand2] << ",label$" << -c[1].operand2 << endl;
1301+
}
12831302
out << "#" << c[0] << endl;
12841303
out << "#" << c[1] << endl;
12851304
}

mips.txt

+32-18
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@ MAX_NUM: .word 128
2222
jal main
2323
factorial:
2424
sw $ra,48($sp)#save the return value
25-
sle $t0,$a0,1##TMP2 = n <= 1
25+
li $t0,1 # load immediate 1
26+
bgt $a0,$t0,label$2
27+
##TMP2 = n <= 1
2628

27-
beq $t0,$0,label$2#BZ #TMP2 _label2
29+
#BZ #TMP2 _label2
2830

2931
li $v0,1
3032
lw $ra,48($sp)
@@ -226,9 +228,11 @@ addiu $s2,$s2,1#n = n + 1
226228

227229
subu $s3,$s3,$s0#s = s - i
228230

229-
sge $t0,$s2,128##TMP33 = n >= 128
231+
li $t0,128 # load immediate 128
232+
blt $s2,$t0,label$8
233+
##TMP33 = n >= 128
230234

231-
beq $t0,$0,label$8#BZ #TMP33 _label8
235+
#BZ #TMP33 _label8
232236

233237
la $a0,string$4
234238
li $v0,4
@@ -251,9 +255,10 @@ label$7:
251255
addiu $s0,$s0,1#_label7: i = i + 1
252256

253257
label$6:
254-
slt $t0,$s0,$s1#_label6: #TMP22 = i < j
258+
blt $s0,$s1,label$5
259+
#_label6: #TMP22 = i < j
255260

256-
bne $t0,$0,label$5#BNZ #TMP22 _label5
261+
#BNZ #TMP22 _label5
257262

258263
bne $s3,$0,label$10#BNZ s _label10
259264

@@ -298,9 +303,10 @@ syscall #printchar
298303
addiu $s0,$s0,1#i = i + 1
299304

300305
label$12:
301-
sle $t0,$s0,$s2#_label12: #TMP34 = i <= n
306+
ble $s0,$s2,label$11
307+
#_label12: #TMP34 = i <= n
302308

303-
bne $t0,$0,label$11#BNZ #TMP34 _label11
309+
#BNZ #TMP34 _label11
304310

305311
la $a0,string$7
306312
li $v0,4
@@ -316,9 +322,11 @@ label$10:
316322
addiu $s1,$s1,1#_label10: j = j + 1
317323

318324
label$4:
319-
slti $t0,$s1,128#_label4: #TMP21 = j < 128
325+
li $t0,128 # load immediate 128
326+
blt $s1,$t0,label$3
327+
#_label4: #TMP21 = j < 128
320328

321-
bne $t0,$0,label$3#BNZ #TMP21 _label3
329+
#BNZ #TMP21 _label3
322330

323331
la $a0,string$8
324332
li $v0,4
@@ -398,9 +406,11 @@ label$15:
398406
addiu $s0,$s0,1#_label15: i = i + 1
399407

400408
label$14:
401-
slti $t0,$s0,228#_label14: #TMP37 = i < 228
409+
li $t0,228 # load immediate 228
410+
blt $s0,$t0,label$13
411+
#_label14: #TMP37 = i < 228
402412

403-
bne $t0,$0,label$13#BNZ #TMP37 _label13
413+
#BNZ #TMP37 _label13
404414

405415
li $s0,0
406416
j label$17#GOTO _label17
@@ -428,9 +438,10 @@ syscall #printchar
428438
addiu $s0,$s0,1#i = i + 1
429439

430440
label$17:
431-
slt $t0,$s0,$s1#_label17: #TMP76 = i < y
441+
blt $s0,$s1,label$16
442+
#_label17: #TMP76 = i < y
432443

433-
bne $t0,$0,label$16#BNZ #TMP76 _label16
444+
#BNZ #TMP76 _label16
434445

435446
la $a0,string$11
436447
li $v0,4
@@ -475,9 +486,10 @@ label$22:
475486
addiu $s0,$s0,1#_label22: i = i + 1
476487

477488
label$21:
478-
sle $t0,$s0,$s2#_label21: #TMP80 = i <= k2
489+
ble $s0,$s2,label$20
490+
#_label21: #TMP80 = i <= k2
479491

480-
bne $t0,$0,label$20#BNZ #TMP80 _label20
492+
#BNZ #TMP80 _label20
481493

482494
li $t0,1 # load immediate 1
483495
bne $s4,$t0,label$23
@@ -528,9 +540,11 @@ addiu $s1,$s1,1#_label23: m = m + 1
528540

529541
li $s4,1
530542
label$19:
531-
sle $t0,$s1,128#_label19: #TMP78 = m <= 128
543+
li $t0,128 # load immediate 128
544+
ble $s1,$t0,label$18
545+
#_label19: #TMP78 = m <= 128
532546

533-
bne $t0,$0,label$18#BNZ #TMP78 _label18
547+
#BNZ #TMP78 _label18
534548

535549
la $a0,string$15
536550
li $v0,4

0 commit comments

Comments
 (0)