---
title: 替换x86 pand汇编指令
description: "编译报错：unknown mnemonic 'pand' -- 'pand'。"
url: https://www.hikunpeng.com/document/detail/zh/kunpenggrf/codeprtr/kunpengtaishanporting_12_0021.html
sourcePath: /source/zh/kunpenggrf/codeprtr/kunpengtaishanporting_12_0021.html
indexId: 787d140dabc2297bc1aef077b8b75fa852eba2083fef2f4084d8ab88d5e6088a65
---
# 替换x86 pand汇编指令

#### 现象描述

编译报错：unknown mnemonic 'pand' -- 'pand'。


#### 问题原因

pand是x86指令集中的指令，无法在鲲鹏设备上使用。其功能是按位做and运算，使用方法有两种。

- 第一种用法是对寄存器xmm2或内存地址中128位内容与xmm1做按位与运算，结果存放于xmm2中，指令用法如下：

```
PAND xmm1, xmm2/m128
```


- 第二种用法是对寄存器mm2或内存地址中64位内容与mm1做按位与运算，结果存放于mm2中，指令用法如下：

```
PAND mm1, mm2/m64
```


指令使用方法参考：

https://c9x.me/x86/html/file_module_x86_id_230.html(https://c9x.me/x86/html/file_module_x86_id_230.html)


#### 处理步骤

对于以上两种情况，在鲲鹏上均可以用NEON指令AND替换，采用64或者128位长度的向量寄存器存放数据：

```
AND Vd.<T>, Vn.<T>, Vm.<T>
```

Bitwise AND (vector). Where <T> is 8B or 16B (though an assembler should accept any valid format).

其中Vn、Vm为待操作的寄存器，Vd是目的寄存器，<T>即是选择寄存器位数。

请参考指令集手册的第9.7小节，下载地址：http://infocenter.arm.com/help/topic/com.arm.doc.dui0802a/DUI0802A_armasm_reference_guide.pdf(http://infocenter.arm.com/help/topic/com.arm.doc.dui0802a/DUI0802A_armasm_reference_guide.pdf)

下面是一个简单的使用NEON指令AND对数据进行按位与操作的过程，供参考：

```
/*
* 功能：对数组a和数组b做按位与运算，结果放置到result中
* NEON指令每次处理16字节（4个int）数据，所以len参数应为4的整数倍
*/
void and_neon_asm(int* result, int* a, int* b, int len)
{
__asm__("\n\t"
"1:                               \n\t"
"ld1 {v0.16b}, [%[a]], #16        \n\t"
"ld1 {v1.16b}, [%[b]], #16        \n\t"
"and v0.16b, v0.16b, v1.16b       \n\t"
"subs %[len],%[len],#4            \n\t"
"st1 {v0.16b}, [%[result]], #16   \n\t"
"bgt 1b                           \n\t"
:[result]"+r"(result)                     //output
:[a]"r"(a),[b]"r"(b),[len]"r"(len)        //input
:"memory","v0","v1"
);
return;
}
```
