VS 2008生成的奇怪汇编程序

Strange assembler generated by VS 2008

本文关键字:汇编程序 2008生 VS      更新时间:2023-10-16

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

而CCD_ 1被声明为:

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的结果)

有人能解释一下这个集会的作用吗?我不知道为什么要用cvttss2simovaps,它们不是用来浮点数的吗?

我使用的是Windows 7上的Visual Studio 2008,并且已启用SSE2指令集。

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

cvttss2si edi,xmm3

将xmm3作为float转换为32位int。假定xmm3包含y_pos的浮点值,这是(int)y_pos的计算结果。

imul edi,[ecx+04h]

乘以someStruct0(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;