<gcc> __sync_bool_compare_and_swap

跑的很欢的 代码 到了 gcc version 4.1.2 

下面  __sync_bool_compare_and_swap 找不到了。。。

 

加了 -march 也不管用 。。

 

干脆自己写一个吧

 

参考gcc 的atomic.h 

 

 

#define LOCK_PREFIX    "lock;"
#define __sync_bool_compare_and_swap(mem, oldval, newval) \
  ({ __typeof (*mem) ret;                             \
       __asm __volatile (LOCK_PREFIX "cmpxchg %2, %1"                \
                   : "=a" (ret), "=m" (*mem)                  \
                               : "r" (newval), "m" (*mem), "0" (oldval));         \
                                    ret; })

 写了一个 。。。

 

运行。。。。。lock free 变成死循环了。。。gdb 汇编调试之

 

发现返回值不对。。。。

 

 

 

看了看nginx的实现 发现需要 setz %返回寄存器。。

 

 

加上吧。。。

 

 

 写道
/tmp/ccyACQUP.s:55: Error: suffix or operands invalid for `setz'
/tmp/ccyACQUP.s:103: Error: suffix or operands invalid for `setz'
 

 

 

 

报错。。。。崩溃。。。 Google之 发现这也是高版本才可以  asm ("setz %n");

 

 

折腾了半天 发现只能  


 

重新修改  

 

#define LOCK_PREFIX    "lock;"
#define __sync_bool_compare_and_swap(mem, oldval, newval) \
  ({ __typeof (*mem) ret;                             \
         __asm __volatile (LOCK_PREFIX "cmpxchgl %2, %1;sete %%al; movzbl %%al,%%eax"                \
                            : "=a" (ret), "=m" (*mem)                  \
                            : "r" (newval), "m" (*mem), "a" (oldval)\
                            :"memory");         \
                              ret; })
 

 

一切正常。。。

 

 

有需要的人 拿去用吧。。。有问题留言

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值