Как обмениваться значениями между регистрами XMM?
Существует ли команда x86 или две для обмена значениями между регистрами XMM; похож на инструкцию XCHG? Нельзя использовать память, скретч-регистр или копию XOR.
3 ответа
Вот полностью непроверенный код для арифметического обмена:
vpsubd xmm0, xmm1
vpaddd xmm1, xmm0
vpsubd xmm0, xmm1, xmm0
В отличие от xor, вычитание не является коммутативным, так что вы в конечном итоге получите ту неудачную последнюю строку, которую вы не можете сделать без avx (ну, вы можете, но с пустым регистром, и тогда вам лучше использовать ходы).
Использование скретч-регистра было бы быстрее на большинстве процессоров (кроме P4, я полагаю, но P4 никого не волнует, верно?). На старых процессорах, потому что первые два хода могут выполняться параллельно, на новейших процессорах, потому что они обрабатывают ходы xmm reg-reg во внешнем интерфейсе, используя переименование регистров. Ни переименование регистра, ни обработка инструкций исключительно с переименованием не являются новыми уловками, переименование использовалось начиная с Pentium Pro и fxch
обычно реализуется с помощью переименования. Внедрение xmm reg-reg перемещений с переименованием регистров является довольно новым трюком, хотя это в Ivy Bridge, Haswell, Bulldozer и Piledriver.
Часто вы можете избавиться от обмена в цикле, развернув его на 2. Обмены не в циклах редко необходимы и еще реже являются узким местом.
Реальная ценность в xchg
операция - это использование в примитивах синхронизации, спин-блокировках и т. д. Из-за неявного lock
префикс. Конечно, никто не будет реализовывать синхронизирующие примитивы с использованием SSE, но будет ли обмен иметь какие-либо преимущества? Иногда это может быть полезно, но с 8 регистрами SSE в 32-битном режиме и 16 в 64-битном режиме, почему бы просто не использовать рабочий регистр SSE? Я не знаю, используют ли какие-либо процессоры x86-64 переименование регистров и т. Д. В своих единицах SIMD (для устранения ложных зависимостей).
Вы исключили использование xorps
(или _mm_xor_ps
intrinsic), что в любом случае обычно является бесполезным приемом для современных процессоров - конечно, для регистров общего назначения, и вы исключили использование памяти. Боюсь, что все твои возможности исчерпаны. Подводя итог: Нет.
Использование PXOR
Инструкция - самый короткий и быстрый способ обмена контентом между регистрами XMM. Этот код обменивается контентом между xmm0 и xmm1.
pxor xmm0, xmm1
pxor xmm1, xmm0
pxor xmm0, xmm1
Итак, где вы можете увидеть проблему?