OSECPUのラベル命令
(0) はじめに
- OSECPUのバイトコードにはラベル命令というのがあります。実はこれは非常に奥が深いので、ここで1ページかけて説明しようと思います。
(1) ラベル命令は特異な命令
- まず、多くのCPUはこんな命令を持っていません。確かにアセンブラにはたいていラベル定義命令はあります。でもそれは疑似命令であって、対応するCPUの命令はないのです。
- 普通の機械語は、分岐先を指定するときに、○○バイト先へ進め、○○バイト前に戻れ、などと書きます。だからラベルなんてなくても分岐先を記述できるのです。実CPUではないJavaでさえ、この仕様になっています。・・・OSECPUがどれほど変わっているか分かるでしょうか。
- そもそもラベル命令をわざわざ書かなければいけないというのは、機能密度の観点では不利です。他のCPUはそんなものを置いておかなくても分岐先を記述できるのですから。・・・にもかかわらず、OSECPUはラベル命令があり、そしてこれを使わなければ分岐できないのです。
(2) ラベル命令のメリット
- それでもラベル命令があるのは、つまり捨てがたいメリットがあるからです。
- ラベル命令があって、分岐先に必ずこれを指定するということは、逆に言えばここ以外の場所には分岐しないということです。この情報はJITコンパイラにはとても助けになります。しかしまあこんなものはJITコンパイラのパスを増やせば同等のことができるのではありますが。
- ラベル命令方式だと、命令の区切り以外の中途半端なところへ分岐するという可能性は確実に完全に排除できます。
- ラベル番号だと、結果的に少ないバイト数で分岐先を表現できる可能性があります。いうなれば、ショートブランチが遠くまで届く、という感じです。これは有利です。先ほどは機能密度の観点から不利だと書きましたが、これを加味すると、不利じゃないかもしれません。
- そして最後ですが、実はラベル命令は「分岐先を示すためだけの、何もしない命令」ではないのです。何かするのです。この説明を以下でしようと思います。
(3)
こめんと欄