2013-11-18 3 views
7

Я знаю, что это должен быть вопрос с Google, но я просто не могу найти ответ.Как изменить переменную типа __m128?

Скажем, у меня есть __m128 переменную a, содержание которого является a[0], a[1], a[2], a[3]. Есть ли одиночный функция, которая может отменить ее как a[3], a[2], a[1], a[0]?

ответ

13

Использование _mm_shuffle_ps(). Эта инструкция уже была доступна в SSE и может собирать 4 32-битных элемента в одном векторе путем объединения двух произвольных 32-битных элементов из каждого из двух входных векторов.

Как создать маску с помощью макроса _MM_SHUFFLE()

Первые два значения маски обозначают компоненты источника в m1, два последних те, в m2.

http://oi43.tinypic.com/24qn5lk.jpg

Реверсивный 32-битных элементов в векторе

__m128 input = ...; 
__m128 reversed = _mm_shuffle_ps(input,input,_MM_SHUFFLE(0, 1, 2, 3)); 

Примечание: Маска непосредственное значение. Он не может быть динамическим, поскольку он является частью полученной машинной команды.

+1

N.B. Чтобы произвольно перетасовать один вектор (вместо того, чтобы перетасовывать два разных вектора вместе с некоторыми ограничениями), первые два аргумента в '_mm_shuffle_ps()' будут одинаковыми. – Sneftel

Смежные вопросы