0

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

    [...]

whilesomeStruct声明为:

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

(另见AMDCodeAnalyst 的结果

谁能解释这个程序集的作用?我不知道为什么cvttss2si并且movaps完全被使用,它们不是用于浮点数吗?

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

4

1 回答 1

2

您所看到的只是编译器将前三行合并为一个混合的指令序列。

cvttss2si edi,xmm3

将 xmm3 转换为float32-bit 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;

于 2013-08-28T12:01:51.510 回答