VS 2008生成的奇怪汇编程序
Strange assembler generated by VS 2008
我有一个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的结果)
有人能解释一下这个集会的作用吗?我不知道为什么要用cvttss2si
和movaps
,它们不是用来浮点数的吗?
我使用的是Windows 7上的Visual Studio 2008,并且已启用SSE2指令集。
您看到的只是编译器将前三行合并为一个混合的指令序列。
cvttss2si edi,xmm3
将xmm3作为float
转换为32位int
。假定xmm3包含y_pos
的浮点值,这是(int)
对y_pos
的计算结果。
imul edi,[ecx+04h]
乘以someStruct
0(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;
相关文章:
- 枚举和二进制或运算符(MISRA C++ 2008,4-5-2)
- 为什么编程语言被编译为汇编程序而不是二进制?
- 如何使用Visual Studio 2008将字符串映射到函数?
- 对使用 CMake 生成为 lib .a 的方法的未定义引用
- 使用 2x1 图块平铺 2xM 数组以最大化差异 - INOI 2008,P2
- MSVC 2008,调试过程,无法调试
- 如何生成数组来测试quickSort的最佳情况
- 生成可视C++ 2008 项目时出现链接器错误
- Visual Studio 2008 WriteFile
- VS 2008 和 VS 2017 中静态参数的不同行为
- 如何使用 LLVM 库编写汇编程序
- ICC 中的 -O2 搞砸了汇编程序,ICC 中的 -O1 和 GCC / Clang 中的所有优化都很好
- Microsoft Visual Studio 2008,版本9.0.30739.1 SP,DLL构建错误
- 如何在何处获取 MSVS 2008(32 位)编译器工具链的编译器,而无需安装 MSVS2008
- Doxygen不会为独立函数生成文档
- 如何防止Visual Studio 2008 C编译器在发生某些错误时停止?
- 实现随机生成数组的算法
- 带有矢量切片的矢量指针,用于从预序和顺序向量生成树
- 为什么汇编代码因我使用的反汇编程序而异
- VS 2008生成的奇怪汇编程序