cmpl
指令是否等同于movl
+a比较。如果是这样,b/w有什么区别:(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)是为data_ready为volatile int data_ready = 0x0;
的while (!data_ready);
生成的
(2)是为data_ready为std::atomic<int> data_ready(0x0);
的while (!data_ready.load(std::memory_order_acquire));
生成的
在这两种情况下,data_ready都被另一个线程设置为1。英特尔保证对齐内存访问的movl
是原子性的,而且看起来cmpl
也应该是原子性的。如果是这样,为什么clang会生成不同的代码呢?(我相信这是有正当理由的,这就是我问的原因)
另外,这是否意味着易失性变量与x86-64平台上的std::atomic“等价”(这当然不意味着什么,C++标准也不保证)。
生成此代码的代码可以在in this github repo中找到
发布于 2015-02-16 08:11:43
test
指令对其指令进行逐位AND
,并根据该AND
的结果设置标志(但and
本身的结果将被丢弃)。
cmp
类似于只执行设置标志的操作,但它执行减法而不是按位AND
。
不过,该操作实际上与volatile
或atomic
没有太多(如果有的话)关系。如果这两种方法中的任何一种都会影响代码生成,那么就会对所使用的寻址模式产生影响--即,第一种模式直接将立即值与内存中的值进行比较,而第二种模式则执行加载,然后操作寄存器中的值。
https://stackoverflow.com/questions/28532693
复制相似问题