Как инициализировать регистр AltiVec из скаляров без использования составных литералов

У меня есть такой код

void op(uint32_t B0, uint32_t B1, uint32_t B2, uint32_t B3)
{
auto v = (__vector unsigned int){B0, B1, B2, B3};
...
}

Когда я его компилирую, GCC предупреждает, что «ISO C ++ запрещает составные литералы». Есть ли другой способ инициализации AltiVec __vector из нескольких скаляров без этой конструкции? Или я должен просто проигнорировать предупреждение.

Я нашел некоторую документацию IBM, которая указала (__vector unsigned int)(B[0], B[1], B[2], B[3]) (обратите внимание на скобки вместо скобок), но GCC отвергает это.

Единственное, о чем я могу думать, — это сначала поместить четыре скаляра в массив, а затем загрузить его из памяти. Однако, похоже, что это будет немного медленнее. Я в основном ищу эквивалент SSE2 _mm_set_epi32 внутренняя.

0

Решение

В прежние времена для этого было два разных синтаксиса, каждый из которых, возможно, стоит попробовать:

__vector unsigned int v = (__vector unsigned int){ B0, B1, B2, B3 }; // gcc syntax

а также

__vector unsigned int v = (__vector unsigned int)(B0, B1, B2, B3); // Motorola syntax

Похоже, вы уже пробовали синтаксис «gcc» (кроме использования auto), но, возможно, синтаксис Motorola может работать?

Единственное другое предложение, которое я могу сделать, если синтаксис Motorola не работает, — это попытаться использовать синтаксис gcc, но скомпилировать его как C, а не C ++, поскольку теперь может возникнуть некоторый конфликт между C ++ 11 и инициализаторами AltiVec в стиле gcc.

0

Другие решения

Других решений пока нет …