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");