小编Hin*_*tro的帖子

Clang 和 GCC 对 movzx 的奇怪使用

我知道这movzx可以用于打破依赖关系,但我偶然发现了movzxClang 和 GCC 的一些用途,我真的看不出它们有什么用处。这是我在 Godbolt 编译器浏览器上尝试的一个简单示例:

#include <stdint.h>

int add2bytes(uint8_t* a, uint8_t* b) {
    return uint8_t(*a + *b);
}
Run Code Online (Sandbox Code Playgroud)

与海湾合作委员会 12 -O3

add2bytes(unsigned char*, unsigned char*):
        movzx   eax, BYTE PTR [rsi]
        add     al, BYTE PTR [rdi]
        movzx   eax, al
        ret
Run Code Online (Sandbox Code Playgroud)

如果我理解正确的话,这里的第一个movzx打破了对先前eax值的依赖,但第二个是什么movzx做什么?我认为它不会破坏任何依赖关系,也不应该影响结果。

使用 clang 14 -O3,情况更加奇怪:

add2bytes(unsigned char*, unsigned char*):                       # @add2bytes(unsigned char*, unsigned char*)
        mov     al, byte ptr [rsi]
        add     al, byte ptr [rdi]
        movzx   eax, al
        ret …
Run Code Online (Sandbox Code Playgroud)

c++ x86 assembly gcc clang

53
推荐指数
2
解决办法
3028
查看次数

标签 统计

assembly ×1

c++ ×1

clang ×1

gcc ×1

x86 ×1