无需内联汇编生成FMOV:ACLE intrinsics是否支持该基础向量操作?
ARM ACLE Intrinsics:消除冗余
lastb指令,实现GPR与向量低64位的高效转换 问题本质
你当前的代码流程是对的,但用svlastb_u64提取向量低64位属于语义错配:svlastb的设计目标是根据谓词寄存器提取活跃元素中的最后一个有效值,哪怕你传入svptrue_b64标记所有元素活跃,编译器也会严格按照其语义生成lastb指令,而不会优化成更直接的fmov。
最优解决方案:使用svget_u64 intrinsic
ARM ACLE专门提供了svget_u64来直接获取向量寄存器的指定位置元素,当你传入索引0时,就会直接提取低64位值,编译器会生成高效的fmov指令,完全消除冗余操作。
修改后的代码如下:
#include <arm_sve.h> unsigned long foo(unsigned long a, unsigned long b) { svuint64_t vec_a = svdup_n_u64(a); svuint64_t vec_b = svdup_n_u64(b); svuint64_t result_vec = svbdep_u64(vec_a, vec_b); return svget_u64(result_vec, 0); }
对应编译后的汇编代码:
foo(unsigned long, unsigned long): mov z0.d, x0 mov z1.d, x1 bdep z0.d, z0.d, z1.d fmov x0, d0 ret
对bext操作的同理处理
如果是执行bext操作,只需要将svbdep_u64替换为svbext_u64,依然用svget_u64(result_vec, 0)提取结果即可,逻辑完全一致,同样能得到无冗余的汇编输出。
内容的提问来源于stack exchange,提问作者Elliot Gorokhovsky
相关产品推荐
相关产品推荐

