由VS 2008生成的奇怪汇编程序

时间:2013-08-28 11:46:55

标签: c++ visual-studio-2008 assembly

我有一个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

(另见result by AMDCodeAnalyst

任何人都能解释这个集会的作用吗?我不知道为什么会使用cvttss2simovaps,它们不是浮点数吗?

我在Windows 7上使用Visual Studio 2008,启用了SSE2指令集。

1 个答案:

答案 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;