`
sunzixun
  • 浏览: 74790 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

<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; })
 

 

一切正常。。。

 

 

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

 

  • 大小: 4 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics