Я использую инструкции AVX2 в некотором коде C.
Команда VPERMD принимает два 8-целочисленных вектора a
и idx
и генерирует третий, dst
, путем перестановки a
на основе idx
. Это кажется эквивалентным dst[i] = a[idx[i]] for i in 0..7
. Я вызываю этот источник на основе, потому что перемещение индексируется на основе источника.
Однако у меня есть мои расчетные индексы в форме, основанной на адресатах. Это естественно для установки массива и эквивалентно dst[idx[i]] = a[i] for i in 0..7
.
Как я могу конвертировать из исходной формы в форму на основе адреса? Пример тестового примера:
{2 1 0 5 3 4 6 7} source-based form.
{2 1 0 4 5 3 6 7} destination-based equivalent
Для этого преобразования я остаюсь в ymm-регистрах, так что это означает, что решения на основе адресатов не работают. Даже если я должен был вставлять каждый отдельно, поскольку он работает только с постоянными индексами, вы не можете просто установить их.