Как получить нулевое значение 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
    ...
Другие вопросы по тегам