changeset 46:e3cd4e21b560

add --cbc option
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 08 Dec 2018 22:57:55 +0900
parents 6e8bd93cbb96
children d385af306a13 585f22dcc6aa
files CbCLLVMMakefile src/core/cbc-interp.cbc src/core/interp.c src/main.c
diffstat 4 files changed, 77 insertions(+), 71 deletions(-) [+]
line wrap: on
line diff
--- a/CbCLLVMMakefile	Sun Dec 02 11:30:34 2018 +0900
+++ b/CbCLLVMMakefile	Sat Dec 08 22:57:55 2018 +0900
@@ -1,8 +1,10 @@
-CC     = /mnt/dalmore-home//one/src/crosscompilers/cbc_llvm_build/bin/clang
-LD     = /mnt/dalmore-home//one/src/crosscompilers/cbc_llvm_build/bin/clang
+CC     = clang
+CBC     = /Users/kono/src/cbclang_build/bin/clang
+# CBC     = /Users/kono/src/cbcgcc_build/gcc/xgcc -B /Users/kono/src/cbcgcc_build/gcc
+LD     = clang
 AR     = ar
 MAKE   = make 
-PERL   = /usr/bin/perl
+PERL   = perl
 RM     = rm -f
 CAT    = cat
 SHELL  = /bin/sh
@@ -15,7 +17,7 @@
 MINGW_UNICODE = 
 
 
-CONFIG    = --cc /mnt/dalmore-home//one/src/crosscompilers/cbc_llvm_build/bin/clang --debug --no-optimize --compiler clang --prefix=/mnt/dalmore-home/one/src/Perl6/llvm/build_perl6
+CONFIG    = 
 ADDCONFIG =
 
 TRACING = 0
@@ -36,14 +38,15 @@
 endif
 
 
-PREFIX    = /mnt/dalmore-home/one/src/Perl6/llvm/build_perl6
-BINDIR    = /mnt/dalmore-home/one/src/Perl6/llvm/build_perl6/bin
-LIBDIR    = /mnt/dalmore-home/one/src/Perl6/llvm/build_perl6/lib
-MASTDIR   = /mnt/dalmore-home/one/src/Perl6/llvm/build_perl6/share/nqp/lib/MAST
+PREFIX    = /Users/kono/src/Perl6/MoarVM/install
+BINDIR    = /Users/kono/src/Perl6/MoarVM/install/bin
+LIBDIR    = /Users/kono/src/Perl6/MoarVM/install/lib
+MASTDIR   = /Users/kono/src/Perl6/MoarVM/install/share/nqp/lib/MAST
 
-PKGCONFIGDIR = /mnt/dalmore-home/one/src/Perl6/llvm/build_perl6/share/pkgconfig
+PKGCONFIGDIR = /Users/kono/src/Perl6/MoarVM/install/share/pkgconfig
 
-CFLAGS    = -fno-omit-frame-pointer -g3 -Wno-logical-op-parentheses -D_REENTRANT -D_FILE_OFFSET_BITS=64 -fPIC -DDEBUG_HELPERS -DMVM_TRACING=$(TRACING) -DMVM_CGOTO=$(CGOTO) -DMVM_RDTSCP=$(RDTSCP)
+# CFLAGS    = -fno-omit-frame-pointer -fno-optimize-sibling-calls -O3 -DNDEBUG -Wno-logical-op-parentheses -D_DARWIN_USE_64_BIT_INODE=1  -DMVM_TRACING=$(TRACING) -DMVM_CGOTO=$(CGOTO) -DMVM_RDTSCP=$(RDTSCP)
+CFLAGS    =  -O0 -g -DNDEBUG -Wno-logical-op-parentheses -D_DARWIN_USE_64_BIT_INODE=1  -DMVM_TRACING=$(TRACING) -DMVM_CGOTO=$(CGOTO) -DMVM_RDTSCP=$(RDTSCP)
 CINCLUDES =  -I3rdparty/libuv/include -I3rdparty/libuv/src -I3rdparty/libatomicops/src -I3rdparty/libtommath -I3rdparty/dyncall/dynload -I3rdparty/dyncall/dyncall -I3rdparty/dyncall/dyncallback \
             -I3rdparty/sha1 \
             -I3rdparty/tinymt \
