そんなふとした物忘れに襲われたら、ABI(Application Binary Interface)をググるのもいいけど、適当にコードを書いても速かったりする。
$ echo "int f(int a,int b,int c,int d,int e,int f,int g) {return a+b+c+d+e+f+g;}" > a.c $ $ANDROID_EABI_TOOLCHAIN/arm-linux-androideabi-gcc -O3 -S a.c $ cat a.s (一部省略) f: @ args = 12, pretend = 0, frame = 0 @ frame_needed = 0, uses_anonymous_args = 0 @ link register save eliminated. add r1, r1, r0 add r1, r1, r2 ldr r2, [sp, #0] add r1, r1, r3 add r0, r1, r2 ldmib sp, {r2, r3} @ phole ldm add r0, r0, r2 add r0, r0, r3 bx lr
これで4つはレジスタで、3つはスタックと分かるわけだけど、phole ldmってコメントが気になる。
検索してみると
Bug 9831 - ARM Peephole for multiple load/store could be more effective.
が見つかった。
Peephole最適化を示すらしい。要は置換でできるような単純な最適化のことを言うようだ。昔懐かしい eaxを217倍する最速コード みたいなものか。ってそれだけのことにコメント付けなくてもいいと思うが。
と、peephole最適化について調べていて、出てきたサイトのひとつにコンパイラの構造を解説というのがあって、この例がm68kで懐かしさで涙腺が緩む。今見ても68000のasmは美しい。
そういや、ARMってバイナリはいいと思うけど、ニーモニックがセンスなさ過ぎないか?ldmibってなんだ。!ってなんだって話。初見じゃ意味が分からない。その一見さんお断りな感じがいいという話もあるけど、move.l (sp)+,d2-d3の方が初見でも意味は掴めそうで断じて良い。間違いない。
そういやSHのアセンブラも好きだった *0 。組込はもうARM一辺倒だけどね。戦略さえ正しければ、SHはARMの代わりに世界を制すこともできたアーキだったと思うだけに残念。
しかし、ガラケーもそうだけど、ガラCPUも最初は先進的でも世界で勝負しないから、後から世界市場を制したスタンダードに潰されちゃうんだよな。Webサービスで言えばmixiも凄く成功したけど、このまま行けばfacebookに潰されちゃうだろうし。これは日本のサービス全般に言えることだけど。
とまあ、何故日本が海外で成功しないかといえば、根本は英語や海外文化が苦手なせいで海外に展開するのが遅れるからだと思うわけで、ひとまず英語を勉強しなくてはな、と思いTOEIC対策本を買ってみた。
英語の勉強が続いた試しがないけれど、1日1分なら僕にもできそうな気がします。
*0 : 懐かしのSHアセンブラをここで堪能してみる