鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

替换x86 popcntq汇编指令

现象描述

编译报错: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; 
    }