# HG changeset patch # User Takahiro SHIMIZU # Date 1541693542 -32400 # Node ID df723be561065181337e2e6635615a05fa850341 # Parent 1141ce0a6aab514a4284f0e46a3b8a8646ac78e3 add about INTERP section diff -r 1141ce0a6aab -r df723be56106 Paper/anatofuz.pdf Binary file Paper/anatofuz.pdf has changed diff -r 1141ce0a6aab -r df723be56106 Paper/anatofuz.tex --- a/Paper/anatofuz.tex Fri Nov 09 00:32:12 2018 +0900 +++ b/Paper/anatofuz.tex Fri Nov 09 01:12:22 2018 +0900 @@ -262,12 +262,20 @@ そのため対象となるCodeSegmentをLABLESの並びと対応させ,配列CODESに設定すればCodeSegmentの名前は問わない. 今回はCodeSegmentである事を示す為にsuffixとしてcbc\_をつける. +命令の実行処理でMoarVMのレジスタであるreg\_baseや命令列cur\_opなどの情報を利用しているが,これらはMVM\_interp\_run内のローカル変数として利用している. +ラベルを利用しているオリジナル版では同一関数内であるためアクセス可能であるが,CodeSegment間の移動で命令を表現するCbCではアクセスできない. +その為インタプリタの情報を集約した構造体interを定義し,この構造体へのポインタであるINTERP型の変数iをCodeSegmentの入出力して与える. +CodeSegment内ではINTERPを経由することでインタプリタの各種情報にアクセスする. + 命令実行中のCodeSegmentの遷移を図\ref{fig:perl6cbcinter}に示す. この中で実線で書かれている部分はCbCのgoto文で遷移し,波線の箇所は通常のCの関数呼び出しとなっている. -%現在のCbCMoarVMは次の命令セットのディスパッチをcbc\_nextというCodeSegmentで処理している. -%これは元のMoarVMの命令ディスパッチで行われる現在のオペコードを示すcur\_opと命令列opの操作及び次のラベルに遷移するマクロに該当する. -%CbCMoarVMではラベルに対しての遷移の代わりにMoarVMの命令のCodeSegmentの集合体である配列CODESにアクセスし,その要素であるCodeSegmentに対して遷移する形を取っている. +現在のCbCMoarVMは次の命令セットのディスパッチをcbc\_nextというCodeSegmentで処理している. +これは元のMoarVMのマクロNEXTが行う処理に該当する. +CbCMoarVMではラベルに対しての遷移の代わりにMoarVMの命令のCodeSegmentの集合体である配列CODESにアクセスし,その要素であるCodeSegmentに対して遷移する. + +\lstinputlisting[label=cbc_dispatch_c, caption=CbCMoarVMのバイトコードディスパッチ]{./src/cbc-interp-next.cbc} + \begin{figure}[ht] \begin{center} diff -r 1141ce0a6aab -r df723be56106 Paper/src/cbc-interp-next.cbc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Paper/src/cbc-interp-next.cbc Fri Nov 09 01:12:22 2018 +0900 @@ -0,0 +1,14 @@ +#define NEXT_OP(i) (i->op = *(MVMuint16 *)(i->cur_op), i->cur_op += 2, i->op) + +#define DISPATCH(op) {goto (CODES[op])(i);} +#define OP(name) OP_ ## name +#define NEXT(i) CODES[NEXT_OP(i)](i) +static int tracing_enabled = 0; + +__code cbc_next(INTERP i){ + goto NEXT(i); +} + +__code cbc_no_op(INTERP i){ + goto cbc_next(i); +}