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)); }
父主题: 替换x86 atomic原子操作函数