Mercurial > hg > Papers > 2019 > anatofuz-prosym
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
--- 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); +}