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

替换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; 
    }
  • 在鲲鹏上替换:

    第1种方法:使用GCC自带原子操作函数替换

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