On Wed, Sep 30, 2015 at 1:16 AM, Matt Wilmas <php_li...@realplain.com>
wrote:

> Hi Dmitry,
>
> Just curious about this. :-)  For dispatching next opcode, isn't a tail
> call an indirect jmp instruction, just like a computed goto?  So how is it
> different than GOTO executor...?  Debugging/compatibility?  (Unless it can
> work with MSVC -- oh nevermind, looks like it's only with global registers
> anyway.)
>
> Wondering what you had in mind when adding it, etc.  So it'd be cool if
> there's anything else you could tell us about it, or who should use it and
> why...
>

Hi Matt,

GOTO executor is faster on small benchmarks, but doesn't make speedup on
real apps.
May be TAIL-CALL would make a difference.
Anyway this is an experimental option, that doesn't work yet.
May be someone could make it work.

Thanks. Dmitry.




>
>
> Thanks,
> Matt
>
>
> ----- Original Message -----
> From: "Dmitry Stogov"
> Sent: Friday, September 25, 2015
>
> Commit:    7e797f13026440c54e24f89cf29f46bb0b262a39
> Author:    Dmitry Stogov <dmi...@zend.com>         Fri, 25 Sep 2015
> 12:54:51 +0300
> Parents:   37c85ebb9469b4411bb5d144e6d9ec525ea552a1
> Branches:  PHP-7.0 master
>
> Link:
> http://git.php.net/?p=php-src.git;a=commitdiff;h=7e797f13026440c54e24f89cf29f46bb0b262a39
>
> Log:
> Allow an experimental VM with tail call dispatch technique (disabled by
> default).
> This VM may work only if all tail calls are optimized, otherwaise it will
> crach because of stack overflow.
> Unfortunately, we can't guarantee tail call optimization in C.
>
> Changed paths:
>  M  Zend/zend_vm_execute.h
>  M  Zend/zend_vm_gen.php
>
>
> Diff:
> diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
> index 253a2d7..035f4ab 100644
> --- a/Zend/zend_vm_execute.h
> +++ b/Zend/zend_vm_execute.h
> @@ -337,8 +337,12 @@ register const zend_op* volatile opline
> __asm__(ZEND_VM_IP_GLOBAL_REG);
> #if defined(ZEND_VM_FP_GLOBAL_REG) && defined(ZEND_VM_IP_GLOBAL_REG)
> # define ZEND_OPCODE_HANDLER_RET void
> # define ZEND_VM_TAIL_CALL(call) call; return
> -# define ZEND_VM_CONTINUE()      return
> -# define ZEND_VM_RETURN()        opline = NULL; ZEND_VM_CONTINUE()
> +# ifdef ZEND_VM_TAIL_CALL_DISPATCH
> +#  define ZEND_VM_CONTINUE()
> ((opcode_handler_t)OPLINE->handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
> return
> +# else
> +#  define ZEND_VM_CONTINUE()     return
> +# endif
> +# define ZEND_VM_RETURN()        opline = NULL; return
> #else
> # define ZEND_OPCODE_HANDLER_RET int
> # define ZEND_VM_TAIL_CALL(call) return call
> diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php
> index 8f06bb4..613b4c9 100644
> --- a/Zend/zend_vm_gen.php
> +++ b/Zend/zend_vm_gen.php
> @@ -1058,8 +1058,12 @@ function gen_executor($f, $skl, $spec, $kind,
> $executor_name, $initializer_name)
>  out($f,"#if defined(ZEND_VM_FP_GLOBAL_REG) &&
> defined(ZEND_VM_IP_GLOBAL_REG)\n");
>  out($f,"# define ZEND_OPCODE_HANDLER_RET void\n");
>  out($f,"# define ZEND_VM_TAIL_CALL(call) call; return\n");
> - out($f,"# define ZEND_VM_CONTINUE()      return\n");
> - out($f,"# define ZEND_VM_RETURN()        opline = NULL;
> ZEND_VM_CONTINUE()\n");
> + out($f,"# ifdef ZEND_VM_TAIL_CALL_DISPATCH\n");
> + out($f,"#  define ZEND_VM_CONTINUE()
> ((opcode_handler_t)OPLINE->handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
> return\n");
> + out($f,"# else\n");
> + out($f,"#  define ZEND_VM_CONTINUE()     return\n");
> + out($f,"# endif\n");
> + out($f,"# define ZEND_VM_RETURN()        opline = NULL; return\n");
>  out($f,"#else\n");
>  out($f,"# define ZEND_OPCODE_HANDLER_RET int\n");
>  out($f,"# define ZEND_VM_TAIL_CALL(call) return call\n");

Reply via email to