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 */