Mercurial > hg > Papers > 2019 > anatofuz-prosym
changeset 91:3beea12854b0
update
author | Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 11 Jan 2019 10:06:41 +0900 |
parents | 1f9baa69dfe0 |
children | 2387a5edfd58 |
files | Slide/slide.html Slide/slide.md Slide/slide.pdf.html |
diffstat | 3 files changed, 80 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/Slide/slide.html Fri Jan 11 00:01:18 2019 +0900 +++ b/Slide/slide.html Fri Jan 11 10:06:41 2019 +0900 @@ -221,6 +221,34 @@ <div class='slide'> <!-- _S9SLIDE_ --> +<h2 id="mvm_interp_runで使用されているマクロ">MVM_interp_runで使用されているマクロ</h2> + +<ul> + <li>MVM_interp_runではマクロを利用してMoarVMの環境などにアクセスしている</li> + <li>頻出するマクロに <code>GET_REG</code> があり, 次のような使い方をする</li> +</ul> + +<pre><code> OP(const_i64): + GET_REG(cur_op, 0).i64 = MVM_BC_get_I64(cur_op, 2); + cur_op += 10; +</code></pre> + +<ul> + <li>これはバイトコードに埋められた数値を利用して, レジスタ情報を取得/設定などをする</li> + <li><code>reg_base</code> はMoarVMの現在のフレームのレジスタ情報が保存されたポインタであり, 本来のMVM_interp_runではローカル変数として利用している</li> +</ul> + +<pre><code> (i->reg_base[*((MVMuint16 *)(i->cur_op + 0))]).i64 = MVM_BC_get_I64(i->cur_op, 2); + i->cur_op += 10; + goto cbc_next(i); +</code></pre> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> <h2 id="mvm_interp_run-1">MVM_interp_run</h2> <ul> @@ -369,7 +397,7 @@ <pre><code> __code cbc_next(INTERP i){ - __code (*c)(INTERP); + __code (*c)(INTERP) c = CODES[(i->op = *(MVMuint16 *)(i->cur_op), i->cur_op += 2, i->op)]; // c = NEXT(i) goto c(i); }
--- a/Slide/slide.md Fri Jan 11 00:01:18 2019 +0900 +++ b/Slide/slide.md Fri Jan 11 10:06:41 2019 +0900 @@ -79,6 +79,28 @@ ``` +## MVM_interp_runで使用されているマクロ + +- MVM_interp_runではマクロを利用してMoarVMの環境などにアクセスしている +- 頻出するマクロに `GET_REG` があり, 次のような使い方をする + +``` + OP(const_i64): + GET_REG(cur_op, 0).i64 = MVM_BC_get_I64(cur_op, 2); + cur_op += 10; +``` + +- これはバイトコードに埋められた数値を利用して, レジスタ情報を取得/設定などをする +- `reg_base` はMoarVMの現在のフレームのレジスタ情報が保存されたポインタであり, 本来のMVM_interp_runではローカル変数として利用している + + +``` + (i->reg_base[*((MVMuint16 *)(i->cur_op + 0))]).i64 = MVM_BC_get_I64(i->cur_op, 2); + i->cur_op += 10; + goto cbc_next(i); +``` + + ## MVM_interp_run - MVM_interp_runでは次のオペコードをフェッチする際に `NEXT_OP` マクロを介して計算を行う.
--- a/Slide/slide.pdf.html Fri Jan 11 00:01:18 2019 +0900 +++ b/Slide/slide.pdf.html Fri Jan 11 10:06:41 2019 +0900 @@ -205,6 +205,34 @@ <div class='slide'> <!-- _S9SLIDE_ --> +<h2 id="mvm_interp_runで使用されているマクロ">MVM_interp_runで使用されているマクロ</h2> + +<ul> + <li>MVM_interp_runではマクロを利用してMoarVMの環境などにアクセスしている</li> + <li>頻出するマクロに <code>GET_REG</code> があり, 次のような使い方をする</li> +</ul> + +<pre><code> OP(const_i64): + GET_REG(cur_op, 0).i64 = MVM_BC_get_I64(cur_op, 2); + cur_op += 10; +</code></pre> + +<ul> + <li>これはバイトコードに埋められた数値を利用して, レジスタ情報を取得/設定などをする</li> + <li><code>reg_base</code> はMoarVMの現在のフレームのレジスタ情報が保存されたポインタであり, 本来のMVM_interp_runではローカル変数として利用している</li> +</ul> + +<pre><code> (i->reg_base[*((MVMuint16 *)(i->cur_op + 0))]).i64 = MVM_BC_get_I64(i->cur_op, 2); + i->cur_op += 10; + goto cbc_next(i); +</code></pre> + + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> <h2 id="mvm_interp_run-1">MVM_interp_run</h2> <ul> @@ -353,7 +381,7 @@ <pre><code> __code cbc_next(INTERP i){ - __code (*c)(INTERP); + __code (*c)(INTERP) c = CODES[(i->op = *(MVMuint16 *)(i->cur_op), i->cur_op += 2, i->op)]; // c = NEXT(i) goto c(i); }