Преобразование между SSE и NEON Intrinsics-Shuffling

Я пытаюсь преобразовать код, написанный на встроенных функциях SSE3, в NEON SIMD и застрял из-за функции перемешивания. Я просмотрел GCC Intrinsic , ] Руководства по ARM и другие форумы, но не смогли найти решения.

КОД:

_m128i upper = _mm_loadu_si128((__m128i*)p1);

register __m128i mask1 = _mm_set_epi8 (0x80,0x80,0x80,0x80,0x80,0x80,0x80,12,0x80,10,0x80,7,0x80,4,0x80,1);
register __m128i mask2 = _mm_set_epi8 (0x80,0x80,0x80,0x80,0x80,0x80,12,0x80,10,0x80,7,0x80,4,0x80,1,0x80);
__m128i temp1_upper = _mm_or_si128(_mm_shuffle_epi8(upper,mask1),_mm_shuffle_epi8(upper,mask2));

Хотя инструкция vtbl1_u8 (uint8x8_t, uint8x8_t) создает таблицу поиска, которая может использоваться для присвоения значений регистру назначения, она работает только с 64-битными регистрами. Также операция перемешивания выполняет сравнение в запуск, который должен быть выполнен в NEON, и я не знаю, как это сделать эффективно.

r0 = (маска0 & 0x80)? 0: SELECT (a, mask0 & 0x0f) // SELECT (a, n) извлекает n-й 8-битный параметр из a.

r1 = (маска1 & 0x80)? 0: SELECT (a, mask1 & 0x0f)

...

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

Большое спасибо,

Ура!

6
задан ehird 14 May 2012 в 22:02
поделиться