Attached are my revised files. pbc2c.pl uses Parrot::OpTrans::Compiled, and this patch uses Parrot::OpTrans::CGoto. It also fixed the issues with the last patch:
- removed inadvertant keyed commenting - fixed #include name - fixed pbc2c.pl - should have unix line endings Please let me know if there are any other issues which need addressing. Mike Lambert
? parrot/ops2cgc.pl ? parrot/testcomputedgoto_c.in ? parrot/lib/Parrot/OpTrans/Compiled.pm Index: parrot/.cvsignore =================================================================== RCS file: /cvs/public/parrot/.cvsignore,v retrieving revision 1.14 diff -u -r1.14 .cvsignore --- parrot/.cvsignore 8 Jan 2002 17:24:29 -0000 1.14 +++ parrot/.cvsignore 28 Mar 2002 04:58:56 -0000 @@ -1,5 +1,6 @@ blib config.opt +core_ops_cg.c core_ops.c core_ops_prederef.c Makefile Index: parrot/Configure.pl =================================================================== RCS file: /cvs/public/parrot/Configure.pl,v retrieving revision 1.101 diff -u -r1.101 Configure.pl --- parrot/Configure.pl 19 Mar 2002 22:53:57 -0000 1.101 +++ parrot/Configure.pl 28 Mar 2002 04:58:57 -0000 @@ -238,6 +238,17 @@ cp => 'cp', slash => '/', + cg_h => '$(INC)/oplib/core_ops_cg.h', + cg_c => <<'EOF', +core_ops_cg$(O): $(GENERAL_H_FILES) core_ops_cg.c + +core_ops_cg.c $(INC)/oplib/core_ops_cg.h: $(OPS_FILES) ops2cgc.pl +lib/Parrot/OpsFile.pm lib/Parrot/Op.pm + $(PERL) ops2cgc.pl CGoto $(OPS_FILES) +EOF + cg_o => 'core_ops_cg$(O)', + cg_r => '$(RM_F) $(INC)/oplib/core_ops_cg.h core_ops_cg.c', + cg_flag => '-DHAVE_COMPUTED_GOTO', + VERSION => $parrot_version, MAJOR => $parrot_version[0], MINOR => $parrot_version[1], @@ -690,6 +701,32 @@ unlink("include/parrot/vtable.h"); } + +# and now test if we can use computed goto +print <<"END"; + +Still everything ok, let's check if we can use computed goto, +don't worry if you see some errors, it will be all right, +This could take a bit... +END + +{ + buildfile("testcomputedgoto_c"); + my $test = system("$c{cc} $c{ccflags} -o testcomputedgoto$c{exe} +testcomputedgoto.c"); + + if ($test != 0) { + $c{"cg_h"}=''; + $c{"cg_c"}=''; + $c{"cg_o"}=''; + $c{"cg_r"}=''; + $c{"cg_flag"}=''; + } + + unlink('testcomputedgoto.c', "testcomputedgoto$c{exe}", "testcomputedgoto$c{o}"); +} + +# rewrite the Makefile with the updated info +buildfile("Makefile"); # # Rewrite the config file with the updated info Index: parrot/MANIFEST =================================================================== RCS file: /cvs/public/parrot/MANIFEST,v retrieving revision 1.133 diff -u -r1.133 MANIFEST --- parrot/MANIFEST 24 Mar 2002 21:10:49 -0000 1.133 +++ parrot/MANIFEST 28 Mar 2002 04:58:57 -0000 @@ -246,6 +246,7 @@ misc.c obscure.ops ops2c.pl +ops2cgc.pl ops2pm.pl optimizer.pl packdump.c @@ -292,6 +293,7 @@ test_c.in test_gnuc.c test_main.c +testcomputedgoto_c.in testparrotfuncptr.c testparrotsizes_c.in trace.c Index: parrot/MANIFEST.SKIP =================================================================== RCS file: /cvs/public/parrot/MANIFEST.SKIP,v retrieving revision 1.2 diff -u -r1.2 MANIFEST.SKIP --- parrot/MANIFEST.SKIP 21 Mar 2002 23:39:49 -0000 1.2 +++ parrot/MANIFEST.SKIP 28 Mar 2002 04:58:57 -0000 @@ -16,6 +16,7 @@ ^include/parrot/jit_struct\.h$ ^include/parrot/oplib/core_ops\.h$ ^include/parrot/oplib/core_ops_prederef\.h$ +^include/parrot/oplib/core_ops_cg\.h$ ^core_ops\.c$ ^core_ops_prederef\.c$ Index: parrot/Makefile.in =================================================================== RCS file: /cvs/public/parrot/Makefile.in,v retrieving revision 1.141 diff -u -r1.141 Makefile.in --- parrot/Makefile.in 21 Mar 2002 23:47:22 -0000 1.141 +++ parrot/Makefile.in 28 Mar 2002 04:58:57 -0000 @@ -65,7 +65,7 @@ $(INC)/memory.h $(INC)/parrot.h $(INC)/stacks.h $(INC)/packfile.h \ $(INC)/global_setup.h $(INC)/vtable.h $(INC)/oplib/core_ops.h \ $(INC)/oplib/core_ops_prederef.h $(INC)/runops_cores.h $(INC)/trace.h \ -$(INC)/pmc.h $(INC)/key.h $(INC)/resources.h $(INC)/platform.h \ +$(INC)/pmc.h $(INC)/key.h $(INC)/resources.h $(INC)/platform.h ${cg_h} \ $(INC)/interp_guts.h ${jit_h} $(INC)/rx.h $(INC)/rxstacks.h \ $(INC)/embed.h $(INC)/warnings.h $(INC)/misc.h @@ -87,7 +87,7 @@ core_ops$(O) core_ops_prederef$(O) memory$(O) packfile$(O) stacks$(O) \ string$(O) encoding$(O) chartype$(O) runops_cores$(O) trace$(O) pmc$(O) key$(O) \ platform$(O) ${jit_o} resources$(O) rx$(O) rxstacks$(O) embed$(O) warnings$(O) \ -misc$(O) +misc$(O) ${cg_o} O_FILES = $(INTERP_O_FILES) $(IO_O_FILES) $(CLASS_O_FILES) $(ENCODING_O_FILES) $(CHARTYPE_O_FILES) @@ -103,7 +103,7 @@ # ############################################################################### -CFLAGS = ${ccflags} ${cc_warn} ${cc_debug} ${cc_inc} ${cc_hasjit} +CFLAGS = ${ccflags} ${cc_warn} ${cc_debug} ${cc_inc} ${cc_hasjit} ${cg_flag} LDFLAGS = ${ldflags} ${ld_debug} C_LIBS = ${libs} @@ -352,6 +352,8 @@ core_ops_prederef.c $(INC)/oplib/core_ops_prederef.h: $(OPS_FILES) ops2c.pl lib/Parrot/OpsFile.pm lib/Parrot/Op.pm $(PERL) ops2c.pl CPrederef $(OPS_FILES) +${cg_c} + warnings$(O): $(H_FILES) misc$(O): $(H_FILES) @@ -422,6 +424,7 @@ ############################################################################### clean: testclean + ${cg_r} $(RM_F) $(O_FILES) $(RM_F) *.s $(RM_F) $(FLUID_FILES) Index: parrot/interpreter.c =================================================================== RCS file: /cvs/public/parrot/interpreter.c,v retrieving revision 1.80 diff -u -r1.80 interpreter.c --- parrot/interpreter.c 16 Mar 2002 17:38:45 -0000 1.80 +++ parrot/interpreter.c 28 Mar 2002 04:58:59 -0000 @@ -17,6 +17,9 @@ #ifdef HAS_JIT # include "parrot/jit.h" #endif +#ifdef HAVE_COMPUTED_GOTO +# include "parrot/oplib/core_ops_cg.h" +#endif /*=for api interpreter check_fingerprint Index: parrot/pbc2c.pl =================================================================== RCS file: /cvs/public/parrot/pbc2c.pl,v retrieving revision 1.20 diff -u -r1.20 pbc2c.pl --- parrot/pbc2c.pl 19 Mar 2002 23:23:30 -0000 1.20 +++ parrot/pbc2c.pl 28 Mar 2002 04:59:00 -0000 @@ -19,11 +19,11 @@ use Parrot::PackFile; use Parrot::PackFile::ConstTable; use Parrot::OpsFile; -use Parrot::OpTrans::CGoto; +use Parrot::OpTrans::Compiled; use Parrot::OpLib::core; use Parrot::Config; -my $trans = Parrot::OpTrans::CGoto->new; +my $trans = Parrot::OpTrans::Compiled->new; use Data::Dumper; $Data::Dumper::Useqq = 1; Index: parrot/runops_cores.c =================================================================== RCS file: /cvs/public/parrot/runops_cores.c,v retrieving revision 1.14 diff -u -r1.14 runops_cores.c --- parrot/runops_cores.c 5 Mar 2002 05:17:14 -0000 1.14 +++ parrot/runops_cores.c 28 Mar 2002 04:59:00 -0000 @@ -15,6 +15,10 @@ #include "parrot/interp_guts.h" +#ifdef HAVE_COMPUTED_GOTO +# include "parrot/oplib/core_ops_cg.h" +#endif + /*=for api interpreter runops_fast_core * run parrot operations until the program is complete * @@ -26,9 +30,13 @@ opcode_t * runops_fast_core(struct Parrot_Interp *interpreter, opcode_t *pc) { +#ifdef HAVE_COMPUTED_GOTO + pc = cg_core(pc, interpreter); +#else while (pc) { DO_OP(pc, interpreter); } +#endif return pc; } Index: parrot/examples/mops/mops.c =================================================================== RCS file: /cvs/public/parrot/examples/mops/mops.c,v retrieving revision 1.5 diff -u -r1.5 mops.c --- parrot/examples/mops/mops.c 9 Mar 2002 02:10:26 -0000 1.5 +++ parrot/examples/mops/mops.c 28 Mar 2002 04:59:00 -0000 @@ -13,15 +13,7 @@ #include <parrot/parrot.h> #include <stdio.h> -#include <sys/time.h> -FLOATVAL -time_n(void) -{ - struct timeval t; - gettimeofday(&t, NULL); - return (FLOATVAL)t.tv_sec + ((FLOATVAL)t.tv_usec / 1000000.0); -} int main(int argc, char *argv[]) @@ -50,15 +42,15 @@ /* print I5 */ /* print "\n" */ /* */ - N1 = time_n(); /* time N1 */ + N1 = Parrot_floatval_time();/* time N1 */ /* */ REDO: /* REDO: */ I4 = I4 - I3; /* sub I4, I4, I3 */ - if (I4) + if ( I4 ) goto REDO; /* if I4, REDO */ /* */ DONE: /* DONE: */ - N5 = time_n(); /* time N5 */ + N5 = Parrot_floatval_time();/* time N5 */ /* */ N2 = N5 - N1; /* sub N2, N5, N1 */ /* */ @@ -77,6 +69,7 @@ /* */ return 0; /* end */ } + /* * Local variables: Index: parrot/include/parrot/oplib/.cvsignore =================================================================== RCS file: /cvs/public/parrot/include/parrot/oplib/.cvsignore,v retrieving revision 1.3 diff -u -r1.3 .cvsignore --- parrot/include/parrot/oplib/.cvsignore 13 Dec 2001 12:12:45 -0000 1.3 +++ parrot/include/parrot/oplib/.cvsignore 28 Mar 2002 04:59:00 -0000 @@ -1,2 +1,3 @@ *_ops.h *_ops_prederef.h +*_ops_cg.h Index: parrot/lib/Parrot/OpTrans/CGoto.pm =================================================================== RCS file: /cvs/public/parrot/lib/Parrot/OpTrans/CGoto.pm,v retrieving revision 1.6 diff -u -r1.6 CGoto.pm --- parrot/lib/Parrot/OpTrans/CGoto.pm 16 Feb 2002 04:38:18 -0000 1.6 +++ parrot/lib/Parrot/OpTrans/CGoto.pm 28 Mar 2002 04:59:01 -0000 @@ -16,6 +16,7 @@ sub defines { return <<END; +#define REL_PC ((size_t)(cur_opcode - interpreter->code->byte_code)) #define CUR_OPCODE cur_opcode END } @@ -75,13 +76,17 @@ { my ($self, $addr) = @_; #print STDERR "pbcc: map_ret_abs($addr)\n"; - return "cur_opcode = $addr;\ngoto switch_label"; + if ($addr eq '0') { + return "return (0);" + } else { + return "goto *ops_addr[*(cur_opcode = $addr)]"; + } } sub expr_offset { my ($self, $offset) = @_; - return sprintf("&&PC_%d", $self->pc + $offset); + return "cur_opcode + $offset"; } # @@ -91,12 +96,7 @@ sub goto_offset { my ($self, $offset) = @_; - if ($offset =~ /^-?\d+$/) { - return sprintf("goto PC_%d", $self->pc + $offset); - } else { - return sprintf("cur_opcode = &&PC_%d; cur_opcode += %s; goto switch_label", $self->pc, $offset); - } -#print STDERR "pbcc: map_ret_rel($offset)\n"; + return "goto *ops_addr[*(cur_opcode += $offset)]"; } @@ -107,7 +107,7 @@ sub goto_pop { my ($self) = @_; - return "goto *pop_dest(interpreter)"; + return "opcode_t* pop_addr = (opcode_t*)pop_dest(interpreter);\ncur_opcode = +pop_addr;goto *ops_addr[*(pop_addr)]"; } # @@ -115,22 +115,26 @@ # my %arg_maps = ( - 'i' => "interpreter->int_reg.registers[%ld]", - 'n' => "interpreter->num_reg.registers[%ld]", - 'p' => "interpreter->pmc_reg.registers[%ld]", - 's' => "interpreter->string_reg.registers[%ld]", + 'op' => "cur_opcode[%ld]", + + 'i' => "interpreter->int_reg.registers[cur_opcode[%ld]]", + 'n' => "interpreter->num_reg.registers[cur_opcode[%ld]]", + 'p' => "interpreter->pmc_reg.registers[cur_opcode[%ld]]", + 's' => "interpreter->string_reg.registers[cur_opcode[%ld]]", - 'ic' => "%ld", - 'nc' => "interpreter->code->const_table->constants[%ld]->number", + 'ic' => "cur_opcode[%ld]", + 'nc' => "interpreter->code->const_table->constants[cur_opcode[%ld]]->number", 'pc' => "%ld /* ERROR: Don't know how to handle PMC constants yet! */", - 'sc' => "interpreter->code->const_table->constants[%ld]->string", + 'sc' => "interpreter->code->const_table->constants[cur_opcode[%ld]]->string", ); sub access_arg { my ($self, $type, $num, $op) = @_; #print STDERR "pbcc: map_arg($type, $num)\n"; - return sprintf($arg_maps{$type}, $self->arg($num - 1)); + die "Unrecognized type '$type' for num '$num'" unless exists $arg_maps{$type}; + + return sprintf($arg_maps{$type}, $num ); } @@ -141,7 +145,7 @@ sub restart_address { my ($self, $addr) = @_; - die "pbc2c.pl: Cannot handle RESUME ops!"; + return "interpreter->resume_offset = $addr; interpreter->resume_flag = 1"; } @@ -152,9 +156,8 @@ sub restart_offset { my ($self, $offset) = @_; - die "pbc2c.pl: Cannot handle RESUME ops!"; + return "interpreter->resume_offset = REL_PC + $offset; interpreter->resume_flag = +1"; } - 1;
/* * testcomputedgoto.c - figure out if we can use computed goto * * This file is automatically generated by Configure * from testcomputedgoto_c.in. */ int main(int argc, char **argv) { static void *ptr = &&LABEL; int a; goto *ptr; LABEL: { a = 1; } return 0; }
Compiled.pm
Description: lib/Parrot/OpTrans/Compiled.pm
ops2cgc.pl
Description: ops2cgc.pl