#blognavi
gcc で 64bit バイナリ作成
Xcode は PowerPC を今でもコンパイル出來るのね。
$ file /usr/bin/gcc
/usr/bin/gcc: Mach-O universal binary with 3 architectures
/usr/bin/gcc (for architecture i386): Mach-O executable i386
/usr/bin/gcc (for architecture ppc7400): Mach-O executable ppc
/usr/bin/gcc (for architecture x86_64): Mach-O 64-bit executable x86_64
コンパイルオプションは、
$ gcc -arch x86_64 -arch i386 -arch ppc
などとすれば O.K.
試しにやってみたのだが、
$ gcc -arch arm
gcc-4.2: error trying to exec '/usr/bin/arm-apple-darwin10-gcc-4.2.1': execvp: No such file or directory
$ gcc -arch mips
gcc-4.2: Invalid arch name : mips
となるところを見ると、iPhone用の開發環境入れると arm のコードもコンパイル出來るやうになるのかな。
universal binary の方が、Java VM などのアプローチより、リアルタイムゲームなどで有利だらうな。
試しにこんなプログラムを書いて、x86_64(64bit) と i386(32bit) を比較。
$ cat main.c
#include <stdio.h>
int
sub(int a, int b, int c, int d)
{
return (a + b + c + d);
}
int
main(int argc, char *argv[])
{
register int a = 1, b = 2, c = 3, d = 4, i;
for (i = 0; i < 1000000000; i++) {
a = sub(a, b, c, d);
b = sub(a, b, c, d);
c = sub(a, b, c, d);
d = sub(a, b, c, d);
}
printf("%s: result = %d\n", argv[0], a);
return (0);
}
$ for arch in x86_64 i386
for> do
for> gcc -O -S -arch $arch main.c -o $arch.s
for> gcc -arch $arch $arch.s -o $arch
for> time ./$arch
for> done
./x86_64: result = -1295859711
./$arch 9.93s user 0.05s system 84% cpu 11.784 total
./i386: result = -1295859711
./$arch 18.90s user 0.08s system 81% cpu 23.151 total
うーん、倍くらゐ速い。さすが 32bit から 64bit とビット數が倍になっただけのことは有る。(嘘)
本當はレジスタ數が影響するコードにしてみただけなんだけどね。レジスタ數が多いってのはいいなー。
以下はニーモニック。比べて見るとよく分る。
$ cat x86_64.s
.text
.globl _sub
_sub:
LFB3:
pushq %rbp
LCFI0:
movq %rsp, %rbp
LCFI1:
addl %edi, %esi
addl %edx, %esi
leal (%rsi,%rcx), %eax
leave
ret
LFE3:
.cstring
LC0:
.ascii "%s: result = %d\12\0"
.text
.globl _main
_main:
LFB4:
pushq %rbp
LCFI2:
movq %rsp, %rbp
LCFI3:
pushq %r15
LCFI4:
pushq %r14
LCFI5:
pushq %r13
LCFI6:
pushq %r12
LCFI7:
pushq %rbx
LCFI8:
subq $24, %rsp
LCFI9:
movq %rsi, -56(%rbp)
movl $1, %r14d
movl $2, %r13d
movl $3, %r12d
movl $4, %ebx
movl $0, %r15d
L4:
movl %ebx, %ecx
movl %r12d, %edx
movl %r13d, %esi
movl %r14d, %edi
call _sub
movl %eax, %r14d
movl %ebx, %ecx
movl %r12d, %edx
movl %r13d, %esi
movl %eax, %edi
call _sub
movl %eax, %r13d
movl %ebx, %ecx
movl %r12d, %edx
movl %eax, %esi
movl %r14d, %edi
call _sub
movl %eax, %r12d
movl %ebx, %ecx
movl %eax, %edx
movl %r13d, %esi
movl %r14d, %edi
call _sub
movl %eax, %ebx
incl %r15d
cmpl $1000000000, %r15d
jne L4
movl %r14d, %edx
movq -56(%rbp), %rax
movq (%rax), %rsi
leaq LC0(%rip), %rdi
movl $0, %eax
call _printf
movl $0, %eax
addq $24, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
leave
ret
(以下略)
$ cat i386.s
.text
.globl _sub
_sub:
pushl %ebp
movl %esp, %ebp
movl 12(%ebp), %eax
addl 8(%ebp), %eax
addl 16(%ebp), %eax
addl 20(%ebp), %eax
leave
ret
.cstring
LC0:
.ascii "%s: result = %d\12\0"
.text
.globl _main
_main:
pushl %ebp
movl %esp, %ebp
pushl %edi
pushl %esi
pushl %ebx
subl $44, %esp
call L9
"L00000000001$pb":
L9:
popl %ebx
movl $1, -36(%ebp)
movl $2, -32(%ebp)
movl $3, %edi
movl $4, %esi
movl $0, -28(%ebp)
L4:
movl %esi, 12(%esp)
movl %edi, 8(%esp)
movl -32(%ebp), %eax
movl %eax, 4(%esp)
movl -36(%ebp), %eax
movl %eax, (%esp)
call _sub
movl %eax, -36(%ebp)
movl %esi, 12(%esp)
movl %edi, 8(%esp)
movl -32(%ebp), %eax
movl %eax, 4(%esp)
movl -36(%ebp), %eax
movl %eax, (%esp)
call _sub
movl %eax, -32(%ebp)
movl %esi, 12(%esp)
movl %edi, 8(%esp)
movl %eax, 4(%esp)
movl -36(%ebp), %eax
movl %eax, (%esp)
call _sub
movl %eax, %edi
movl %esi, 12(%esp)
movl %eax, 8(%esp)
movl -32(%ebp), %eax
movl %eax, 4(%esp)
movl -36(%ebp), %eax
movl %eax, (%esp)
call _sub
movl %eax, %esi
incl -28(%ebp)
cmpl $1000000000, -28(%ebp)
jne L4
movl -36(%ebp), %eax
movl %eax, 8(%esp)
movl 12(%ebp), %eax
movl (%eax), %eax
movl %eax, 4(%esp)
leal LC0-"L00000000001$pb"(%ebx), %eax
movl %eax, (%esp)
call _printf
movl $0, %eax
addl $44, %esp
popl %ebx
popl %esi
popl %edi
leave
ret
.subsections_via_symbols
カテゴリ: [
Mac OS X] - &trackback() - 2010年01月28日 00:00:00
#blognavi
最終更新:2012年01月31日 22:53