假设我在氖中有一个64位d寄存器。让我们说它存储值ABCDEFGH。 现在我想要添加A& E,B& F,C& G,D& H等等。这里有任何内在的可能这样的操作
我查看了文档,但没有找到合适的内容。
答案 0 :(得分:1)
如果希望以16位执行加法,即产生uint16x4结果,可以使用vmovl将输入向量从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。