OK then, here is the patch, of course I don't expect this to be commited
since it's crap but if you test it (please do it) and it's ok for everyone
I will rewrite it more efficiently.

*PLEASE* test it and give me some feedback.

Thanks in advance.

On Thu, 1 Nov 2001, Simon Cozens wrote:

> On Thu, Nov 01, 2001 at 10:31:07AM -0500, Dan Sugalski wrote:
> > So it looks like about a 2.5 speedup with computed goto. Cool.
>
> Looks really good to me, too. Where's the patch? This should probably
> go in as an alternate runops core.
>
> --
> The problem with big-fish-little-pond situations is that you
> have to put up with all these fscking minnows everywhere.
>     -- Rich Lafferty
>
39c39
<     while (pc) { DO_OP(pc, interpreter); }
---
>     just_do_it(interpreter,pc);
107a108,109
> my @op_labels;
> my @op_addr;
116a119
>     my $label      = "PC_$index:\n";
117a121
>     my $source_goto= $op->source(\&map_ret_abs_goto, \&map_ret_rel_goto, \&map_arg, 
>\&map_res_abs, \&map_res_rel);
118a123
>     push @op_addr, "    &&PC_$index,\n";
121a127
>     push @op_labels, "$label {\n$source_goto}\n\n";
129c135,136
< print SOURCE <<END_C;
---
> if ($ARGV[0] eq "core.ops") {
>     print SOURCE <<END_C;
132a140
> int just_do_it(struct Parrot_Interp *, opcode_t *);
137a146,150
> int
> just_do_it(struct Parrot_Interp *interpreter, opcode_t * cur_opcode)
> {
> 
> static void *ops_l[] = {
140c153,157
< print SOURCE @op_funcs;
---
>     print SOURCE @op_addr;
> 
>     print SOURCE <<END_C;
> };
> goto *ops_l[*cur_opcode];
141a159,171
> END_C
> 
>     print SOURCE @op_labels;
> 
>     print SOURCE "}\n";
> } else {
>     print SOURCE <<END_C;
>   NULL
> };
> END_C
> }
> 
> print SOURCE @op_funcs;
188a219,242
> 
> #
> # map_ret_abs_goto()
> #
> 
> sub map_ret_abs_goto
> {
>   my ($addr) = @_;
>   if ($addr eq '0') {
>       return "return (0);"
>   } else { 
>       return "goto *ops_l[*(cur_opcode = $addr)]";
>   }
> }
> 
> #
> # map_ret_rel_goto()
> #
> 
> sub map_ret_rel_goto
> {
>   my ($offset) = @_;
>   return "goto *ops_l[*(cur_opcode += $offset)]";
> }

Reply via email to