gpt4 book ai didi

c++ - VS 2008 生成的奇怪汇编器

转载 作者:行者123 更新时间:2023-11-28 03:11:03 24 4
gpt4 key购买 nike

我有一个 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,它们不是用于 float 吗?

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

最佳答案

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

cvttss2si edi,xmm3

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

imul edi,[ecx+04h]

乘以cfg->subdivisions_adj (ecx = cfg, subdivisions_adj = offset of 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;

关于c++ - VS 2008 生成的奇怪汇编器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18486998/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com