gpt4 book ai didi

c - NEON 寄存器中的添加

转载 作者:太空宇宙 更新时间:2023-11-04 04:01:05 25 4
gpt4 key购买 nike

假设我在 neon 中有一个 64 位 d 寄存器。假设它存储值 ABCDEFGH。现在我想添加 A&E、B&F、C&G、D&H 等等。这里是否有任何内在的东西可以进行这样的操作

我查看了文档,但没有找到合适的内容。

最佳答案

如果要以 16 位执行加法,即产生 uint16x4 结果,可以使用 vmovl 将输入 vector 从 uint8x8 提升到 uint8x16,然后使用 vadd 将下半部分和上半部分相加。用 NEON 内在函数表示,这是通过

const int16x8_t t = vmovl_u8(input);
const int16x4_t r = vadd_u16(vget_low(t), vget_high(t))

这应该编译为以下程序集(d0 是 64 位输入寄存器,d1 是 64 位输出寄存器)。请注意 vget_low 和 vget_high 不产生任何指令 - 这些内在函数是通过适当的寄存器分配实现的,通过利用 Q 寄存器只是命名两个连续 D 寄存器的便捷方式。 Q{n}指的是对(D{2n},D{2n+1})。

VMOVL.U8 q1, d0
VADD.I16 d1, d2

如果想8位进行运算,溢出时饱和,做

const int8x8_t t = vreinterpret_u8_u64(vshr_n_u64(vreinterpret_u64_u8(input), 32));
const int8x8_t r = vqadd_u8(input, t);

这编译为(d0 再次是输入,d1 中的输出)

VSHR.U64 d1, d0, #32
VQADD.I8 d1, d0

通过仅用 VADD 替换 VQADD,结果将在溢出时回绕,而不是饱和到 0xff。

关于c - NEON 寄存器中的添加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11516646/

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