どのテンプレートの場合も, テンプレートの先頭部分と末尾部分の処理は共通している. これらの処理は以下の 2つの関数で生成される (See: here for details).
それぞれのプラットフォームにおける処理の概要は以下の通り (なお, IdispatchTables は dispatch table 自体のアドレスを入れておくレジスタ. IdispatchAddress は dispatch table から取り出したアドレスを一時的に入れておくレジスタ).
x86_64 | sparc | |
---|---|---|
InterpreterMacroAssembler::dispatch_prolog() | 何もしない | 次のバイトコードと実行後の TosState を基に dispatch table からアドレスを取得し, IdispatchAddress に格納 |
InterpreterMacroAssembler::dispatch_epilog() | dispatch_next() が生成するコードに丸投げしているだけ | IdispatchAddress にジャンプ |
InterpreterMacroAssembler::dispatch_next() | 次のバイトコードと実行後の TosState を基に dispatch table からアドレスを生成してジャンプ | 次のバイトコードと実行後の TosState を基に dispatch table からアドレスを生成してジャンプ(※) |
(※) (sparc 版では dispatch_next() は dispatch_epilog() 内では使われていないが, templateTable の branch や ret/wide_ret, tableswitch 等から使われている他, generate_return_entry_for() 内などでも使われている)
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.