@@ -51,8 +54,8 @@
             -I3rdparty/cmp \
             -I3rdparty \
             -Isrc
-LDFLAGS   =  -g3 -Wl,-rpath,"//mnt/dalmore-home/one/src/Perl6/llvm/build_perl6/lib"
-LDLIBS    = -lm -lpthread -lrt -ldl
+LDFLAGS   =  -g -DNDEBUG -Wl,-no_pie,-rpath,"//Users/kono/src/Perl6/MoarVM/install/lib" -L/usr/local/opt/libffi/lib
+LDLIBS    = -lpthread
 MAIN_LIBS = -L. -lmoar
 DLL_LIBS  = 3rdparty/cmp/libcmp.a 3rdparty/dyncall/dyncall/libdyncall_s.a 3rdparty/dyncall/dyncallback/libdyncallback_s.a 3rdparty/dyncall/dynload/libdynload_s.a 3rdparty/libatomicops/src/libatomic_ops.a 3rdparty/tinymt/libtinymt.a 3rdparty/sha1/libsha1.a 3rdparty/libtommath/libtommath.a 3rdparty/libuv/libuv.a $(LDLIBS)
 ARFLAGS   = rcs
@@ -411,8 +414,7 @@
           src/gen/config.h \
           src/debug/debugserver.h \
           3rdparty/uthash.h \
-          3rdparty/cmp/cmp.h \
-	  src/core/oplables-cbc-codes.h
+          3rdparty/cmp/cmp.h
 
 UV_UNIX = 3rdparty/libuv/src/fs-poll.o \
           3rdparty/libuv/src/inet.o \
@@ -471,7 +473,7 @@
 UV_AIX = 3rdparty/libuv/src/unix/aix.o \
          $(UV_UNIX)
 
