Как получить нулевое значение VSX?
Мы переставляем вектор в нескольких местах, и нам нужно отличительное значение 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);
Вторая стратегия - это 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?
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
...