首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Q寄存器中(和)128位数据转换为16位数据的高效算法

Q寄存器中(和)128位数据转换为16位数据的高效算法
EN

Stack Overflow用户
提问于 2012-08-04 18:33:21
回答 2查看 524关注 0票数 2

我在Q寄存器中有128位数据。我想对此Q寄存器中的单个16位块求和,最终得到一个16位的最终和(任何超过16位的进位都应取并加到此16位数字的LSB上)。

我想要实现的是:

VADD.U16 (一些16位变量) {q0 q01 q02 .........q07}

但是使用内部函数,

如果有人能给我一个算法我会很感激的。

我试着使用成对加法,但我最终得到了一个相当笨拙的解决方案。

下面是它的外观:

int convert128to16(uint16x8_t data128){

代码语言:javascript
复制
    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);

}

它仍然不完整,有点笨拙..任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-04 20:31:40

您可以使用水平添加指令:

下面是一段代码:

代码语言:javascript
复制
  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);
票数 3
EN

Stack Overflow用户

发布于 2012-08-04 20:21:34

如果你的目标是求16位块的和(模数为16位),下面的代码片段就行了:

代码语言:javascript
复制
uin16_t convert128to16(uint16x8_t data128){

  data128 += (data128 >> 64);

  data128 += (data128 >> 32);

  data128 += (data128 >> 16);

  return data128 & 0xffff;

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11807894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档