【发布时间】:2021-08-04 22:10:01
【问题描述】:
我有一些 C 代码基本上可以归结为:
*p_Bool3 = *p_Bool1 || *p_Bool2;
其中 p_Bool1、p_Bool2 和 p_Bool3 为“bool *”。
clang++ 给了我这个使用 O2 的 X86 程序集(O3 没有区别,我只是使用 O2,因为那是实际项目中使用的):
mov eax, dword ptr [esp + 12]
mov edx, dword ptr [esp + 4]
mov cl, 1
cmp byte ptr [edx], 0
je LBB1_1
mov byte ptr [eax], cl
ret
LBB1_1:
mov ecx, dword ptr [esp + 8]
mov cl, byte ptr [ecx]
mov byte ptr [eax], cl
ret
实际的程序稍微复杂一些,包含一堆 ob get 和 set 函数以及一些重载的运算符,但它基本上是使用 O2 的相同汇编代码:
001de515 mov al, 0x01
001de517 mov ecx, dword ptr ds:[edi+0x00000628]
001de51d cmp byte ptr ds:[ecx], 0x00000000
001de520 jne 0x001DE52E
001de522 mov eax, dword ptr ds:[edi+0x0000065C]
001de528 cmp byte ptr ds:[eax], 0x00000000
001de52b setne al
001de52e mov ecx, dword ptr ds:[edi+0x000005EC]
001de534 mov byte ptr ds:[ecx], al
现在我有一些参考代码在相同的硬件/系统上运行速度提高了 75%,如下所示:
0100121e lea ebx, dword ptr ds:[esi+0x10280005]
01001224 mov al, byte ptr ds:[ebx]
01001226 lea ebx, dword ptr ds:[esi+0x10280006]
0100122c or al, byte ptr ds:[ebx]
0100122e lea ebx, dword ptr ds:[esi+0x10280004]
01001234 mov byte ptr ds:[ebx], al
如何让 clang 只使用“或”指令并更快?
【问题讨论】:
标签: assembly optimization x86 llvm