项目需求使用F2811,在编译器开o2优化后,发现计算结果出错,回头看汇编文件,发现部分有符号数的加减法被转成了无符号数的计算,请问各位朋友,在解决这种问题方面有什么经验吗?
比如我的C代码实现如下:
shift = – shift_in;
tmp32_1 = (S32_T)real << shift;
tmp32_2 = (S32_T)imag << shift;
Ltemp = ADD_32_32_32(tmp32_1, tmp32_2);
tmp32_2 = SUB_32_32_32(tmp32_1,tmp32_2);
shift = – shift_in1;
Ltemp >>= shift;
Real = ROUND(Ltemp);
tmp32_2 >>= shift;
Imag = ROUND(tmp32_2);
开o2优化后,SUB_32_32_32的减法计算被替换成了SUBUL,而非不开优化时的SUBL
其中SUB_32_32_32_32等是自己写的C的内敛连函数,如inline S32_T SUB_32_32_32(S32_T Src0,S32_T Src1){ return Src0 – Src1;}
我发现,不开优化时,编译出来的SUB实际上还是LCR(或者另一个)一条调用的指令,开了o2优化后,SUB会被直接替换为SUB指令,只是有的地方编译器给出的结果似SUBUL,而非我想要的SUBL,请问在着用情况下我应该如何优化我的C代码呢?
我已经试过将SUB的结果传递给其他变量,后面在进行计算,但依旧没有达到使用SUBL的结果,直接将SUB改为tmp32_2 -= tmp32_1,开优化后的编译结果也还是SUBUL
我的程序对处理时间的要求还是挺高的。
希望大家可以讨论交流。
10#:
请问你使用是的哪个版本的编译器(注意,不是CCS IDE,而是compiler或者CGT – code generation tools),请下载最新版本的测试一下问题是否还存在,如果是,建议提供一个最简单的测试程序,我可以看一下问题在哪。
http://software-dl.ti.com/codegen/non-esd/downloads/download.htm#C2000