考虑使用SSE的这两个函数:
#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
也就是说,ftrunc2
比 ftrunc1
多使用了一个 movss
指令!
这种情况是否正常?是否有影响?当您只需要设置底部元素时,_mm_set1_ps
是否始终优于 _mm_set_ss
?
编译器使用的是带有 -O3 -msse
参数的 GCC 4.5.2。
movss
(另一方面,除了指令长度增加外,从性能上来看它可能并没有影响,因为CPU在内部将这两个序列视为相等)。编译器只是在优化SSE内置函数方面做得不太好。 - jalf