Gauche:YAGHG:VM:Insn
インストラクションの構造
- VMのインストラクションはScmWord(の列)によって構成され、インストラクション識別用のコード部と引数部に分かれている
- src/gauche/code.h
- インストラクションは2つまでの引数に加え、次のワードにオペランドを取ることが出来る
- どのインストラクションがどのような引数、オペランドをとるかはsrc/vminsn.scmで定義
次の図はScmWordを32ビット幅と仮定したものである。
| 10 | 10 | 8 | +----+---------+--------+-------+ | | ARG1 | ARG2 | CODE | +----+---------+--------+-------+ | ARG | +--------------------------------+ | OPERAND | +--------------------------------+
VMインストラクション一覧
- Gauche:YAGHG:VM:Insn:NOP?
- Gauche:YAGHG:VM:Insn:CONST*?
- CONST
- CONSTI
- CONSTN
- CONSTF
- CONSTU
- Gauche:YAGHG:VM:Insn:PUSH?
- Gauche:YAGHG:VM:Insn:PRE-CALL
- Gauche:YAGHG:VM:Insn:CHECK-STACK?
- Gauche:YAGHG:VM:Insn:CALL
- Gauche:YAGHG:VM:Insn:TAIL-CALL
- Gauche:YAGHG:VM:Insn:JUMP?
- Gauche:YAGHG:VM:Insn:RET
- Gauche:YAGHG:VM:Insn:DEFINE?
- Gauche:YAGHG:VM:Insn:CLOSURE
- Gauche:YAGHG:VM:Insn:LOCAL-ENV
- Gauche:YAGHG:VM:Insn:LOCAL-ENV-CLOSURES?
- Gauche:YAGHG:VM:Insn:POP-LOCAL-ENV
- Gauche:YAGHG:VM:Insn:LOCAL-ENV-JUMP?
- Gauche:YAGHG:VM:Insn:LOCAL-ENV-CALL?
- Gauche:YAGHG:VM:Insn:LOCAL-ENV-TAIL-CALL?
- Gauche:YAGHG:VM:Insn:B*?
- BF
- BT
- BNEQ
- BNEQV
- BNNULL
- BNUMNE
- BNLT
- BNLE
- BNGT
- BNGE
- BNUMNEI
- BNEQC
- BNEQVC
- Gauche:YAGHG:VM:Insn:R*?
- RF
- RT
- RNEQ
- RNEQV
- RNNULL
- Gauche:YAGHG:VM:Insn:RECEIVE?
- Gauche:YAGHG:VM:Insn:TAIL-RECEIVE?
- Gauche:YAGHG:VM:Insn:LSET?
- Gauche:YAGHG:VM:Insn:GSET?
- Gauche:YAGHG:VM:Insn:LREF?
- Gauche:YAGHG:VM:Insn:GREF?
- Gauche:YAGHG:VM:Insn:PROMISE?
- Gauche:YAGHG:VM:Insn:CONST-APPLY?
- Inlined operatorsは省略
注意点
コード例におけるcompile-p3
どのようなSchemeコードによって該当インストラクションが生成されるかを示す「コード例」ではgauche.internalモジュールのcompile-p3を利用しています。
フレーム
表記
- C#N、 E#N
それぞれコンティニュエーションフレーム、環境フレームを表します。 Nは単なる識別子にすぎません。
環境フレームのポインタ
環境フレームは引数フレームと環境ヘッダからなり、また環境フレームへのポインタは 環境ヘッダを指すため、正確に表記するなら次のようになりますが
+=========+ ===== | arg | | env ---->+---------+ | | E#0 | ENV_HDR | | | | +=========+ =====
これを次のように表しています。
env ---->+=========+ | | | E#0 | | | +=========+
なお、コンティニュエーションフレームも積みかけの引数フレームを含むことがありますが 基本的にそれは考慮しません。
スタックとヒープ
原則すべての(スタックにあり得る)フレームはスタックにあるものとして表されます。