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

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

在鲲鹏上替换:

  • 第一种方法:使用GCC自带原子操作函数替换
    static inline int atomic_inc_and_test(atomic_t *v)
    {
        __sync_add_and_fetch(&((*v).counter), 1);
        return (*v).counter == 0;
    }
  • 第二种方法:使用内联汇编替换
    #define prefetchw(x) __builtin_prefetch(x, 1)
    static inline int atomic_inc_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
            " add %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;
    }