В моем университете мы только что познакомились с IA32 SSE. То, что я пытаюсь сделать, это добавить два вектора (они называют это «упакованным значением», это означает, что вектор содержит четыре 32-битных числа с плавающей запятой с одинарной точностью. Размер одного из них составляет 128 бит.) Вот что я пытаюсь делать:Выполнение простой арифметической операции с использованием SSE (сборка IA32)
%xmm0 | 5.5 | 1.2 | 2.4 | 7.0 |
%xmm1 | 3.0 | 1.5 | 3.5 | 2.2 |
| | | |
+ + + +
| | | |
V V V V
%xmm0 | 8.5 | 2.7 | 5.9 | 9.2 |
Однако на слайдах они только показывают, следующий фрагмент кода, который я просто не попасть на работу:
# %eax and %ebx contain the addresses of the two vectors that are to be added
movups (%eax), %xmm0
movups (%ebx), %xmm1
addps %xmm1, %xmm0
movups %xmm0, result
Возникают два вопроса:
1 Как я даже создаю эти векторы в первую очередь и h Должен ли я сделать% eax и% ebx указать на них?
2. Как распечатать результат, чтобы проверить, была ли операция успешной или нет?
Вот что я пробовал. Следующий код компилируется и не сбой при запуске. Тем не менее, нет никакого вывода вообще ...:/
.data
x0: .float 7.0
x1: .float 2.4
x2: .float 1.2
x3: .float 5.5
y0: .float 2.2
y1: .float 3.5
y2: .float 1.5
y3: .float 3.0
result: .float 0
intout: .string "Result: %f.\n"
.text
.global main
main:
pushl x3
pushl x2
pushl x1
pushl x0
movl %esp, %eax
pushl y3
pushl y2
pushl y1
pushl y0
movl %esp, %ebx
movups (%eax), %xmm0
movups (%ebx), %xmm1
addps %xmm1, %xmm0
movups %xmm0, result
pushl result
pushl $intout
call printf
addl $40, %esp
movl $1, %eax
int $0x80
'movups% XMM0, result' напишут все 128 бит' xmm0' в 'result', но вы объявили' result' как 'float' (32 бит), поэтому он будет перезаписывать части строки 'intout'. – Michael
Ваш результат должен быть достаточно длинным, чтобы содержать 4 значения, теперь 'movups% xmm0, result' также разрушает вашу строку. –
Спасибо за ваш быстрый ответ! Как объявить «результат» таким образом, чтобы он составлял 128 бит? – lambdarookie