以前は FPU との統合タスクを行っていましたが、現在は SSE に苦労しています。
私の主な問題は、FPUスタックを使用していたときfsin
に、スタックの一番上(st0)にある番号で使用できる関数があったことです。
ここで、 で 4 つの数値すべてのサインをXMM0
計算するか、別の場所で計算してから に移動したいと考えていますXMM0
。AT&T 構文を使用しています。
2番目のアイデアは実際に可能だと思いますが、方法がわかりません:)
誰もそれを行う方法を知っていますか?
3 つのオプション:
sin
SSE ベクトルを計算する既存のライブラリを使用します。sin
SSE を使用して独自のベクトル関数を記述します。ベクトルをメモリにfsin
保存し、各要素のサインを計算するために使用し、結果を読み込みます。スタックが 16 バイトにアラインされており、16 バイトのスペースがあると仮定すると、次のようになります。
movaps %xmm0, (%rsp)
mov $3, %rcx
0: flds (%rsp,%rcx,4)
fsin
fstps (%rsp,%rcx,4)
sub $1, %rcx
jns 0b
(1) は、ほぼ確実にパフォーマンス面で最善の策であり、最も簡単でもあります。ベクトル コードを記述した豊富な経験があり、引数が特定の範囲に収まることをアプリオリに知っている場合は、(2) を使用してパフォーマンスを向上させることができる場合があります。を使用してfsin
も機能しますが、問題がある場合は、醜くて遅く、特に正確ではありません。