changeset 49:933dbfa8f06f

add oplabels
author Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Fri, 09 Nov 2018 19:24:53 +0900
parents 443de29ac349
children 619edd118aab
files Paper/anatofuz.pdf Paper/anatofuz.tex Paper/src/oplabels.h Paper/src/oplables-cbc-codes.h
diffstat 4 files changed, 32 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
Binary file Paper/anatofuz.pdf has changed
--- a/Paper/anatofuz.tex	Fri Nov 09 19:15:06 2018 +0900
+++ b/Paper/anatofuz.tex	Fri Nov 09 19:24:53 2018 +0900
@@ -300,10 +300,10 @@
 MoarVMのバイトコードインタプリタはsrc/core/interp.cで定義されている.
 この中の関数MVM\_interp\_runで命令に応じた処理を実行する.
 関数内では命令列が保存されているcur\_op, 現在と次の命令を指し示すop,Threadの環境が保存されているThreadcontextなどの変数を利用する.
-命令実行は大きく二種類の動作があり, Code\ref{orig_macro}に示すCのgotoが利用できる場合はMVM\_CGOTOフラグが立ちラベル遷移を利用する.
+命令実行は大きく二種類の動作があり, Cのgotoが利用できる場合はCode\ref{orig_macro}に示すMVM\_CGOTOフラグが立ちラベル遷移を利用する.
 それ以外の場合は巨大なcase文として命令を実行する.
 
-ラベル遷移を利用する場合はラベルテーブルにアクセスし, テーブルに登録されているアドレスを取得し,マクロNEXTで遷移する.
+ラベル遷移を利用する場合はCode\ref{oplabelsh}に示すラベルテーブルLABELSにアクセスし, テーブルに登録されているアドレスを取得し,マクロNEXTで遷移する.
 Code\ref{cbc_dispatch_c}に示すno\_opは何もせず次の命令に移動する為, NEXTのみ記述されている.
 
 このラベルテーブルの中身はラベルが変換されたアドレスであるため, 実際に呼ばれている命令コードの名前はデバッガレベルでは確認できない.
@@ -311,6 +311,7 @@
 巨大なcase文として実行された場合, 実行時間が遅いだけでなく,ラベル遷移と共存させて記述を行っている為Cのソースコードにおける可読性も低下する.
 
 
+\lstinputlisting[label=oplabelsh,  caption=ラベルテーブルの一部分]{./src/oplabels.h}
 \lstinputlisting[label=orig_macro,  caption=interp.cのマクロ部分]{./src/orig_macro.c}
 
 \lstinputlisting[label=dispatch_c,  caption=オリジナル版MoarVMのバイトコードディスパッチ]{./src/dispatch.c}
@@ -328,9 +329,10 @@
 
 
 OP(.*)の.*に該当する箇所はバイトコードの名前である.通常このブロックにはLABELから遷移する為, バイトコードの名前はLABELSの配列の添字に変換されている.
-そのため対象となるCodeGearをLABLESの並びと対応させ, CodeGearの配列CODESとして設定すればCodeGearの名前は問わない.
+そのため対象となるCodeGearをLABLESの並びと対応させ, Code\ref{cbcoplabelsh}に示すCodeGearの配列CODESとして設定すればCodeGearの名前は問わない.
 今回はCodeGearである事を示す為にsuffixとしてcbc\_をつける.
 
+\lstinputlisting[label=cbcoplabelsh,  caption=CodeGear配列の一部分]{./src/oplables-cbc-codes.h}
 
 命令の実行処理でMoarVMのレジスタであるreg\_baseや命令列cur\_opなどの情報を利用しているが, これらはMVM\_interp\_run内のローカル変数として利用している.
 ラベルを利用しているオリジナル版では同一関数内であるためアクセス可能であるが, CodeGear間の移動で命令を表現するCbCではアクセスできない.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/src/oplabels.h	Fri Nov 09 19:24:53 2018 +0900
@@ -0,0 +1,15 @@
+static const void * const LABELS[] = {
+    &&OP_no_op,
+    &&OP_const_i8,
+    &&OP_const_i16,
+    &&OP_const_i32,
+    &&OP_const_i64,
+    &&OP_const_n32,
+    &&OP_const_n64,
+    &&OP_const_s,
+    &&OP_set,
+    &&OP_extend_u8,
+    &&OP_extend_u16,
+    &&OP_extend_u32,
+    &&OP_extend_i8,
+    &&OP_extend_i16,
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/src/oplables-cbc-codes.h	Fri Nov 09 19:24:53 2018 +0900
@@ -0,0 +1,12 @@
+ __code (* CODES[])(INTERP) = {
+   cbc_no_op,
+   cbc_const_i8,
+   cbc_const_i16,
+   cbc_const_i32,
+   cbc_const_i64,
+   cbc_const_n32,
+   cbc_const_n64,
+   cbc_const_s,
+   cbc_set,
+   cbc_extend_u8,
+   cbc_extend_u16,