SSE を使用した次の 2 つの関数について考えてみましょう。
#include <xmmintrin.h>
int ftrunc1(float f) {
return _mm_cvttss_si32(_mm_set1_ps(f));
}
int ftrunc2(float f) {
return _mm_cvttss_si32(_mm_set_ss(f));
}
両方とも、入力に対する動作はまったく同じです。しかし、アセンブラーの出力は異なります。
ftrunc1:
pushl %ebp
movl %esp, %ebp
cvttss2si 8(%ebp), %eax
leave
ret
ftrunc2:
pushl %ebp
movl %esp, %ebp
movss 8(%ebp), %xmm0
cvttss2si %xmm0, %eax
leave
ret
つまり、 1 つの命令を余分にftrunc2
使用します。movss
これは正常ですか?それは問題ですか?一番下の要素のみを設定する必要がある場合は、_mm_set1_ps
常に優先する必要がありますか?_mm_set_ss
使用したコンパイラは GCC 4.5.2 with -O3 -msse
.