ARMv7/ARMv8是否存在x86 PEXT等效指令及高效实现方案问询
ARMv7/ARMv8平台x86 PEXT指令等效实现方案
原生指令支持情况
- ARMv7:无等效原生指令,全系列都没有支持并行位提取功能的硬件指令。
- ARMv8:基础AArch64指令集无原生等效指令,仅Armv8.1-A及更高版本搭载SVE2向量扩展的硬件,提供了
BEXT指令,功能与x86 PEXT完全一致。但目前绝大多数消费级ARMv8设备(手机、普通嵌入式开发板等)都不支持SVE2扩展,通用场景下无法直接使用该指令。
无原生指令时的最高效实现方案
通用动态掩码场景下,主流编译器(GCC、Clang)默认采用位遍历运算序列实现PEXT功能,是目前经过性能验证的最高效通用实现,逻辑如下:
输入参数:源数据
src、提取掩码mask
输出结果:res的第n位对应src中mask第n个为1的位置的位值
mov res, #0 tst mask, mask beq end // 掩码为空直接返回0 extract_loop: lsr src, src, #1 subs mask_carry, mask, #1 and temp, src, #1 orr res, res, temp lsl res, res, #1 and mask, mask, mask_carry bne extract_loop end: lsr res, res, #1 // 修正最后一次循环多余的左移
如果是固定掩码的专用场景,可以进一步优化:直接硬编码掩码中所有为1的位的偏移量,不需要循环逻辑,仅需最多k条位提取+位或指令(k为掩码中1的数量),性能比动态掩码实现高3~10倍。
内容的提问来源于stack exchange,提问作者Raoul722
相关产品推荐
相关产品推荐

