知らんかった

AMD64 (aka x86-64) では default の operand size は 32 で、64bit 演算の方に prefix byte がつくらしい。16 → 32bit 移行時みたいに segment descriptor の bit で default 変えられるのかと思いきゃ、AMD の資料によれば、なんと default が 64 の mode が存在しないと来た。ビックリビックリ。てっきり (LP64 では) long の方が速くなったのかと思ってた。
なんでそういう事にしたのかしら。Cache の影響力が絶大な現代では大昔のごとく小さい整数型を捏ねくり回して memory 節約に努めた方が結局速くなるからか?
追記: かと思って、課題で書いてる Gaussian Elimination で long を全部 int に置き換えてみたら、4% ほど遅くなった。あれ? この program では整数型は配列の添字に使うだけでほとんど一生を register の上で過ごしてもらうので、cache 効率に関するアレは無いと見てよい。ちょっと思いついて

int f (int *a, int b) { return a[b]; }

というのを compile してみたところ、

	movslq	%esi,%rsi
	movl	(%rdi,%rsi,4), %eax
	ret

という風になった。符号拡張に注目。Gaussian Elim では、整数は添字ぐらいしか用途が無い (しかし添字での使用回数は非常に多い) ので、この符号拡張が overhead になっているものと推測。一概に int が速いとも long が速いとも言えないっぽい。暫定: 整数演算をするのが目的なら int が速い*1が、その整数が addressing 用で滅多に memory に格納する必要が無いなら long が若干速い。

*1:たまたま prefix byte で太ることによって i-cache の境界線踏み越える場合に限る