对整数进行减操作,并判断执行原子减后结果是否为0。
x86上代码:
static inline int atomic_dec_and_test(atomic_t *v) { unsigned char c; asm volatile(LOCK_PREFIX "decl %0; sete %1" : "+m" (v->counter), "=qm" (c) : : "memory"); return c != 0; }
在鲲鹏上替换:
static inline int atomic_dec_and_test(atomic_t *v) { __sync_sub_and_fetch(&((*v).counter), 1); return (*v).counter == 0; }
static inline int atomic_dec_and_test(atomic_t *v) { unsigned long tmp; int result, val, i; i = 1; prefetchw(&v->counter); __asm__ volatile( "\n\t" "1: ldaxr %0, [%4]\n\t" // @result, tmp " sub %1, %0, %5\n\t" // @result, " stlxr %w2, %1, [%4]\n\t" // @tmp, result,tmp " cbnz %w2, 1b\n\t " // @tmp : "=&r"(result), "=&r"(val), "=&r"(tmp), "+Qo"(v->counter) : "r"(&v->counter), "Ir"(i) : "cc"); return (*v).counter == 0; }