MOVL多数据指令与装配优化对比
movl multi-data instruction and assembly optimization comparison
考虑一个简单的循环:
for(int i=0;i<32;i++)
a[i] = i;
LLVM 拆装器显示以下程序集:
.LBB0_1: # =>This Inner Loop Header: Depth=1
movl %eax, (%esp,%eax,4)
addl $1, %eax
adcl $0, %ecx
cmpl $32, %eax
jne .LBB0_1
# BB#2:
xorl %eax, %eax
addl $140, %esp
ret
问题1:谁能解释movl %eax, (%esp,%eax,4)
指令?
此外,Visual Studio拆装器输出以下程序集:
;for(int i=0;i<32;i++)
00F290B5 mov dword ptr [ebp-94h],0
00F290BF jmp main+60h (0F290D0h)
00F290C1 mov eax,dword ptr [ebp-94h]
00F290C7 add eax,1
00F290CA mov dword ptr [ebp-94h],eax
00F290D0 cmp dword ptr [ebp-94h],20h
00F290D7 jge main+7Eh (0F290EEh)
;a[i] = i;
00F290D9 mov eax,dword ptr [ebp-94h]
00F290DF mov ecx,dword ptr [ebp-94h]
00F290E5 mov dword ptr a[eax*4],ecx
00F290EC jmp main+51h (0F290C1h)
;return 0;
00F290EE xor eax,eax
显然,LLVM的输出更加优化。
问题2:Visual Studio中是否有一个选项可以像LLVM那样优化代码?
更新:
将"解决方案配置"设置为"发布和优化"以"完全优化 (/Ox( "后的结果:
; int a[32] = {0};
; for(int i=0;i<32;i++)
0039128B xor eax,eax
0039128D lea ecx,[a]
00391293 movd xmm0,eax
00391297 pshufd xmm0,xmm0,0
0039129C paddd xmm0,xmm1
003912A0 add eax,4
; {
; a[i] = i;
003912A3 movdqu xmmword ptr [ecx],xmm0
003912A7 lea ecx,[ecx+10h]
003912AA cmp eax,20h
003912AD jl main+23h (0391293h)
; }
; return 0;
; };
003912AF mov ecx,dword ptr [ebp-4]
003912B2 xor ecx,ebp
003912B4 xor eax,eax
003912B6 call __security_check_cookie (03916FDh)
003912BB mov esp,ebp
003912BD pop ebp
003912BE ret
movl %eax, (%esp,%eax,4)
只是一个间接的内存存储。
它将%eax
存储到内存位置:%esp + %eax * 4
。在这种情况下:
-
%esp
是数组a
。 -
%eax
是索引i
。 -
4
是int
的大小。
对于第二个问题,Visual Studio 输出的代码看起来像是在没有优化的情况下完成的。内存负载和存储过多。
例如:dword ptr [ebp-94h]
似乎是索引i
变量。但是如果没有优化,它从未被提升为寄存器。
启用优化,您将看到它将生成更合理的代码。
相关文章:
- 在PROGMEM中添加更多数据会中断Arduino Mega 2560上的SPI传输
- 如何使用 g2o 优化多约束函数
- 使用谷神星优化多维函数
- 如何让MSVC编译器优化多步POD初始化?
- 结构内具有更多数据类型的单个链表
- 在 C++ 的 iov 中存储更多数据
- 使用清理代码优化多个出口点
- C 和卷发:无法接收握手,需要更多数据
- 如何优化多个图像缝合
- C++使用sql连接器获取元数据,而不需要太多数据
- 优化地图数据结构的地图
- 编译器可以优化多个相同功能调用吗?
- C++简体版链表,当我加载数据以创建链表并输入更多数据时,似乎存在差距
- Vtk检查多数据对象是否相交
- C++链表实现多数据插入
- MOVL多数据指令与装配优化对比
- C++多次使用更多数据缓冲区
- 优化多目标的A*路径查找
- 读取svm数据并使用更多数据进行再训练
- hiredis,如何检查是否有更多数据可供读取