zoukankan      html  css  js  c++  java
  • NEON中的L可以避免溢出

    在做加法时,比如两个255x255的数值相加,那么正确结果将是130050,对一个最大值为65565的unsigned short是会溢出的,但是如果使用L命令时,则不会产生溢出。这说明L命令,不是先执行计算再简单使之long,而是对计算结果就直接针对更宽位。下面代码可以验证。

        ushort data1[4] = {255*255};
        uint16x4_t v0 = vld1_u16(data1);
        uint16x4_t v1 = vld1_u16(data1);
    
        uint16x4_t res = vadd_u16(v0, v1);
        uint32x4_t res0 = vaddl_u16(v0, v1);
        uint32x4_t res1 = vaddq_u32(vmovl_u16(v0), vmovl_u16(v1));
        uint r0[4], r1[4];
        short res3[4];
        ushort res2[4];
        vst1q_u32(r0, res0);
        vst1q_u32(r1, res1);
        vst1_u16(res2, res);
        vst1_s16(res3, vreinterpret_s16_u16(res));
    
        OLOGD("32: %d %d %d %d      %d %d %d %d", res0[0], res0[1], res0[2], res0[3], res1[0], res1[1], res1[2], res1[3]);
        OLOGD("32 c: %d %d %d %d      %d %d %d %d", r0[0], r0[1], r0[2], r0[3], r1[0], r1[1], r1[2], r1[3]);
        OLOGD("u:%d %d %d %d      s:%d %d %d %d", res2[0], res2[1], res2[2], res2[3], res3[0], res3[1], res3[2], res3[3]);
    

    输出为

    D/OLOG:32: 130050 0 0 0      130050 0 0 0
    D/OLOG:32 c: 130050 0 0 0      130050 0 0 0
    D/OLOG:u:64514 0 0 0      s:-1022 0 0 0
    

    而且这个代码说明,可以直接对NEON的vector进行打印,而没必要先保存到CPU内存。

  • 相关阅读:
    【中位数 均分纸牌】 糖果传递
    【模板】 均分纸牌
    【离散化】 电影
    【离散化】 区间和
    【最大子矩阵】 城市游戏
    vue中如何引入Element-ui
    详细教你:如何搭建vue环境和创建一个新的vue项目
    vue中如何引入bootstrap
    十天冲刺(4)
    十天冲刺(3)
  • 原文地址:https://www.cnblogs.com/willhua/p/12482135.html
Copyright © 2011-2022 走看看