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-&gt;reg_base[*((MVMuint16 *)(i-&gt;cur_op + 0))]).i64 = MVM_BC_get_I64(i-&gt;cur_op, 2);
+    i-&gt;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-&gt;op = *(MVMuint16 *)(i-&gt;cur_op), i-&gt;cur_op += 2, i-&gt;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-&gt;reg_base[*((MVMuint16 *)(i-&gt;cur_op + 0))]).i64 = MVM_BC_get_I64(i-&gt;cur_op, 2);
+    i-&gt;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-&gt;op = *(MVMuint16 *)(i-&gt;cur_op), i-&gt;cur_op += 2, i-&gt;op)]; // c = NEXT(i)
     goto c(i);
 }