SSE лучший способ установить регистр на 0,0 и 1,0? - PullRequest
3 голосов
/ 04 февраля 2011

Я занимаюсь математикой sse vector3.

Обычно я устанавливаю четвертую цифру моего вектора на 1.0f, так как это делает большую часть моей математической работы, но иногда мне нужно установить ее на 0.0f.

Итак, я хочу изменить что-то вроде: (32.4f, 21.2f, -4.0f, 1.0f) на (32.4f, 21.2f, -4.0f, 0.0f)

Мне было интересно, каков наилучший способ сделать это:

  1. Конвертировать в 4 числа с плавающей запятой, установить 4 число с плавающей запятой, отправить обратно в SSE
  2. или зарегистрировать сам себя, затем выполнить 2shufps
  3. Выполните все вычисления по SSE с 1.0f, а затем установите переменные на то, какими они должны быть, когда закончите.
  4. Другие?

Примечание: вектор уже находится в регистре SSE, когда мне нужно его изменить.

Ответы [ 5 ]

5 голосов
/ 06 февраля 2011

И с постоянной маской.

В сборке ...

myMask:
.long 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000

...
andps  myMask, %xmm#

где # = {0, 1, 2, ....}

Надеюсь, это поможет.

4 голосов
/ 09 февраля 2011

Предполагая, что ваш исходный вектор находится в xmm0:

; xmm0 = [x y z w]
xorps %xmm1, %xmm1         ; [0 0 0 0]
pcmpeqs %xmm2, %xmm2       ; [1 1 1 1] 
movss %xmm1, %xmm2         ; [0 1 1 1]
pshufd $0x20, %xmm1, %xmm2 ; [1 1 1 0]
andps %xmm2, %xmm0         ; [x y z 0]

должно быть быстрым, поскольку оно не обращается к памяти.

2 голосов
/ 06 февраля 2011

Если вы хотите сделать это без доступа к памяти, вы можете понять, что значение 1 содержит нулевое слово, а нулевое значение - все нули.Таким образом, вы можете просто скопировать нулевое слово в другое.Если у вас 1 в самом высоком dword, pshufhw xmm0, xmm0, 0xa4 должен выполнить трюк:

(gdb) ni
4       pshufhw $0xa4, %xmm0, %xmm0
(gdb) p $xmm0.v4_float
$4 = {32.4000015, 21.2000008, -4, 1}
(gdb) ni
5       ret
(gdb) p $xmm0.v4_float
$5 = {32.4000015, 21.2000008, -4, 0}

Подобный трюк для других локаций оставлен в качестве упражнения для читателя:)

1 голос
/ 04 февраля 2011
0 голосов
/ 05 февраля 2011

Почему бы не умножить ваш векторный элемент на [1 1 1 0]? Я почти уверен, что есть инструкция SSE для поэлементного умножения.

Затем, чтобы вернуться к вектору с 1 в 4-м измерении, просто добавьте [0 0 0 1]. Опять же, для этого есть инструкция SSE.

...