gpt4 book ai didi

c++ - x86-64 movl 和 cmpl 区别

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:51:12 26 4
gpt4 key购买 nike

cmpl相当于movl的指令+ 比较。如果是这样,黑白有什么区别:(1)

LBB1_2:    
cmpl $0, _data_ready(%rip)
je LBB1_2

和:(2)

LBB1_2:
movl _data_ready(%rip), %eax
testl %eax, %eax
je LBB1_2

(1) 是为 while (!data_ready); 生成的其中 data_ready 是 volatile int data_ready = 0x0;

(2) 是为 while (!data_ready.load(std::memory_order_acquire)); 生成的其中 data_ready 是 std::atomic<int> data_ready(0x0);

在这两种情况下,data_ready 都被另一个线程设置为 1。英特尔保证movl对于对齐的内存访问是原子的,它看起来像 cmpl也应该是原子的。如果是这样,为什么 clang 会生成不同的代码? (我确信这就是我问的正当理由)

此外,这是否意味着 volatile 变量在 x86-64 平台上与 std::atomic “等效”(这当然没有任何意义,并且不受 C++ 标准的保证)。

生成这个的代码可用in this github repo

最佳答案

test 指令对其指令执行按位 AND,并根据 AND 的结果设置标志(但结果 本身被丢弃)。

cmp 类似于仅设置标志的操作,但它执行减法而不是按位 AND

不过,该操作实际上与 volatileatomic 没有太多关系(如果有的话)。就其中任何一个影响代码生成的程度而言,影响将影响所使用的寻址模式——即,第一个直接将立即值与内存中的值进行比较,但第二个进行加载,然后操作该值在寄存器中。

关于c++ - x86-64 movl 和 cmpl 区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28532693/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com