changeset 32:43e0cf46d40b

add cbc_codesegs.cbc
author Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Fri, 09 Nov 2018 10:38:08 +0900
parents 5b5fb929c67f
children 50d5d54a02b5
files Paper/anatofuz.pdf Paper/anatofuz.tex Paper/src/cbc_codesegs.cbc
diffstat 3 files changed, 37 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
Binary file Paper/anatofuz.pdf has changed
--- a/Paper/anatofuz.tex	Fri Nov 09 10:19:09 2018 +0900
+++ b/Paper/anatofuz.tex	Fri Nov 09 10:38:08 2018 +0900
@@ -279,12 +279,13 @@
 
 \lstinputlisting[label=cbc_dispatch_c, caption=CbCMoarVMのバイトコードディスパッチ]{./src/cbc-interp-next.cbc}
 
+\lstinputlisting[label=cbc_codesegs_c, caption=CbCMoarVMのバイトコードディスパッチ]{./src/cbc_codesegs.cbc}
 
 \begin{figure}[ht]
      \begin{center}
      \includegraphics[width=70mm]{fig/cbc_next.pdf}
      \end{center}
-     \caption{CbCにおけるインタプリタの関数遷移}
+     \caption{CbCにおけるMoarVMバイトコードインタプリタ内の状態遷移}
     \label{fig:perl6cbcinter}
 \end{figure}
 
@@ -297,7 +298,7 @@
   \item cur\_opなど構造体INTERのメンバ変数はポインタiから参照するように修正する
   \item GC対策のためマクロMVMROOTを使い局所変数のポインタをスタックに積む箇所は,局所変数をstatic化する
   \item 末尾のgoto NEXTをgoto cbc\_next(i)に修正する
-  \item case文で下のcase文に落ちている箇所は,case文に対応するCodeSegmentに遷移する様に末尾を付け加える
+  \item case文で下のcase文に落ちている箇所は,case文に対応するCodeSegmentに遷移する様にgoto文を付け加える
 \end{itemize}
 
 
@@ -477,6 +478,8 @@
 従ってMoarVMのGCの最適化を行う.
 
 また高速化という面では,Perlの特徴である正規表現に着目し,正規表現の表現のみ高速で動く最適化の導入なども検討している.
+他にrakudoのコンパイラ系統からCbCのコードを直接生成させ,それをllvmでコンパイルすることによってLLVMの最適化フェーズを得て
+高速化することも可能であると推測できる.
 
 Perl6の開発は非常に活発に行われている為,CbCMoarVMの最新版の追従も課題となっている.
 現在はinterp.cからPerlスクリプトを用いて自動でCbCのCodeSegmentを生成している.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Paper/src/cbc_codesegs.cbc	Fri Nov 09 10:38:08 2018 +0900
@@ -0,0 +1,32 @@
+__code cbc_no_op(INTERP i){
+    goto cbc_next(i);
+}
+__code cbc_const_i8(INTERP i){
+    goto cbc_const_i16(i);
+}
+__code cbc_const_i16(INTERP i){
+    goto cbc_const_i32(i);
+}
+__code cbc_const_i32(INTERP i){
+    MVM_exception_throw_adhoc(i->tc, "const_iX NYI");
+   goto cbc_const_i64(i);
+}
+__code cbc_const_i64(INTERP i){
+    GET_REG(i->cur_op, 0,i).i64 = MVM_BC_get_I64(i->cur_op, 2);
+    i->cur_op += 10;
+    goto cbc_next(i);
+}
+__code cbc_pushcompsc(INTERP i){
+    static MVMObject * sc;
+    sc  = GET_REG(i->cur_op, 0,i).o;
+    if (REPR(sc)->ID != MVM_REPR_ID_SCRef)
+        MVM_exception_throw_adhoc(i->tc, "Can only push an SCRef with pushcompsc");
+    if (MVM_is_null(i->tc, i->tc->compiling_scs)) {
+        MVMROOT(i->tc, sc, {
+            i->tc->compiling_scs = MVM_repr_alloc_init(i->tc, i->tc->instance->boot_types.BOOTArray);
+        });
+    }
+    MVM_repr_unshift_o(i->tc, i->tc->compiling_scs, sc);
+    i->cur_op += 2;
+    goto cbc_next(i);
+}