---
title: 替换x86 popcnt汇编指令
description: "编译报错：Error: unknown mnemonic 'popcnt' -- 'popcnt [sp,8],x0'。"
url: https://www.hikunpeng.com/document/detail/zh/kunpenggrf/codeprtr/kunpengtaishanporting_12_0031.html
sourcePath: /source/zh/kunpenggrf/codeprtr/kunpengtaishanporting_12_0031.html
indexId: fe14b7a27d0693d5a7957b72a9ffde48274848612a951e3f210939930c3640b065
---
# 替换x86 popcnt汇编指令

#### 现象描述

编译报错：Error: unknown mnemonic 'popcnt' -- 'popcnt [sp,8],x0'。


#### 问题原因

popcnt为x86平台的位1计数指令，鲲鹏平台无对应指令，需使用替换算法实现。


#### 处理步骤

- x86平台实现样例：

```
static inline uint64_t POPCNT_popcnt_u64(uint64_t a)
{
uint64_t result;
__asm__("popcnt %1, %0" : "=r"(result) : "mr"(a) : "cc");
return result;
}
```


- 鲲鹏平台实现样例：

```
#include <arm_neon.h>
static inline uint64_t POPCNT_popcnt_u64(uint64_t x)
{
uint64_t count_result = 0;
uint64_t count[1];
uint8x8_t input_val, count8x8_val;
uint16x4_t count16x4_val;
uint32x2_t count32x2_val;
uint64x1_t count64x1_val;
input_val = vld1_u8((unsigned char *) &x);
count8x8_val = vcnt_u8(input_val);
count16x4_val = vpaddl_u8(count8x8_val);
count32x2_val = vpaddl_u16(count16x4_val);
count64x1_val = vpaddl_u32(count32x2_val);
vst1_u64(count, count64x1_val);
count_result=count[0];
return count_result;
}
```
