Как обмениваться значениями между регистрами 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

Итак, где вы можете увидеть проблему?

Другие вопросы по тегам