在我的嵌入式系统课程中,我们被要求将给定的 C 函数 AbsVal 重新编码为 ARM 汇编语言。
我们被告知最好的解决方案是三行代码。我决心找到一个两行的解决方案,最终也确实找到了,但是我现在的问题是我是否真的降低了性能或提高了性能。(特别是在 Cortex-M3 上。)
C 代码:
TA/教授的三行解决方案
我的两行解决方案
有几个地方可能会出现性能差异:
1. 增加一个额外的算术右移调用 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/教授的三行解决方案
ASR R1, R0, #31 ; R1 <- (x >= 0) ? 0 : -1
ADD R0, R0, R1 ; R0 <- R0 + R1
EOR R0, R0, R1 ; R0 <- R0 ^ R1
我的两行解决方案
ADD R1, R0, R0, ASR #31 ; R1 <- x + (x >= 0) ? 0 : -1
EOR R0, R1, R0, ASR #31 ; R0 <- R1 ^ (x >= 0) ? 0 : -1
有几个地方可能会出现性能差异:
1. 增加一个额外的算术右移调用 2. 移除一个内存获取操作
那么,到底哪个更快呢?这取决于处理器还是内存访问速度?
movs r0, variable
来同时从内存加载值并测试符号。 - Aki Suihkonen