哪个在 ARM 上更快?
*p++ = (*p >> 7) * 255;
or
*p++ = ((*p >> 7) << 8) - 1
基本上我在这里做的是获取一个 8 位字,如果 >= 128 则将其设置为 255,否则设置为 0。
最佳答案
如果p
是char
下面的语句只是对 255
的赋值.
*p++ = ((*p >> 7) << 8) - 1
如果p
是int
,那当然是另外一回事了。
您可以使用 GCC Explorer查看程序集输出的样子。以下是您从 Linaro's arm-linux-gnueabi-g++ 4.6.3
获得的内容与 -O2 -march=armv7-a
旗帜;
void test(char *p) {
*p++ = (*p >> 7) * 255;
}
void test2(char *p) {
*p++ = ((*p >> 7) << 8) - 1 ;
}
void test2_i(int *p) {
*p++ = ((*p >> 7) << 8) - 1 ;
}
void test3(char *p) {
*p++ = *p >= 128 ? ~0 : 0;
}
void test4(char *p) {
*p++ = *p & 0x80 ? ~0 : 0;
}
创造
test(char*):
ldrb r3, [r0, #0] @ zero_extendqisi2
sbfx r3, r3, #7, #1
strb r3, [r0, #0]
bx lr
test2(char*):
movs r3, #255
strb r3, [r0, #0]
bx lr
test2_i(int*):
ldr r3, [r0, #0]
asrs r3, r3, #7
lsls r3, r3, #8
subs r3, r3, #1
str r3, [r0, #0]
bx lr
test3(char*):
ldrsb r3, [r0, #0]
cmp r3, #0
ite lt
movlt r3, #255
movge r3, #0
strb r3, [r0, #0]
bx lr
test4(char*):
ldrsb r3, [r0, #0]
cmp r3, #0
ite lt
movlt r3, #255
movge r3, #0
strb r3, [r0, #0]
bx lr
如果您不吹毛求疵,最好始终检查生成代码的汇编,了解这些细节。人们倾向于overestimate compilers ,我同意大多数时候他们做得很好,但我想任何人都有权质疑生成的代码。
您还应该小心解释指令,因为由于核心的架构特征(例如具有乱序、超标量深度管道),它们并不总是匹配到周期精确列表。所以它可能并不总是最短的指令序列获胜。
关于c - 什么在 ARM 上更快? MUL 或 (SHIFT + SUB)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18388166/