Path: ccsf.homeunix.org!CALA-MUZIK!ie.u-ryukyu.ac.jp!not-for-mail From: kono@ie.u-ryukyu.ac.jp (Shinji KONO) Newsgroups: fj.comp.arch Subject: Intel Mac =?ISO-2022-JP?B?GyRCJE4lMyVzJVElJCVpGyhC?= Date: Sun, 8 Oct 2006 04:39:35 +0000 (UTC) Organization: Information Engineering, University of the Ryukyus Lines: 61 Message-ID: <3993241news.pl@rananim.ie.u-ryukyu.ac.jp> References: NNTP-Posting-Host: insigna.ie.u-ryukyu.ac.jp Mime-Version: 1.0 Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: 7bit X-Trace: naha.ie.u-ryukyu.ac.jp 1160282375 11165 133.13.48.71 (8 Oct 2006 04:39:35 GMT) X-Complaints-To: news-admin@ie.u-ryukyu.ac.jp NNTP-Posting-Date: Sun, 8 Oct 2006 04:39:35 +0000 (UTC) X-Image-URL: http://www.ie.u-ryukyu.ac.jp/~kono/skono.gif Fcc: send X-Newsreader: news.pl 1.17 2005/05/10 01:26:04 Content-ID: <15450.1160282215.1@insigna.ie.u-ryukyu.ac.jp> Xref: ccsf.homeunix.org fj.comp.arch:386 河野真治 @ 琉球大学情報工学です。 Mac OS X の gcc コンパイラのアセンブラ出力を眺めていたんです が... Relocatable つまり、コードの位置をリンク時に決めない方式なの で、サブルーチンの先頭に、自分のコードの位置を知るために、 0x19d9c <__i686.get_pc_thunk.bx>: mov (%esp),%ebx 0x19d9f <__i686.get_pc_thunk.bx+3>: ret とかいうのを呼んでいる。もちろん、メモリ上の固定数値も呼ばず、 大域変数にもアクセスしなければ、呼ぶ必要はないわけだけど。し かも、この位置を記憶するEBXレジスタは、ずーっと、潰れること になる。 で、大域変数は、   leal L_uc1$non_lazy_ptr-"L00000000006$pb"(%ebx), %eax   movl (%eax), %eax   movb $-56, (%eax) でアクセスすることになる。だから、一旦ポインタに入れないと大域変数にアクセスで きない。   movl L_uc1$non_lazy_ptr-"L00000000006$pb"(%ebx), %eax   movb $-56, (%eax) これでもいいのか。 ってことは、大域変数にアクセスする時は、6個しかないia32の汎 用レジスタのうち2つは、必ず、潰れているってことだね。ま、い いんだけど。ia32 には、わり算するときにはEDXがつぶれるという 楽しい技もあるんだよな。 32個レジスタあるってならともかく。 なんか、昔の MC6800 を使ったアセンブラプログラミングみたい。 MC6800はポインタ一つ、アキュームレータ一つだったから。これで、 そこそこ速く動くCPUだってのが奇跡だ... 仮想レジスタの威力な のかなぁ。get_pc_thunk.bx みたいなので、実メモリにアクセスし ていたんじゃだめだめそうなものなんだが。 もちろん、大域最適化をすれば、このあたりはだいぶましにはなる んだけど。あぁ、たくさん文字列定数を使うときには、先にまとめ て、取得して局所変数に入れておくみたいなことするのかぁ。   leal LC143-"L00000000027$pb"(%ebx), %edi   movl %edi, -660(%ebp)   leal LC144-"L00000000027$pb"(%ebx), %eax   movl %eax, -664(%ebp)   leal LC145-"L00000000027$pb"(%ebx), %edi   movl %edi, -668(%ebp)   leal LC146-"L00000000027$pb"(%ebx), %eax   movl %eax, -672(%ebp)   leal LC147-"L00000000027$pb"(%ebx), %edi   movl %edi, -676(%ebp)   leal LC148-"L00000000027$pb"(%ebx), %eax   movl %eax, -680(%ebp) なにやってるのかと思ったよ... その方がEBXが空くから有利って ことなんだろうな。大域最適化の結果がこれかよ。 なんで、こんなCPUが流行ってしまったのか。 --- Shinji KONO @ Information Engineering, University of the Ryukyus 河野真治 @ 琉球大学工学部情報工学科