鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

替换atomic_add指令

函数功能:对整数变量进行原子加。

  • x86上代码段:
    static inline void atomic_add(int i, atomic_t *v) 
    {
    asm volatile(LOCK_PREFIX "addl %1,%0" : "+m" (v->counter) : "ir" (i));//实现原子变量v->counter,加i操作
    }
  • 在鲲鹏上替换:

    第1种方法:使用GCC自带原子操作替换

    __sync_add_and_fetch(&_value.counter,1)

    第2种方法:使用内联汇编替换

    void atomic_add (int i) 
    { 
    unsigned int tmp; 
    int result; 
    __asm__ volatile(" prfm pstl1strm, %2\n" 
    "1: ldaxr %w0, %2\n" //加载数据到寄存器
    " add %w0, %w0, %w3\n" //加操作
    " stlxr %w1, %w0, %2\n" //加后的数据写入内存并判断是否写入成功
    " cbnz %w1, 1b" //若写入内存失败,重新执行加操作
    : "=&r"(result), "=&r"(tmp), "+Q"(_value.counter) 
    : "Ir"(i)) 
    }