如何获得零的 VSX 值?
How to obtain a VSX value of zero?
我们在几个地方排列了一个向量,我们需要区分 0 值以与 vec_perm
内置一起使用。我们无法找到 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);
第二种策略是使用我们打算使用的掩码进行异或:
__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 值?
我建议让编译器为您处理。只需初始化为零:
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
...
我们在几个地方排列了一个向量,我们需要区分 0 值以与 vec_perm
内置一起使用。我们无法找到 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);
第二种策略是使用我们打算使用的掩码进行异或:
__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 值?
我建议让编译器为您处理。只需初始化为零:
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
...