替换atomic_sub指令
函数功能:对整数变量进行原子减。
- x86上代码段:
static inline void atomic_sub(int i, atomic_t *v) { asm volatile(LOCK_PREFIX "subl %1,%0" : "+m" (v->counter) : "ir" (i)); }
- 在鲲鹏上替换:
__sync_sub_and_fetch(&_value.counter,1);
第2种方法:使用内联汇编替换
void atomic_sub (int i) { unsigned int tmp; int result; __asm__ volatile(" prfm pstl1strm, %2\n" "1: ldaxr %w0, %2\n" //加载数据到寄存器 " sub %w0, %w0, %w3\n" //减操作 " stlxr %w1, %w0, %2\n" //减后的数据写入内存,并判断是否写入成功 " cbnz %w1, 1b" //若写入内存失败,重新执行减操作 : "=&r"(result), "=&r"(tmp), "+Q"(_value.counter) : "Ir"(i)) }
父主题: 源码修改类案例