Есть ли одиночный Инструкция SSE для чередования высоких и низких слов двух регистров в другой регистр? Например:SSE, чередующиеся низкие и высокие слова
r[63-0] = a[64-127]
r[64-127] = b[63-0]
Есть ли одиночный Инструкция SSE для чередования высоких и низких слов двух регистров в другой регистр? Например:SSE, чередующиеся низкие и высокие слова
r[63-0] = a[64-127]
r[64-127] = b[63-0]
Нет, поскольку нет тарелок SSE, которые имеют два источника и отдельный пункт назначения. Однако вы можете это сделать, если r
- это то же самое, что и a
, с shufpd
. Если вам необходимо сохранить значение a
:
movapd r, a
shufpd r, b, 1
На последних μarches, тем movapd
свободен и обрабатывается в переименовании [*], так что это эффективно это «одна команда», с точки зрения выполнение основной
Если AVX доступен, вы можете использовать vshufpd
[*] можно насытить эту возможность переименования, в этом случае дополнительные шаги рег-рег будет вести себя как обычный порт 0 |.. 1 5 операций - к счастью, код реального мира почти всегда имеет несколько пузырьков на одном из этих портов, поэтому движение имеет тенденцию оставаться «свободным».
+1 - Я не знал, что у единиц блока есть этот уровень сложности, хотя я не должен удивляться. Интересно, действительно ли недавние микроархивы имеют большие файлы регистров для SSE/AVX? –
Возможно, у них есть некоторые регистры отладки и регистры обслуживания, работающие в фоновом режиме, чтобы увеличить конвейерную обработку (контролируется только процессором?). –
@BrettHale: да, физический файл регистра AVX/SSE примерно такой же, как и файл регистра GPR. –