首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >x86-64 movl和cmpl差异

x86-64 movl和cmpl差异
EN

Stack Overflow用户
提问于 2015-02-16 07:55:24
回答 1查看 1.1K关注 0票数 3

cmpl指令是否等同于movl +a比较。如果是这样,b/w有什么区别:(1)

代码语言:javascript
运行
复制
LBB1_2:    
     cmpl $0, _data_ready(%rip)
     je LBB1_2

和:(2)

代码语言:javascript
运行
复制
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中找到

EN

回答 1

Stack Overflow用户

发布于 2015-02-16 08:11:43

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

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

不过,该操作实际上与volatileatomic没有太多(如果有的话)关系。如果这两种方法中的任何一种都会影响代码生成,那么就会对所使用的寻址模式产生影响--即,第一种模式直接将立即值与内存中的值进行比较,而第二种模式则执行加载,然后操作寄存器中的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28532693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档