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内存。

posted @ 2020-03-12 19:30  willhua  阅读(446)  评论(0编辑  收藏  举报