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

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

在鲲鹏上替换:

  • 第一种方法:使用GCC自带原子操作替换
    static inline void atomic_add(atomic_t *v)
    {
        __sync_add_and_fetch(&((*v).counter), 1);
    }
  • 第二种方法:使用内联汇编替换
    static inline void atomic_add(atomic_t *v)
    {
        unsigned int tmp;
        int result, i;
        i = 1;
        __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"(v->counter)
                         : "Ir"(i));
    }