替换atomic_inc_and_test指令
函数说明:对整数进行加操作,并判断返回是否为0。
- x86上代码:
static inline int atomic_inc_and_test(atomic_t *v) { unsigned char c; asm volatile(LOCK_PREFIX "incl %0; sete %1" : "+m" (v->counter), "=qm" (c) : : "memory"); return c != 0; }
- 在鲲鹏上替换:
__sync_add_and_fetch(&_value.counter,i)
第2种方法:使用内联汇编替换(i 传1,并对result作判断)
static inline void atomic_fetch_add(int i, atomic_t *v) { unsigned long tmp; int result, val; //写预取 prefetchw(&v->counter); __asm__ volatile( "\n\t" "@ atomic_fetch\n\t" "1: ldrex %0, [%4]\n\t" @result, tmp //执行v->counter+i(5%)操作,并将执行结果放入val(%1)所在的寄存器中 " add %1, %0, %5\n\t" @result, " strex %2, %1, [%4]\n\t" @tmp, result,tmp " teq %2, #0\n\t" @tmp " bne 1b" : "=&r"(result), "=&r"(val), "=&r"(tmp), "+Qo"(v->counter) : "r"(&v->counter), "Ir"(i) : "cc"); return result; }
父主题: 源码修改类案例