编译报错:unknown mnemonic 'pxor' -- 'pxor'。
pxor是x86指令集中的指令,无法在鲲鹏设备上使用。其功能是按位做xor运算,使用方法有两种。
PXOR xmm1, xmm2/m128
PXOR mm1, mm2/m64 =
指令用法参考地址:
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字节长度数据,所以数据长度为16字节整数倍 */ 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; }