今天改了一天代码,早上洗了一早上衣服,然后下午主要是想看下struct释放内存的操作,但是不太对,然后就释放了几个函数内的局部malloc,然而并没有改变测评还是CE的局面。晚上自己写了matrix_add的测试用例,发现了一个立即数的bug,但是还是没有什么影响。
修改的错误
这个是自己写测试样例发现的错误
- 具体如图:
具体修改代码
1
2
3
4
5
6
7
8
9
10
11
12/* codegen.cpp */
if(i < 200 && i>-200){
sprintf(inst, "\tstr 's0, ['s1, #%d]\n", i);
emit(AS_Oper(inst, NULL, L(munchExp(e2), L(munchExp(e1), NULL)), NULL));
}
else{
Temp_temp r1 = Temp_newTemp();
sprintf(inst, "\tldr 'd0, =%d\n", i);
emit(AS_Oper(inst, L(r1,NULL), NULL, NULL));
sprintf(inst2, "\tstr 's0, ['s1, 's2]\n");
emit(AS_Oper(inst2, NULL, L(munchExp(e2), L(munchExp(e1) , L(r1,NULL))), NULL));
}修改后结果
针对上一个问题的修改
- 参考
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// 曾老师给的参考代码
/*
加载立即数 ldr r0,=#100
*/
void ILoc::load_imm(string rsReg, int num)
{
if (PlatformArm::constExpr(num)) {
// mov r8,#12
emit("mov", rsReg, toStr(num));
} else {
// ldr r8,=0xfff0
load_label(rsReg, toStr(num, false));
}
}
if (PlatformArm::constExpr(off)) {
// sub sp,sp,#16
emit("sub", "sp", "sp", toStr(off));
} else {
//ldr r8,=257
load_imm(tmpReg, off);
//sub sp,sp,r8
emit("sub", "sp", "sp", tmpReg);
}
/*
循环左移两位
*/
void PlatformArm::roundLeftShiftTwoBit(unsigned int &num)
{
unsigned int overFlow = num & 0xc0000000;//取左移即将溢出的两位
num = (num << 2) | (overFlow >> 30);//将溢出部分追加到尾部
}
/*
判断num是否是常数表达式,8位数字循环右移偶数位得到
*/
bool PlatformArm::__constExpr(int num)
{
unsigned int new_num = (unsigned int) num;
for (int i = 0; i < 16; i++) {
if (new_num <= 0xff) {
// 有效表达式
return true;
}
//循环左移2位
roundLeftShiftTwoBit(new_num);
}
return false;
}
/*
同时处理正数和负数
*/
bool PlatformArm::constExpr(int num)
{
return __constExpr(num) || __constExpr(-num);
}实际处理
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//codegen.cpp 70-106
/*
循环左移两位
*/
void roundLeftShiftTwoBit(unsigned int &num)
{
unsigned int overFlow = num & 0xc0000000;//取左移即将溢出的两位
num = (num << 2) | (overFlow >> 30);//将溢出部分追加到尾部
}
/*
判断num是否是8位可放的,8位数字循环右移偶数位得到
*/
bool __constExpr(int num)
{
unsigned int new_num = (unsigned int) num;
for (int i = 0; i < 16; i++) {
if (new_num <= 0xff) {
// 有效表达式
return true;
}
//循环左移2位
roundLeftShiftTwoBit(new_num);
}
return false;
}
/*
同时处理正数和负数
*/
bool constExpr(int num)
{
return __constExpr(num) || __constExpr(-num);
}实例
1
2
3
4
5
6
7
8
9
10
11//codegen.cpp 124-133
if(constExpr(i)){
sprintf(inst, "\tldr 'd0, ['s0, #%d]\n", i);
emit(AS_Oper(inst, L(r, NULL), L(munchExp(e1), NULL), NULL));
}
else{
sprintf(inst,"\tldr 'd0,=%d\n",i);
emit(AS_Oper(inst, L(r, NULL), NULL, NULL));
sprintf(inst2, "\tldr 'd0, ['s0, 'd0]\n");
emit(AS_Oper(inst2,L(r,NULL),L(munchExp(e1),NULL),NULL));
}
修复字节长度warning
1
2
3
4C:\Users\13948\Desktop\C0\Compiler_GIT\liveness.cpp: In function 'void solveLiveness(Live_graph*, G_graph, G_table, G_table)':
C:\Users\13948\Desktop\C0\Compiler_GIT\liveness.cpp:149:49: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
Temp_enterPtr(spillCost, ti, (void*)spills);
^~~~~~1
2
3//liviness.cpp
long spills ==> long long spills
void* 为8个字节