代码之家  ›  专栏  ›  技术社区  ›  shang12

如何或霓虹灯矢量的所有车道

  •  0
  • shang12  · 技术社区  · 8 年前


    我想使用NEON内部函数来优化以下代码。

    uint32x4_t c1; // 4 elements, each element is 0 or 1
    uint32x4_t c2; // 4 elements, each element is 0 or 1
    uint8_t pack = 0; // unsigned char, for result
    
    /* some code /*
    
    // need optimizing
    pack |= (vgetq_lane_u32(c1, 0);
    pack |= (vgetq_lane_u32(c1, 1) << 1;
    pack |= (vgetq_lane_u32(c1, 2) << 2;
    pack |= (vgetq_lane_u32(c1, 3) << 3;
    
    
    pack |= (vgetq_lane_u32(c2, 0) << 4;
    pack |= (vgetq_lane_u32(c2, 1) << 5;
    pack |= (vgetq_lane_u32(c2, 2) << 6;
    pack |= (vgetq_lane_u32(c2, 3) << 7;
    

    我认为向量的所有车道都需要一些内部函数。 谁能给我一些提示吗?

    1 回复  |  直到 8 年前
        1
  •  2
  •   Jake 'Alquimista' LEE    8 年前

    您可以将向量中的每个元素移动单独的位数。

    const int32x4_t shifter1 = {0, 1, 2, 3};
    const int32x4_t shifter2 = {4, 5, 6, 7};
    .
    .
    .
    c1 = vshlq_u32(c1, shifter1);
    c2 = vshlq_u32(c2, shifter2);
    
    c1 = vorrq_u32(c1, c2);
    pack |= vgetq_lane_u32(c1, 0) | vgetq_lane_u32(c1, 1) | vgetq_lane_u32(c1, 2) | vgetq_lane_u32(c1, 3);
    

    这应该可以做到,最后一行取决于编译器的质量