增加霓虹灯寄存器

时间:2012-07-17 05:45:10

标签: c assembly addition neon intrinsics

假设我在氖中有一个64位d寄存器。让我们说它存储值ABCDEFGH。 现在我想要添加A& E,B& F,C& G,D& H等等。这里有任何内在的可能这样的操作

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

1 个答案:

答案 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。