2016-05-07 4 views
1

В AVX есть ли какой-либо специальный макрос, который помогает построить непосредственную константу для встроенных функций _mm256_shuffle_*, например _MM_SHUFFLE(..) для своего аналога SSE? Я не могу найти.Макрос для генерации непосредственных для свойств AVX-перетасовки

ответ

3

Вы по-прежнему используете _MM_SHUFFLE() для перетасовки, которые принимают вход управления как 8-битный. например _mm256_shuffle_epi32 (vpshufd) делает ту же перетасовку на обеих полосах движения.

_MM_SHUFFLE(dd,cc,bb,aa) просто упаковывает низкие 2 бита каждого аргумента в 0bddccbbaa.

Вы можете написать _MM_SHUFFLE(1,1,1,1) (элемент вещания 1) как 0b01010101, то есть 0x55.

Вы можете использовать разделители C++ 14 (или что бы они ни называли), чтобы записать его как 0b01'01'01'01 для лучшей удобочитаемости человека, особенно. в случаях, когда каждый элемент отличается.

+0

Я думаю, что база-4 в этом случае лучше, чем двоичная. Две цифры базового 4 - это одна базовая цифра 16 (шестнадцатеричная). Например, если вы хотите перетасовать 3,1,1,2, что будет 3 * 4 + 1, 1 * 4 + 2 = 0xda. С другой стороны, _MM_SHUFFLE в основном базовый 4 и более читаемый. –

+0

@Zboson: можете ли вы использовать base-4 в C? Я использую _MM_SHUFFLE в C, но '0baabbccdd' в asm. Я думаю, что в файле '.S', который gcc будет запускать через CPP перед сборкой, вы можете скопировать определение макроса для _MM_SHUFFLE. –

+0

Нет, я делаю это в своей голове и записываю шестнадцатеричное значение, или я пишу комментарий. Но '_MM_SHUFFLE' в основном представляет собой макрос базы 4. –