如何获得VSX值为零?

jww*_*jww 5 c powerpc built-in altivec

我们在几个地方置换一个向量,我们需要使用vec_perm内置的可识别0值.我们无法找到vec_zero()或类似,所以我们想知道我们应该如何处理事情.

该代码目前使用两种策略.第一个策略是矢量加载:

__attribute__((aligned(16)))
static const uint8_t z[16] =
    { 0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0 };

const uint8x16_p8 zero = vec_ld(0, z);
Run Code Online (Sandbox Code Playgroud)

第二个策略是使用我们打算使用的掩码的xor:

__attribute__((aligned(16)))
static const uint8_t m[16] =
    { 15,14,13,12,  11,10,9,8,  7,6,5,4, 3,2,1,0 };

const uint8x16_p8 mask = vec_ld(0, m);
const uint8x16_p8 zero = vec_xor(mask, mask);
Run Code Online (Sandbox Code Playgroud)

我们还没有开始基准测试,所以我们不知道一个是否优于另一个.第一种策略使用VMX负载,但价格昂贵.第二种策略避免了负载,但引入了数据依赖性.

我们如何获得零VSX值?

Jer*_*err 2

我建议让编译器为你处理它。只需初始化为零:

const uint8x16_p8 zero = {0};
Run Code Online (Sandbox Code Playgroud)

- 这可能会编译为xor.

例如,一个简单的测试:

vector char foo(void)
{
    const vector char zero = {0};
    return zero;
}
Run Code Online (Sandbox Code Playgroud)

在我的机器上,这会编译为:

0000000000000000 <foo>:
   0:   d7 14 42 f0     xxlxor  vs34,vs34,vs34
   4:   20 00 80 4e     blr
    ...
Run Code Online (Sandbox Code Playgroud)