---
title: atomic_dec_and_test指令
description: "对整数进行减操作，并判断执行原子减后结果是否为0。"
url: https://www.hikunpeng.com/document/detail/zh/kunpenggrf/codeprtr/kunpengtaishanporting_12_0035.html
sourcePath: /source/zh/kunpenggrf/codeprtr/kunpengtaishanporting_12_0035.html
indexId: 94c75f1ce0a2b236b4bf4bbe4ae5829726cfe0474bc546d09555d250d054cd8465
---
# atomic_dec_and_test指令

#### 函数功能

对整数进行减操作，并判断执行原子减后结果是否为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;
}
```

在鲲鹏上替换：

- 第一种方法：使用GCC自带原子操作函数替换

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