作为一个随机示例,我使用
g++ -S -O2 -masm=intel(GCC 4.7.1,x86_32)编译了以下代码:
void fill_it_up(int n, int * p, int val){ asm volatile("DEBUG1"); iota_n(p, n, val); asm volatile("DEBUG2"); iota_m(p, n, val); asm volatile("DEBUG3"); for (int i = 0; i != n; ++i) { *p++ = val++; } asm volatile("DEBUG4");}这
iota_n是第一个版本,
iota_m第二个版本。在所有三种情况下,程序集都是这样的:
test edi, edi jle .L4 mov edx, eax neg edx lea ebx, [esi+edx*4] mov edx, eax lea ebp, [edi+eax] .p2align 4,,7 .p2align 3.L9: lea ecx, [edx+1] cmp ecx, ebp mov DWORD PTR [ebx-4+ecx*4], edx mov edx, ecx jne .L9
随着
-O3,三个版本也非常相似,但 很多 更长(使用条件的动作和
punpcklqdq与此类似的)。



