У меня есть такой код
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
внутренняя.
В прежние времена для этого было два разных синтаксиса, каждый из которых, возможно, стоит попробовать:
__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.
Других решений пока нет …