-UV_OBJECTS = $(UV_LINUX)
+UV_OBJECTS = $(UV_DARWIN)
 
 TOM_OBJECTS = 3rdparty/libtommath/bn_error.o 3rdparty/libtommath/bn_fast_mp_invmod.o 3rdparty/libtommath/bn_fast_mp_montgomery_reduce.o 3rdparty/libtommath/bn_fast_s_mp_mul_digs.o 3rdparty/libtommath/bn_fast_s_mp_mul_high_digs.o 3rdparty/libtommath/bn_fast_s_mp_sqr.o 3rdparty/libtommath/bn_mp_2expt.o 3rdparty/libtommath/bn_mp_abs.o 3rdparty/libtommath/bn_mp_add.o 3rdparty/libtommath/bn_mp_add_d.o 3rdparty/libtommath/bn_mp_addmod.o 3rdparty/libtommath/bn_mp_and.o 3rdparty/libtommath/bn_mp_clamp.o 3rdparty/libtommath/bn_mp_clear.o 3rdparty/libtommath/bn_mp_clear_multi.o 3rdparty/libtommath/bn_mp_cmp.o 3rdparty/libtommath/bn_mp_cmp_d.o 3rdparty/libtommath/bn_mp_cmp_mag.o 3rdparty/libtommath/bn_mp_cnt_lsb.o 3rdparty/libtommath/bn_mp_copy.o 3rdparty/libtommath/bn_mp_count_bits.o 3rdparty/libtommath/bn_mp_div.o 3rdparty/libtommath/bn_mp_div_2.o 3rdparty/libtommath/bn_mp_div_2d.o 3rdparty/libtommath/bn_mp_div_3.o 3rdparty/libtommath/bn_mp_div_d.o 3rdparty/libtommath/bn_mp_dr_is_modulus.o 3rdparty/libtommath/bn_mp_dr_reduce.o 3rdparty/libtommath/bn_mp_dr_setup.o 3rdparty/libtommath/bn_mp_exch.o 3rdparty/libtommath/bn_mp_export.o 3rdparty/libtommath/bn_mp_expt_d.o 3rdparty/libtommath/bn_mp_expt_d_ex.o 3rdparty/libtommath/bn_mp_exptmod.o 3rdparty/libtommath/bn_mp_exptmod_fast.o 3rdparty/libtommath/bn_mp_exteuclid.o 3rdparty/libtommath/bn_mp_fread.o 3rdparty/libtommath/bn_mp_fwrite.o 3rdparty/libtommath/bn_mp_gcd.o 3rdparty/libtommath/bn_mp_get_int.o 3rdparty/libtommath/bn_mp_get_long.o 3rdparty/libtommath/bn_mp_get_long_long.o 3rdparty/libtommath/bn_mp_grow.o 3rdparty/libtommath/bn_mp_import.o 3rdparty/libtommath/bn_mp_init.o 3rdparty/libtommath/bn_mp_init_copy.o 3rdparty/libtommath/bn_mp_init_multi.o 3rdparty/libtommath/bn_mp_init_set.o 3rdparty/libtommath/bn_mp_init_set_int.o 3rdparty/libtommath/bn_mp_init_size.o 3rdparty/libtommath/bn_mp_invmod.o 3rdparty/libtommath/bn_mp_invmod_slow.o 3rdparty/libtommath/bn_mp_is_square.o 3rdparty/libtommath/bn_mp_jacobi.o 3rdparty/libtommath/bn_mp_karatsuba_mul.o 3rdparty/libtommath/bn_mp_karatsuba_sqr.o 3rdparty/libtommath/bn_mp_lcm.o 3rdparty/libtommath/bn_mp_lshd.o 3rdparty/libtommath/bn_mp_mod.o 3rdparty/libtommath/bn_mp_mod_2d.o 3rdparty/libtommath/bn_mp_mod_d.o 3rdparty/libtommath/bn_mp_montgomery_calc_normalization.o 3rdparty/libtommath/bn_mp_montgomery_reduce.o 3rdparty/libtommath/bn_mp_montgomery_setup.o 3rdparty/libtommath/bn_mp_mul.o 3rdparty/libtommath/bn_mp_mul_2.o 3rdparty/libtommath/bn_mp_mul_2d.o 3rdparty/libtommath/bn_mp_mul_d.o 3rdparty/libtommath/bn_mp_mulmod.o 3rdparty/libtommath/bn_mp_n_root.o 3rdparty/libtommath/bn_mp_n_root_ex.o 3rdparty/libtommath/bn_mp_neg.o 3rdparty/libtommath/bn_mp_or.o 3rdparty/libtommath/bn_mp_prime_fermat.o 3rdparty/libtommath/bn_mp_prime_is_divisible.o 3rdparty/libtommath/bn_mp_prime_is_prime.o 3rdparty/libtommath/bn_mp_prime_miller_rabin.o 3rdparty/libtommath/bn_mp_prime_next_prime.o 3rdparty/libtommath/bn_mp_prime_rabin_miller_trials.o 3rdparty/libtommath/bn_mp_prime_random_ex.o 3rdparty/libtommath/bn_mp_radix_size.o 3rdparty/libtommath/bn_mp_radix_smap.o 3rdparty/libtommath/bn_mp_rand.o 3rdparty/libtommath/bn_mp_read_radix.o 3rdparty/libtommath/bn_mp_read_signed_bin.o 3rdparty/libtommath/bn_mp_read_unsigned_bin.o 3rdparty/libtommath/bn_mp_reduce.o 3rdparty/libtommath/bn_mp_reduce_2k.o 3rdparty/libtommath/bn_mp_reduce_2k_l.o 3rdparty/libtommath/bn_mp_reduce_2k_setup.o 3rdparty/libtommath/bn_mp_reduce_2k_setup_l.o 3rdparty/libtommath/bn_mp_reduce_is_2k.o 3rdparty/libtommath/bn_mp_reduce_is_2k_l.o 3rdparty/libtommath/bn_mp_reduce_setup.o 3rdparty/libtommath/bn_mp_rshd.o 3rdparty/libtommath/bn_mp_set.o 3rdparty/libtommath/bn_mp_set_int.o 3rdparty/libtommath/bn_mp_set_long.o 3rdparty/libtommath/bn_mp_set_long_long.o 3rdparty/libtommath/bn_mp_shrink.o 3rdparty/libtommath/bn_mp_signed_bin_size.o 3rdparty/libtommath/bn_mp_sqr.o 3rdparty/libtommath/bn_mp_sqrmod.o 3rdparty/libtommath/bn_mp_sqrt.o 3rdparty/libtommath/bn_mp_sqrtmod_prime.o 3rdparty/libtommath/bn_mp_sub.o 3rdparty/libtommath/bn_mp_sub_d.o 3rdparty/libtommath/bn_mp_submod.o 3rdparty/libtommath/bn_mp_to_signed_bin.o 3rdparty/libtommath/bn_mp_to_signed_bin_n.o 3rdparty/libtommath/bn_mp_to_unsigned_bin.o 3rdparty/libtommath/bn_mp_to_unsigned_bin_n.o 3rdparty/libtommath/bn_mp_toom_mul.o 3rdparty/libtommath/bn_mp_toom_sqr.o 3rdparty/libtommath/bn_mp_toradix.o 3rdparty/libtommath/bn_mp_toradix_n.o 3rdparty/libtommath/bn_mp_unsigned_bin_size.o 3rdparty/libtommath/bn_mp_xor.o 3rdparty/libtommath/bn_mp_zero.o 3rdparty/libtommath/bn_prime_tab.o 3rdparty/libtommath/bn_reverse.o 3rdparty/libtommath/bn_s_mp_add.o 3rdparty/libtommath/bn_s_mp_exptmod.o 3rdparty/libtommath/bn_s_mp_mul_digs.o 3rdparty/libtommath/bn_s_mp_mul_high_digs.o 3rdparty/libtommath/bn_s_mp_sqr.o 3rdparty/libtommath/bn_s_mp_sub.o 3rdparty/libtommath/bncore.o
 
