0

我需要在uint16x8_t向量下进行一些并行比较,并根据它增加一些局部变量(计数器),例如 +8 增量,如果向量的所有元素比较为真。我实现了这个算法:

...
register int objects = 0;
uint16x8_t vcmp0,vobj;
uint32x2_t dobj;
register uint32_t temp0;
...
vobj = vreinterpretq_u16_u8(vcntq_u8(vreinterpretq_u8_u16(vcmp0))); 
vobj = vpaddlq_u8(vreinterpretq_u8_u16(vobj)); 
vobj = vreinterpretq_u16_u32(vpaddlq_u16(vobj)); 
vobj = vreinterpretq_u16_u64(vpaddlq_u32(vreinterpretq_u32_u16(vobj))); 
dobj = vmovn_u64(vreinterpretq_u64_u16(vobj));
dobj = vreinterpret_u32_u64(vpaddl_u32(dobj));
    __asm__ __volatile__
            (
             "vmov.u32  %[temp0] , %[dobj][0]               \n\t"
             "add  %[objects] ,%[objects], %[temp0], asr #4               \n\t"
             : [dobj]"+w"(dobj), [temp0]"=r"(temp0), [objects]"+r"(objects)
             :
             : "memory"
            );

...

向量vcmp0包含比较的结果vobjdobj用于计算,objects是计数器。我正在使用设置位计数和成对相加进行计算。有没有更快的方法来完成这项工作?

4

0 回答 0