You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需内联汇编生成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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 09:47:03