SSE / AVX指令用于加速表达式u32 =(z <&lt; 16)| (y <&lt; 8)| X

时间:2016-11-07 15:37:07

标签: c sse simd avx

我有3个无符号整数,范围为[0,255]。我想将这3个数字存储到一个紧凑的存储器中,因为这个操作经常发生,我想知道如何改进它。

最初我试过这个:

struct Foo {
    uint8_t x;
    uint8_t y;
    uint8_t z;
};

Foo arr[] = ...;

void pushBack(unsigned x, unsigned y, unsigned z) {
    arr[count].x = x;
    arr[count].y = y;
    arr[count++].z = z;
}

结果并不好,所以我尝试了这个:

struct Foo {
    union {
        struct {
            uint8_t x;
            uint8_t y;
            uint8_t z;
            uint8_t pad_;
        } v;
        uint32_t u32;
    };
};

Foo arr[] = ...;

void pushBack(unsigned x, unsigned y, unsigned z) {
    arr[count++].u32 = (z << 16) | (y << 8) | x;
}

结果有所改善。

我想知道是否有办法通过SSE和/或AVX指令进一步改善这一点。

0 个答案:

没有答案