@@ -482,7 +484,7 @@
 DYNASM_SCRIPTS = 3rdparty/dynasm/dynasm.lua 3rdparty/dynasm/dasm_x86.lua
 DYNASM_HEADERS = 3rdparty/dynasm/dasm_proto.h 3rdparty/dynasm/dasm_x86.h
 
-.SUFFIXES: .c .cbc .o .i .s .dasc .expr .tile
+.SUFFIXES: .cbc .c .o .i .s .dasc .expr .tile
 
 all: moar pkgconfig/moar.pc
 
@@ -491,8 +493,8 @@
 	$(CP) moar "$(DESTDIR)$(BINDIR)"
 	$(CHMOD) 755 "$(DESTDIR)$(BINDIR)/moar"
 	$(MKPATH) "$(DESTDIR)$(LIBDIR)"
-	$(RM_F) "$(DESTDIR)$(LIBDIR)/libmoar.so"
-	$(CP) libmoar.so  "$(DESTDIR)$(LIBDIR)"
+	$(RM_F) "$(DESTDIR)$(LIBDIR)/libmoar.dylib"
+	$(CP) libmoar.dylib libmoar.dylib "$(DESTDIR)$(LIBDIR)"
 	$(MKPATH) "$(DESTDIR)$(MASTDIR)"
 	$(CP) lib/MAST/Nodes.nqp "$(DESTDIR)$(MASTDIR)"
 	$(CP) lib/MAST/Ops.nqp "$(DESTDIR)$(MASTDIR)"
