i368/x86_64で-[NSObject hash]が激遅に!?

-[NSObject hash]の話題をTLで拾ったので広げてみた。


Mac OS Xにはx84_64とi386の二つのアーキテクチャがあります。
この二つの-[NSObject hash]が何を返すのかをgdbで調べてみました。*1

x86_64

push   %rbp
mov    %rsp,%rbp
mov    %rdi,%rax ; 第一引数を戻り値に
leaveq 
retq   

i386

push   %ebp
mov    %esp,%ebp
mov    0x8(%ebp),%eax ; 第一引数を戻り値に
leave  
ret

Objective-Cで書くと両方ともこうなります。

- (NSUInteger)hash
{
	return (NSUInteger)self;
}

わりと分かりやすい。w
Objective-Cのメソッドでは第一引数は隠し引数であるselfです。


で、少し前まではPPCアーキテクチャがありました。もちろん今でもまだありますが。
それも調べてみました。

ppc

blr ; 何もせず帰る

すごく、単純です。
これをObjective-Cで書くとこうなります。

- (NSUInteger)hash
{
	return (NSUInteger)self;
}

i386/x86_64と同じです。何もしてないのに!


これにはMac OS X/PCCの変態的(?)な値の受け渡しに答えがあります。
PPCでは第一引数をr3レジスタに入れて関数に渡します。
で、関数は返り値をr3レジスタに入れて返します。*2
つまり、何もしないと、第一引数を返り値として返す事になるんですね。


てことで、PPCからi386/x86_64に変わった事で-[NSObject hash]は余分にクロックを消費する事になってしまったようです。
だからなに?って言われると困るけどw

*1:偉そうに書いてますがi386/x86_64は全然分かりませんw

*2:もちろんr3レジスタに入る物だけですよ