我有一个c ++函数,看起来像:
inline unsigned short function_name(float x, float y, someStruct *cfg)
{
int x_pos = (int)(x*2 + 0.5f);
int y_pos = (int)(y*2 + 0.5f);
int dict_index = x_pos + (y_pos * cfg->subdivisions_adj);
[...]
而someStruct
被声明为:
struct someStruct {
int subdivisions;
int subdivisions_adj;
[...]
}
第三行(int dict_index = [...]
)生成的程序集是:
cvttss2si edi,xmm3
imul edi,[ecx+04h]
movss xmm3,[ecx+0ch]
movaps xmm4,xmm3
mulss xmm4,xmm0
addss xmm4,xmm1
cvttss2si eax,xmm4
add edi,eax
任何人都能解释这个集会的作用吗?我不知道为什么会使用cvttss2si
和movaps
,它们不是浮点数吗?
我在Windows 7上使用Visual Studio 2008,启用了SSE2指令集。
答案 0 :(得分:2)
您所看到的只是编译器将前三行合并为一个混合指令序列。
cvttss2si edi,xmm3
将xmm3转换为float
为32位int
。据推测,xmm3包含y_pos
的浮点值,这是(int)
计算结果y_pos
的结果。
imul edi,[ecx+04h]
乘以cfg->subdivisions_adj
(ecx = cfg,subdivisions_adj =偏移量为4)
movss xmm3,[ecx+0ch]
我认为,在cfg
变量中,它将成为...的一部分。
movaps xmm4,xmm3
mulss xmm4,xmm0
adss xmm4,xmm1
计算x_pos = x * 2 + 0.5
cvttss2si eax,xmm4
(int)x_pos;
add edi,eax
将x_pos添加到y_pos * cfg-> subdivisions_adj;