在我的嵌入式系统课程中,我们被要求将给定的 C 函数 AbsVal 重新编码为 ARM 程序集。有人告诉我们,我们能做的最好的就是 3 行。我决心找到一个 2 线解决方案并最终做到了,但我现在的问题是我实际上是降低了性能还是提高了性能。
C代码:
unsigned long absval(signed long x){
unsigned long int signext;
signext = (x >= 0) ? 0 : -1; //This can be done with an ASR instruction
return (x + signet) ^ signext;
}
TA/教授的3线解决方案
ASR R1, R0, #31 ; R1 <- (x >= 0) ? 0 : -1
ADD R0, R0, R1 ; R0 <- R0 + R1
EOR R0, R0, R1 ; R0 <- R0 ^ R1
我的 2 线解决方案
ADD R1, R0, R0, ASR #31 ; R1 <- x + (x >= 0) ? 0 : -1
EOR R0, R1, R0, ASR #31 ; R0 <- R1 ^ (x >= 0) ? 0 : -1
有几个地方我可以看到潜在的性能差异:
- 添加了一个额外的算术右移调用
- 删除一个内存提取
那么,哪一个实际上更快?它取决于处理器或内存访问速度吗?