Есть ли какая-либо инструкция SSE2 для преобразования регистра 8x16 в два регистра 4x32, один регистр 4x32 с нечетными индексированными элементами из регистра 8x16 и другие имеют четные индексированные элементы? Пожалуйста, предложите.Инструкция SSE2 для преобразования регистра 8x16 в два регистра 4x32, имеющих четные и нечетные индексированные элементы
ответ
Непроверенными:
movdqa xmm1, xmm0
pslld xmm0, 16
psrad xmm1, 16 ; odd words
psrad xmm0, 16 ; even words
должен быть достаточно легко преобразовать встроенные функции.
Для этого нет единой инструкции, даже в более поздних версиях SSE. Несколько выходов очень редки, в основном зарезервированы для старых инструкций.
pmovsxwd
от SSE4.1 использует (для этой задачи) неправильное подмножество элементов, а именно нижний 4.
+1: приятное решение. –
Если вы собираетесь выполнять операцию над несколькими векторами и находятся на SNB или IVB, может быть небольшая победа в использовании PSHUFB вместо PSLLD, так как она может использовать другой порт, чем сдвиги. Однако это действительно уходит в сорняки, и ваш ответ превосходный, как есть (и, кроме того, PSLLD выигрывает на старых ядрах). –
@ StephenCanon интересный, я об этом не думал. Может быть, немного раздражает, чтобы получить там тасовую маску, 'palignr' тоже будет работать, верно? Также идет в другой порт на Sandy (где вы получили список для IVB?) И менее ужасно медленный, чем 'pshufb' на Core2 65nm, преимущества вокруг, я думаю, – harold
Примечание уверен, что если есть одна команда для этого, но что-то вроде этого должно работать (непроверенные):
; Assume that the 8 16-bit values are in xmm0
PSHUFLW xmm1,xmm0,0D8h ; Change word order to 3120 in the low qword
PSHUFHW xmm1,xmm1,0D8h ; Change word order to 3120 in the high qword
PSHUFD xmm1,xmm1,0D8h ; Change dword order to 3120
MOVAPD xmm0,xmm1 ; Copy to xmm0
PUNPCKLWD xmm0,xmm0 ; Expand even words to dwords
PUNPCKHWD xmm1,xmm1 ; Expand odd words to dwords
PSLLD xmm0,16 ; Sign-extend
PSRAD xmm0,16 ; ...
PSLLD xmm1,16
PSRAD xmm1,16
xmm0
должны теперь содержат 4 даже слова по знаку до 32 бит, и xmm1
должны содержат нечетные слова.
Если вы можете использовать инструкции SSE4.1, можно немного упростить часть расширения знака. Для четных слов (xmm0
) можно заменить распаковку и две смены с:
PMOVSXWD xmm0,xmm0
Вы собираетесь хочет добавить «x86» и «сборка» метку или «с» и/или "C++", чтобы уточнить, в каком вы хотите. (сборка или встроенные функции) – Mysticial
Независимо от того, будут ли подписаны операнды, вам нужно либо выполнить нуль-расширение, либо подписывать расширенные данные при копировании на новый формат 4x32. Подпись или без знака? – doug65536
Операнды подписаны. – Andy