2017-09-09 41 views
5

我们在几个地方对一个向量进行排列,我们需要使用内置的vec_perm来区分0值。我们一直无法找到vec_zero()或类似的东西,所以我们想知道我们应该如何处理。如何获得VSX值为零?

该代码目前使用两种策略。第一个策略是一个载体负载:

__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); 

第二种策略是使用掩膜我们打算使用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); 

我们还没开始基准(还),所以我们不知道一个人是否比另一个人好。第一种策略使用VMX负载,可能会很昂贵。第二种策略避免了负载,但引入了数据依赖性。

我们如何获得VSX值为零?

+0

如果你只是初始化向量变量为零通常的方式(请注意,有两种不同的语法,取决于你使用的是哪种编译器),那么编译器通常会选择哪种方法更有效地将零矢量化为矢量。 –

+0

你当然可以使用vec_splat的立即形式来表示零和其他小值。 –

回答

1

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

const uint8x16_p8 zero = {0}; 

- 可能编译为xor

例如,一个简单的测试:

vector char foo(void) 
{ 
    const vector char zero = {0}; 
    return zero; 
} 

在我的机器,这编译为:

0000000000000000 <foo>: 
    0: d7 14 42 f0  xxlxor vs34,vs34,vs34 
    4: 20 00 80 4e  blr 
    ...