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

#### 现象描述

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


#### 问题原因

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

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

```
PXOR xmm1, xmm2/m128
```


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

```
PXOR mm1, mm2/m64
```


指令用法参考地址：

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

#### 处理步骤

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

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

Bitwise exclusive OR (vector). Where <T> is 8B or 16B (an assembler should accept any valid arrangement).

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

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

```
/*
* 功能：对数组a和数组b做按位异或运算，结果放置到result中
* neon指令每次处理16字节（4个int）数据，所以len参数应为4的整数倍
*/
void eor_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"
"eor 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;
}
```
