#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

  • レスありがとう。詳細はこれですd(´∀`*)グッ♪ http://www.e29.mobi/ -- 俺だ (2012-01-08 02:35:32)
  • 挿入できるよ(ノ゚Д゚)ノシ$ http://e29.mobi/ -- わかりません (2012-01-31 22:53:08)
名前:
コメント:


カテゴリ: [Mac OS X] - &trackback() - 2010年01月28日 00:00:00

#blognavi
最終更新:2012年01月31日 22:53