@@ -560,7 +562,7 @@
 	$(CP) 3rdparty/dyncall/dyncallback/*.h $(DESTDIR)$(PREFIX)/include/dyncall
 
 
-lib: libmoar.so
+lib: libmoar.dylib
 
 help:
 	@$(CAT) build/help.txt
@@ -575,7 +577,7 @@
 clangcheck gcccheck:
 	@$(MAKE) --no-print-directory -f tools/check.mk $@
 
-moar: $(MAIN_OBJECTS) libmoar.so
+moar: $(MAIN_OBJECTS) libmoar.dylib
 	$(MSG) linking $@
 	$(CMD)$(LD) -o $@ $(LDFLAGS) $(MINGW_UNICODE) $(MAIN_OBJECTS) $(MAIN_LIBS)
 
@@ -583,9 +585,9 @@
 	$(MSG) linking $@
 	$(CMD)$(AR) $(ARFLAGS) $@ $(OBJECTS) $(NOOUT)
 
-libmoar.so: $(OBJECTS) $(THIRDPARTY)
+libmoar.dylib: $(OBJECTS) $(THIRDPARTY)
 	$(MSG) linking $@
-	$(CMD)$(LD) -o $@ $(LDFLAGS) -shared -fPIC  $(OBJECTS) $(DLL_LIBS)
+	$(CMD)$(LD) -o $@ $(LDFLAGS) -dynamiclib -install_name "/Users/kono/src/Perl6/MoarVM/install/lib/libmoar.dylib" $(OBJECTS) $(DLL_LIBS)
 
 libuv: 3rdparty/libuv/libuv.a
 
@@ -593,35 +595,36 @@
 
 tracing:
 	$(MSG) enable tracing dispatch
-	-$(CMD)$(RM) src/main.o src/core/cbc-interp.o
+	-$(CMD)$(RM) src/main.o src/core/interp.o
 	$(CMD)$(MAKE) TRACING=1 CGOTO=0 NOISY="$(NOISY)"
 
 cgoto:
 	$(MSG) enable computed-goto dispatch
-	-$(CMD)$(RM) src/main.o src/core/cbc-interp.o
+	-$(CMD)$(RM) src/main.o src/core/interp.o
 	$(CMD)$(MAKE) TRACING=0 CGOTO=1 NOISY="$(NOISY)"
 
 switch no-tracing no-cgoto:
 	$(MSG) enable regular dispatch
-	-$(CMD)$(RM) src/main.o src/core/cbc-interp.o
+	-$(CMD)$(RM) src/main.o src/core/interp.o
 	$(CMD)$(MAKE) TRACING=0 CGOTO=0 NOISY="$(NOISY)"
 
 # objflags can include -DMVM_BUILD_SHARED which affects pre-processed source
 .c.i:
 	$(MSG) pre-processing $@
-	$(CMD)$(CC) -E $(CFLAGS) -DMVM_BUILD_SHARED -fPIC $(CINCLUDES) > $@ $*.c
+	$(CMD)$(CC) -E $(CFLAGS) -DMVM_BUILD_SHARED  $(CINCLUDES) > $@ $*.c
 
 .c.s:
 	$(MSG) generating assembler for $@
-	$(CMD)$(CC) -S $(CFLAGS) -DMVM_BUILD_SHARED -fPIC $(CINCLUDES) -o $@ $*.c
+	$(CMD)$(CC) -S $(CFLAGS) -DMVM_BUILD_SHARED  $(CINCLUDES) -o $@ $*.c
 
 .c.o:
 	$(MSG) compiling $@
-	$(CMD)$(CC) -c $(CFLAGS) -DMVM_BUILD_SHARED -fPIC $(CINCLUDES) -o $@ $*.c
+	$(CMD)$(CC) -c $(CFLAGS) -DMVM_BUILD_SHARED  $(CINCLUDES) -o $@ $*.c
 
 .cbc.o:
 	$(MSG) compiling $@
-	$(CMD)$(CC) -c $(CFLAGS) -DMVM_BUILD_SHARED -fPIC $(CINCLUDES) -o $@ $*.cbc
+	$(CMD)$(CBC) -c $(CFLAGS) -DMVM_BUILD_SHARED  $(CINCLUDES) -o $@ $*.cbc
+
 
 src/main.o: src/main.c
 	$(MSG) compiling $@
@@ -666,7 +669,7 @@
 
 3rdparty/libuv/libuv.a: $(UV_OBJECTS)
 	$(MSG) linking $@
-	$(CMD)$(AR) $(ARFLAGS) $@ $(UV_LINUX) $(NOOUT)
+	$(CMD)$(AR) $(ARFLAGS) $@ $(UV_DARWIN) $(NOOUT)
 
 3rdparty/libatomicops/src/libatomic_ops.a:
 	$(MSG) linking $@
@@ -706,7 +709,7 @@
 	$(MSG) remove auxiliary files
 	-$(CMD)@: $(NOOUT) $(NOERR)
 	$(MSG) remove 3rdparty files
-	-$(CMD)$(RM) 3rdparty/libuv/libuv.a $(UV_LINUX) $(NOOUT) $(NOERR)
+	-$(CMD)$(RM) 3rdparty/libuv/libuv.a $(UV_DARWIN) $(NOOUT) $(NOERR)
 	-$(CMD)cd 3rdparty/libatomicops/src && $(MAKE) distclean $(NOOUT) $(NOERR)
 	-$(CMD)$(RM) 3rdparty/libtommath/libtommath.a 3rdparty/libtommath/*.o $(NOOUT) $(NOERR)
 	-$(CMD)$(RM) 3rdparty/sha1/libsha1.a 3rdparty/sha1/*.o $(NOOUT) $(NOERR)
@@ -715,7 +718,7 @@
 
 distclean: realclean
 	$(MSG) remove executable and libraries
-	-$(CMD)$(RM) moar libmoar.a libmoar.so $(NOOUT) $(NOERR)
+	-$(CMD)$(RM) moar libmoar.a libmoar.dylib $(NOOUT) $(NOERR)
 	$(MSG) remove configuration and generated files
 	-$(CMD)$(RM) Makefile src/gen/config.h src/gen/config.c src/strings/unicode.c \
 	    tools/check.mk 3rdparty/libatomicops/config.log 3rdparty/libatomicops/config.status $(NOOUT) $(NOERR)
--- a/src/core/cbc-interp.cbc	Sun Dec 02 11:30:34 2018 +0900
+++ b/src/core/cbc-interp.cbc	Sat Dec 08 22:57:55 2018 +0900
@@ -57,10 +57,18 @@
 
 static int tracing_enabled = 0;
 static int op_count=0;
+static int cbctrace=0;
+
+// #define ddd(x) printf("count=%d op=%d cur_op=%p reg[0]=%p reg[2]=%p \n", op_count++, *i->cur_op, i->cur_op, GET_REG(i->cur_op, 0,i).o, GET_REG(i->cur_op, 2,i).o)
+#define ddd(x) printf("count=%d op=%d\n", op_count++, *(MVMuint16 *)i->cur_op)
+// #define ddd(x) 0
 
 __code cbc_next(INTERP i){
     __code (*c)(INTERP);
-    printf("count=%d op=%d\n", op_count++, *i->cur_op);
+    if (cbctrace)
+        ddd(0); 
+    else op_count++;
+    if (op_count>343724) cbctrace = 1;
     c = CODES[NEXT_OP(i)];
     i->tc->gc_status=0;
     goto c(i);
@@ -6454,53 +6462,19 @@
 
 
 /* This is the interpreter run loop. We have one of these per thread. */
