gpt4 book ai didi

arm - 当您不关心新 channel 时,如何在 clang/AArch64 上使用 NEON 内在函数将 int32x2_t 扩展到 int32x4_t?

转载 作者:行者123 更新时间:2023-12-03 19:13:52 24 4
gpt4 key购买 nike

各位ARMists,
我想用 NEON 代码缩小和饱和 2 s32 到 2 s16,并将它们打包在 GPR 中。
我需要符合某个API,所以请不要在这里讨论效率或设计:)
这是片段:

int32x2_t stuff32 = ...;
int16x4_t stuff16 = vqmovn_s32(vcombine_s32(stuff32, stuff32));
return vget_lane_u32(stuff16, 0)

其中产生
mov    v0.d[1], v0.d[0] 
sqxtn v0.4h, v0.4s
fmov w0, s0
ret

有人知道一种让类型系统满意的方法,并且让 d 寄存器的后半部分未初始化吗?我想避免内联汇编。
谢谢 !

最佳答案

我不知道使用通用 arm_neon.h 的任何好的解决方案内在函数,但至少对于 Clang,可以使用 Clang 特定的内置函数来生成一个向量,其中某些元素设置为未定义,因此代码生成器不需要特别用任何值填充它们。

使用的设置如下所示:

$ cat test.c
#include <arm_neon.h>

int32_t narrow_saturate(int32x2_t stuff32) {
int16x4_t stuff16 = vqmovn_s32(__builtin_shufflevector(stuff32, stuff32, 0, 1, -1, -1));
return vget_lane_s32(vreinterpret_s32_s16(stuff16), 0);
}

$ clang -target aarch64-linux-gnu test.c -S -o - -O2
[...]
narrow_saturate:
sqxtn v0.4h, v0.4s
fmov w0, s0
ret

https://godbolt.org/z/N_NsSE

https://clang.llvm.org/docs/LanguageExtensions.html#builtin-shufflevector有关 __builtin_shufflevector 的文档.

编辑:似乎也可以通过使用未初始化的变量来实现与 Clang 相同的目标(尽管使用 `-Wuninitialized 会产生警告):
$ cat test.c
#include <arm_neon.h>

int32_t narrow_saturate(int32x2_t stuff32) {
int32x2_t uninitialized;
int16x4_t stuff16 = vqmovn_s32(vcombine_s32(stuff32, uninitialized));
return vget_lane_s32(vreinterpret_s32_s16(stuff16), 0);
}

Clang 为此产生与上面相同的结果( https://godbolt.org/z/TzHuon ),而 GCC 仍然包含一个 mov v0.8b, v0.8b ( https://godbolt.org/z/wZTAU9 )。

关于arm - 当您不关心新 channel 时,如何在 clang/AArch64 上使用 NEON 内在函数将 int32x2_t 扩展到 int32x4_t?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61271902/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com