私の大学では、IA32 SSE を紹介されたばかりです。私がやろうとしているのは、2 つのベクトルを追加することです (彼らはそれを「パック値」と呼びます。これは、ベクトルに 4 つの 32 ビット単精度浮動小数点数が含まれていることを意味します。1 つのバークターのサイズは 128 ビットです)。すること:
%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
これにより、次の 2 つの疑問が生じます。
1. そもそもこれらのベクトルを作成する方法と、%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