考虑使用 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
使用一条指令!movss
这是正常的吗?有关系吗?当您只需要设置底部元素时,应该_mm_set1_ps
始终首选?_mm_set_ss
使用的编译器是 GCC 4.5.2,带有-O3 -msse
.