首页 > 其他 > 详细

NEON中的L可以避免溢出

时间:2020-03-12 20:14:17      阅读:78      评论:0      收藏:0      [点我收藏+]

在做加法时,比如两个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内存。

NEON中的L可以避免溢出

原文:https://www.cnblogs.com/willhua/p/12482135.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!