_mm_broadcastsd_pd отсутствует в GCC avx2intrin.h (версии X-9.2) - PullRequest
2 голосов
/ 07 октября 2019

только что обнаружил, что _mm_broadcastsd_pd, который указан в руководстве по встроенным функциям Intel ( ссылка ), не реализован в GCC avx2intrin.h. Я протестировал небольшой пример на Godbolt с последней версией GCC, и он не скомпилируется ( Пример GCC ). Clang делает ( Пример Clang ). То же самое на моем компьютере (GCC 8.3).

Должен ли я подать отчет об ошибке или есть какая-то конкретная причина, почему он не включен? Я имею в виду, конечно, что _mm_movedup_pd делает абсолютно одно и то же, и clang фактически генерирует одну и ту же сборку для обеих встроенных функций, но я думаю, что это не должно быть причиной для ее исключения.

Привет

Редактировать

Создан отчет об ошибке: ссылка

1 Ответ

2 голосов
/ 07 октября 2019

Не все компиляторы имеют все псевдонимы для встроенного (разные имена для одной и той же вещи). Кроме того, чтобы попробовать их на Godbolt, IDK узнает, какие из них являются переносимыми в текущих версиях основных четырех компиляторов.

Но да, GCC / clang допускает ошибки, связанные с отсутствием _mm встроенных функций, особенно тех, которыеДокументы Intel.

_mm_broadcastsd_pd задокументировано Intel как неотъемлемая часть movddup, поэтому вы не пропустите ничего. Что еще более важно, это немного вводит в заблуждение, потому что нет vbroadcastsd xmm, xmm, только с назначением YMM или ZMM . (_mm256_broadcast_sd(double *a); и _mm256_broadcastsd_pd(__m128d a);)

Справочное руководство asm даже не документирует _mm_broadcastsd_pd в vbroadcast или запись movddup ;это только в руководстве по встроенным функциям.

GCC, вероятно, захочет добавить это, тем более, что у clang это есть. Наличие _mm_broadcastsd_pd в качестве псевдонима было бы полезно для людей, которые ищут его и не знают достаточно хорошо, чтобы знать, что им нужен movddup. (Или с инструкциями AVX с 3 операндами, movlhps или unpcklpd то же самое, то же самое)

...