我在Q寄存器中有128位数据。我想对此Q寄存器中的单个16位块求和,最终得到一个16位的最终和(任何超过16位的进位都应取并加到此16位数字的LSB上)。
我想要实现的是:
VADD.U16 (一些16位变量) {q0 q01 q02 .........q07}
但是使用内部函数,
如果有人能给我一个算法我会很感激的。
我试着使用成对加法,但我最终得到了一个相当笨拙的解决方案。
下面是它的外观:
int convert128to16(uint16x8_t data128){
uint16_t data16 = 0;
uint16x4_t ddata;
print16(data128);
uint32x4_t data = vpaddlq_u16(data128);
print32(data);
uint16x4_t data_hi = vget_high_u16(data);
print16x4(data_hi);
uint16x4_t data_low = vget_low_u16(data);
print16x4(data_low);
ddata = vpadd_u16( data_hi, data_low);
print16x4(ddata);}
它仍然不完整,有点笨拙..任何帮助都将不胜感激。
发布于 2012-08-04 20:31:40
您可以使用水平添加指令:
下面是一段代码:
uint16x8_t input = /* load your data128 here */
uint64x2_t temp = vpaddlq_u32 (vpaddlq_u16 (input));
uint64x1_t result = vadd_u64 (vget_high_u64 (temp),
vget_low_u64 (temp));
// result now contains the sum of all 16 bit unsigned words
// stored in data128.
// to add the values that overflow from 16 bit just do another 16 bit
// horizontal addition and return the lowest 16 bit as the final result:
uint16x4_t w = vpadd_u16 (
vreinterpret_u16_u64 (result),
vreinterpret_u16_u64 (result));
uint16_t wrappedResult = vget_lane_u16 (w, 0);发布于 2012-08-04 20:21:34
如果你的目标是求16位块的和(模数为16位),下面的代码片段就行了:
uin16_t convert128to16(uint16x8_t data128){
data128 += (data128 >> 64);
data128 += (data128 >> 32);
data128 += (data128 >> 16);
return data128 & 0xffff;
}https://stackoverflow.com/questions/11807894
复制相似问题