Копирование из регистра в регистр

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
fluck
Сообщения: 3
Зарегистрирован: 04 окт 2009, 22:17

Есть xmm-регистр, в котором хранятся два вещественных числа 2-ой точности (double A,B )
xmm0 = (A,B )
Нужно скопировать эти числа в другой xmm-регистр, допустим xmm1, используя SSE2 интструкции так чтобы число А оказалось в младших 64-битах, а B в старших 64 битах. Т.е:
xmm1 = ( B,A)
И как будет быстрее: поменять сначала числа местами в xmm0-регистре (xmm=(B,A)) и потом его без изменений скопировать в xmm1 или сразу скопировать с преобразованием, не изменяя xmm0
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

&quot писал(а):поменять сначала числа местами в xmm0-регистре
Вообще по условию задачи xmm0 не должен измениться.
Никакие инструкции SSE2 не различают XMM0 и остальные. А значит быстрее будет так:

Код: Выделить всё

pshufd xmm1, xmm0, 01001110b
It's a long way to the top if you wanna rock'n'roll
fluck
Сообщения: 3
Зарегистрирован: 04 окт 2009, 22:17

somewhere писал(а):Вообще по условию задачи xmm0 не должен измениться.
Никакие инструкции SSE2 не различают XMM0 и остальные. А значит быстрее будет так:
спасибо. А если мне нужно переслать данные из ХMMO в два других ХMM -регистра (скажем в XMM1 и XMM2), то вот это:

Код: Выделить всё

pshufd xmm1, xmm0, 01001110b
pshufd xmm2, xmm0, 01001110b
будет ли быстрее, чем:

Код: Выделить всё

pshufd xmm0, xmm0, 01001110b
movapd xmm1,xmm0
movapd xmm2,xmm0
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Если верить мануалу интел, то PSHUFD XMM, XMM задействует строго PORT_0, выполняется за один такт последовательно. А вот MOVAPD\MOVUPD XMM, XMM как на PORT_0 так и на PORT_1 за один такт, это означает что если операнды независимы (например выше результат xmm2 не зависит от xmm1) то обе инструкции movapd выполнятся параллельно за один такт. Значит второй вариант с mov быстрее.
It's a long way to the top if you wanna rock'n'roll
fluck
Сообщения: 3
Зарегистрирован: 04 окт 2009, 22:17

somewhere писал(а):Если верить мануалу интел, то PSHUFD XMM, XMM задействует строго PORT_0, выполняется за один такт последовательно. А вот MOVAPD\MOVUPD XMM, XMM как на PORT_0 так и на PORT_1 за один такт, это означает что если операнды независимы (например выше результат xmm2 не зависит от xmm1) то обе инструкции movapd выполнятся параллельно за один такт. Значит второй вариант с mov быстрее.
Интересная информация. Спасибо. Но это возможно лишь тогда когда инструкции спарены, т.е. идут одна за другой? Или не обязательно?
Если это так, то какие ещё из SSE2-инструкций поддерживают эту фичу?
(очень интересует, будет ли эффект от спаривания 2-х mulpd или addpd)?
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Нет, не обязательно, между ними может быть инструкция, не задействующая АЛУ SSE, она в принципе должна войти в тот же такт, что и те две. Порядок выполнения инструкций определяет конвеер, который определяет какие инструкции между собой зависимы и распределяет вычисления по разным АЛУ.
&quot писал(а):Если это так, то какие ещё из SSE2-инструкций поддерживают эту фичу?
мануал дома, если только вечером посмотрю
It's a long way to the top if you wanna rock'n'roll
Ответить