ENTRYマクロ

このマクロはLinuxカーネルXenなどのたくさんのプログラムに使用されている。このマクロの特徴は、.alignのディレクティブを使用し、次の命令を4バイト境界のメモリに配置するようにnop命令を挿入する。
次のようなコードでベンチマークを行ってみるとパフォーマンスの向上していることがわかる。

以下のコードはadd1_sub.S

#if defined(USE_ENTRY)

#define ALIGN .align 4,0x90

#define ENTRY(name)     \
        .globl name;    \
        ALIGN;          \
        name:

ENTRY(add1)
        push    %rbp
        mov     %rsp, %rbp
        movl    %edi, -4(%rbp)
        incl    -4(%rbp)
        movl    -4(%rbp), %eax
        leaveq
        retq

#endif

以下のコードはadd1.c

#include <stdio.h>

#if !defined(USE_ENTRY)
int add1(int x)
{
	return ++x;
}
#endif

int main(void)
{
	long i, x = 0;

	for (i = 0; i < 1000000000; i++)
		x = add1(x);

	return 0;
}

/*
$ gcc -g -DUSE_ENTRY add1.c add1_sub.S && time ./a.out
$ ./a.out  7.10s user 0.02s system 99% cpu 7.117 total

00000000004004d0 <add1>:
  4004d0:       55                      push   %rbp
  4004d1:       48 89 e5                mov    %rsp,%rbp
  4004d4:       89 7d fc                mov    %edi,0xfffffffffffffffc(%rbp)
  4004d7:       ff 45 fc                incl   0xfffffffffffffffc(%rbp)
  4004da:       8b 45 fc                mov    0xfffffffffffffffc(%rbp),%eax
  4004dd:       c9                      leaveq
  4004de:       c3                      retq
  4004df:       90                      nop
*/

/*
$ gcc -g add1.c add1_sub.S && time ./a.out
$ ./a.out  7.78s user 0.00s system 100% cpu 7.776 total

0000000000400428 <add1>:
  400428:       55                      push   %rbp
  400429:       48 89 e5                mov    %rsp,%rbp
  40042c:       89 7d fc                mov    %edi,0xfffffffffffffffc(%rbp)
  40042f:       ff 45 fc                incl   0xfffffffffffffffc(%rbp)
  400432:       8b 45 fc                mov    0xfffffffffffffffc(%rbp),%eax
  400435:       c9                      leaveq
  400436:       c3                      retq
*/