-void MVM_interp_run(MVMThreadContext *tc, void (*initial_invoke)(MVMThreadContext *, void *), void *invoke_data) {
-#if MVM_CGOTO
-#endif
+void MVM_interp_run_cbc(MVMThreadContext *tc) {
 
-    INTER inter = {0,NULL,NULL,NULL,NULL,NULL,tc};
+    INTER inter = {0,*tc->interp_cur_op,*tc->interp_bytecode_start,*tc->interp_reg_base,*tc->interp_cu,NULL,tc};
     INTERP i = &inter;
-
-     /* Stash addresses of current op, register base and SC deref base
-     * in the TC; this will be used by anything that needs to switch
-     * the current place we're interpreting. */
     tc->interp_cur_op         = &i->cur_op;
     tc->interp_bytecode_start = &i->bytecode_start;
     tc->interp_reg_base       = &i->reg_base;
     tc->interp_cu             = &i->cu;
 
-    /* With everything set up, do the initial invocation (exactly what this does
-     * varies depending on if this is starting a new thread or is the top-level
-     * program entry point). */
-    initial_invoke(tc, invoke_data);
-
-    /* Set jump point, for if we arrive back in the interpreter from an
-     * exception thrown from C code. */
-    setjmp(tc->interp_jump);
-
     /* Enter runloop. */
     runloop: {
-        //MVMuint16 op;
-
-#if MVM_TRACING
-        if (tracing_enabled) {
-            char *trace_line;
-            trace_line = MVM_exception_backtrace_line(tc, tc->cur_frame, 0, i->cur_op);
-            fprintf(stderr, "Op %d%s\n", (int)*((MVMuint16 *)i->cur_op), trace_line);
-            /* slow tracing is slow. Feel free to speed it. */
-            MVM_free(trace_line);
-        }
-#endif
-
-        /* The ops should be in the same order here as in the oplist file, so
-         * the compiler can can optimise the switch properly */
-        //DISPATCH(NEXT_OP(i))
-	//goto (CODES[(i->op = *(MVMuint16 *)(i->cur_op), i->cur_op += 2, i->op)])(i);
 	MVM_interp_run1(i);
     }
 
 }
 
-void MVM_interp_enable_tracing() {
-    tracing_enabled = 1;
-}
--- a/src/core/interp.c	Sun Dec 02 11:30:34 2018 +0900
+++ b/src/core/interp.c	Sat Dec 08 22:57:55 2018 +0900
@@ -42,7 +42,9 @@
 #define GET_UI32(pc, idx)   *((MVMuint32 *)(pc + idx))
 #define GET_N32(pc, idx)    *((MVMnum32 *)(pc + idx))
 
-#define NEXT_OP (op = *(MVMuint16 *)(cur_op), cur_op += 2, op)
+#define ddd(x) (op_count++>343724?printf("count=%d op=%d\n", op_count, *(MVMuint16 *)cur_op):0)
+
+#define NEXT_OP (ddd(0), op = *(MVMuint16 *)(cur_op), cur_op += 2, op)
 
 #if MVM_CGOTO
 #define DISPATCH(op)
@@ -56,6 +58,19 @@
 
 static int tracing_enabled = 0;
 
+int use_cbc = 0;
+extern void MVM_interp_run_cbc(MVMThreadContext *tc);
+typedef struct interp {
+     MVMuint16 op;
+     MVMuint8 *cur_op;
+     MVMuint8 *bytecode_start;
+     MVMRegister *reg_base;
+     MVMCompUnit *cu;
+     MVMCallsite *cur_callsite;
+     MVMThreadContext *tc;
+ } INTER,*INTERP;
+
+
 /* This is the interpreter run loop. We have one of these per thread. */
 void MVM_interp_run(MVMThreadContext *tc, void (*initial_invoke)(MVMThreadContext *, void *), void *invoke_data) {
 #if MVM_CGOTO
@@ -96,6 +111,11 @@
      * exception thrown from C code. */
     setjmp(tc->interp_jump);
 
+    if (use_cbc) {
+        MVM_interp_run_cbc(tc);
+        return;
+    }
+
     /* Enter runloop. */
     runloop: {
         MVMuint16 op;
--- a/src/main.c	Sun Dec 02 11:30:34 2018 +0900
+++ b/src/main.c	Sat Dec 08 22:57:55 2018 +0900
@@ -51,7 +51,8 @@
 
     OPT_EXECNAME,
     OPT_LIBPATH,
-    OPT_DEBUGPORT
+    OPT_DEBUGPORT,
+    OPT_CBC
 };
 
 static const char *const FLAGS[] = {
@@ -129,10 +130,14 @@
         return OPT_EXECNAME;
     else if (starts_with(arg, "--debug-port="))
         return OPT_DEBUGPORT;
+    else if (starts_with(arg, "--cbc"))
+        return OPT_CBC;
     else
         return UNKNOWN_FLAG;
 }
 
+extern int use_cbc;
+
 #ifndef _WIN32
 int main(int argc, char *argv[])
 #else
@@ -170,6 +175,10 @@
             dump = 1;
             continue;
 
+            case OPT_CBC:
+            use_cbc = 1;
+            continue;
+
             case FLAG_FULL_CLEANUP:
             full_cleanup = 1;
             continue;