替换x86 pand汇编指令

现象描述

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

问题原因

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

指令使用方法参考:

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

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

 
/*
 * 功能:对数组a和数组b做按位与运算,结果放置到result中
 * neon指令每次处理16字节长度数据,所以数据长度为16字节整数倍
 */
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;
}