diff options
author | Dmitry Stogov <dmitry@zend.com> | 2019-04-05 00:25:45 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2019-04-05 00:25:45 +0300 |
commit | d6848625d7309b76377aa50b07a5bbdb6779c042 (patch) | |
tree | 3162822fb969f23c30ec5dcd4051a758efd859a8 /Zend/zend_execute.c | |
parent | 9038d5c6ee223027dde2e9e69e24e7d3c04e8af2 (diff) | |
download | php-git-d6848625d7309b76377aa50b07a5bbdb6779c042.tar.gz |
Optimized "smart branch" instructions
Diffstat (limited to 'Zend/zend_execute.c')
-rw-r--r-- | Zend/zend_execute.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index e71075c9d4..2b1fe19e3a 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -4365,12 +4365,32 @@ static zend_never_inline int ZEND_FASTCALL zend_quick_check_constant( } \ ZEND_VM_CONTINUE(); \ } while (0) +#define ZEND_VM_SMART_BRANCH_TRUE() do { \ + if (EXPECTED((opline+1)->opcode == ZEND_JMPNZ)) { \ + ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline + 1, (opline+1)->op2)); \ + ZEND_VM_CONTINUE(); \ + } else if (EXPECTED((opline+1)->opcode == ZEND_JMPZ)) { \ + ZEND_VM_SET_NEXT_OPCODE(opline + 2); \ + ZEND_VM_CONTINUE(); \ + } \ + } while (0) +#define ZEND_VM_SMART_BRANCH_FALSE() do { \ + if (EXPECTED((opline+1)->opcode == ZEND_JMPNZ)) { \ + ZEND_VM_SET_NEXT_OPCODE(opline + 2); \ + ZEND_VM_CONTINUE(); \ + } else if (EXPECTED((opline+1)->opcode == ZEND_JMPZ)) { \ + ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline + 1, (opline+1)->op2)); \ + ZEND_VM_CONTINUE(); \ + } \ + } while (0) #else # define ZEND_VM_REPEATABLE_OPCODE # define ZEND_VM_REPEAT_OPCODE(_opcode) # define ZEND_VM_SMART_BRANCH(_result, _check) # define ZEND_VM_SMART_BRANCH_JMPZ(_result, _check) # define ZEND_VM_SMART_BRANCH_JMPNZ(_result, _check) +# define ZEND_VM_SMART_BRANCH_TRUE() +# define ZEND_VM_SMART_BRANCH_FASLE() #endif #ifdef __GNUC__ |