__sync_bool_compare_and_swap 汇编实现

https://gcc.gnu.org/onlinedocs/gcc-4.1.0/gcc/Atomic-Builtins.html#Atomic-Builtins

带有C/C++表达式的内联汇编格式为:

__asm__ __volatile__("Instruction List" : Output : Input : Clobber/Modify);

其中每项的概念及功能用法描述如下:

1、 __asm__

__asm__是GCC 关键字asm 的宏定义:

#define __asm__ asm

__asm__或asm 用来声明一个内联汇编表达式,所以任何一个内联汇编表达式都是以它开头的,是必不可少的。

2、Instruction List

Instruction List 是汇编指令序列。它可以是空的,比如:__asm__ __volatile__(""); 或 __asm__ ("");都是完全合法的内联汇编表达式,只不过这两条语句没有什么意义。但并非所有Instruction List 为空的内联汇编表达式都是没有意义的,比如:__asm__ ("":::"memory");

就非常有意义,它向GCC 声明:“内存作了改动”,GCC 在编译的时候,会将此因素考虑进去。 当在"Instruction List"中有多条指令的时候,可以在一对引号中列出全部指令,也可以将一条 或几条指令放在一对引号中,所有指令放在多对引号中。如果是前者,可以将每一条指令放在一行,如果要将多条指令放在一行,则必须用分号(;)或换行符(\n)将它们分开. 综上述:(1)每条指令都必须被双引号括起来 (2)两条指令必须用换行或分号分开。


C代码  
  1. #define LOCK_PREFIX    "lock;"  
  2. #define __sync_bool_compare_and_swap(mem, oldval, newval) \  
  3.   ({ __typeof (*mem) ret;                             \  
  4.        __asm __volatile (LOCK_PREFIX "cmpxchg %2, %1"                \  
  5.                    : "=a" (ret), "=m" (*mem)                  \  
  6.                                : "r" (newval), "m" (*mem), "0" (oldval));         \  
  7.                                     ret; })  

死锁

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

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

高版本才可以  asm ("setz %n");

折腾了半天 发现只能  

重新修改  

C代码  
  1. #define LOCK_PREFIX    "lock;"  
  2. #define __sync_bool_compare_and_swap(mem, oldval, newval) \  
  3.   ({ __typeof (*mem) ret;                             \  
  4.          __asm __volatile (LOCK_PREFIX "cmpxchgl %2, %1;sete %%al; movzbl %%al,%%eax"                \  
  5.                             : "=a" (ret), "=m" (*mem)                  \  
  6.                             : "r" (newval), "m" (*mem), "a" (oldval)\  
  7.                             :"memory");         \  
  8.                               ret; })  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值