Mercurial > hg > Papers > 2019 > anatofuz-thesis
changeset 46:1d637bad458d
update
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 15 Feb 2019 16:03:08 +0900 |
parents | 78ac3e7ec7ea |
children | 3f52d5153c09 |
files | paper/chapter4.tex paper/fig/bytecode_segment.graffle paper/fig/bytecode_segment.pdf paper/fig/origin_label_goto.graffle paper/fig/origin_label_goto.pdf paper/fig/origin_not_use_label_goto.graffle paper/fig/origin_not_use_label_goto.pdf paper/main.pdf |
diffstat | 8 files changed, 24 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/chapter4.tex Fri Feb 15 14:54:34 2019 +0900 +++ b/paper/chapter4.tex Fri Feb 15 16:03:08 2019 +0900 @@ -63,9 +63,11 @@ \end{figure} -MoarVMの命令バイトコードは16ビットである。上位8ビットが、 対象となる命令を示す。 -下位8ビットは、その命令の中で利用されるレジスタや、型情報が入るオペランドとなっている。 -MoarVMの命令は0から127番までが、 MoarVMのコア機能となっており、 128から255番までが、 拡張可能な命令セットとなっている。 +MoarVMの命令バイトコードは16ビットである。上位8ビットが、 バンクと呼ばれる命令セットの指定となる。 +MoarVMの命令はバンクの0から127番までが、 MoarVMのコア機能となっており、 128から255番までが、 拡張可能な命令セットとなっている。 +下位8ビットは、 バンクの内部の命令指定となっている。 +命令によっては、 この後のバイトコードで0個以上のオペランドを必要とする物がある。 +オペランドの中にはレジスタの型指定、 引数などが埋め込まれ、 命令バイトコードとの対応のために16ビットで表現される。 MoarVMのバイトコードインタプリタはsrc/core/interp.c中の関数 MVM\_interp\_runで定義されている。 @@ -85,18 +87,36 @@ このマクロの中では、 利用しているCコンパイラがラベルに対してのgotoが利用できる、 コンパイラ拡張を実装している場合は MVM\_CGOTOが真となり、 6行目までが実行される。 それ以外の場合は8行目以降のマクロ定義となる。 ラベルgotoが利用できる場合、 マクロDISPATCHは空白として設定され、 マクロOPは、 それぞれの命令に対応したラベルとなる。 +この場合の処理の流れを図\ref{fig:origin_label_goto}に示す。 + +\begin{figure}[ht] +\caption{ラベルgotoが利用できる場合のオリジナルのMVM\_interp\_runの処理の流れ} + \begin{center} + \includegraphics[width=50mm]{./fig/origin_label_goto.pdf} + \end{center} + \label{fig:origin_label_goto} +\end{figure} + 次の命令に移動する際は、 マクロNEXT\_OPを用いてcur\_opを次の命令に移動させ、 opの値を再設定する。 このopが実行すべき命令の番号が格納されている。 opを用いて、ソースコード\ref{labels_list}に示す配列LABELSから、 命令に対応するラベルを取得する。 LABELSはマクロOPが変換したラベルのリストである。 -ソースコード\ref{origin_dispatch}の場合、no\_opはcur\_opが0を指し、 const\_i8は1を指し示す。 +ソースコード\ref{origin_dispatch}の場合、no\_opはopが0が代入され、 const\_i8は1が設定されている。 \lstinputlisting[frame=lrbt, label=labels_list, caption=MoarVMの命令ラベルが設定されている配列]{./codes/src/oplabels.h} ラベルgotoが利用できない場合、 マクロDISPATCHはswitch文に、 OPはcase文にそれぞれ変換される。 cur\_opは数値そのものである為、 この場合はラベル配列へのアクセスは行われない。 +case文に変換された場合の処理の流れを\ref{fig:origin_not_use_label_goto}に示す。 +\begin{figure}[ht] +\caption{case文に展開された場合のオリジナルのMVM\_interp\_runの処理の流れ} + \begin{center} + \includegraphics[width=70mm]{./fig/origin_not_use_label_goto.pdf} + \end{center} + \label{fig:origin_not_use_label_goto} +\end{figure} またソースコード\ref{origin_dispatch}の中に含まれているマクロGET\_REGは、 ソースコード\ref{get_reg_c}に示す定義がされている。