Skip to content

Commit 349a388

Browse files
committed
Slit INC/DEC opcodes into hot/cold parts and remove specialized versioins for LONG_OR_DOUBLE.
1 parent a0f450a commit 349a388

File tree

4 files changed

+274
-478
lines changed

4 files changed

+274
-478
lines changed

Zend/zend_vm_def.h

Lines changed: 60 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -1523,22 +1523,14 @@ ZEND_VM_HANDLER(41, ZEND_POST_DEC_STATIC_PROP, ANY, ANY, CACHE_SLOT)
15231523
ZEND_VM_DISPATCH_TO_HANDLER(ZEND_POST_INC_STATIC_PROP);
15241524
}
15251525

1526-
ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL))
1526+
ZEND_VM_HELPER(zend_pre_inc_helper, VAR|CV, ANY)
15271527
{
15281528
USE_OPLINE
15291529
zend_free_op free_op1;
15301530
zval *var_ptr;
15311531

15321532
var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
15331533

1534-
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
1535-
fast_long_increment_function(var_ptr);
1536-
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
1537-
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
1538-
}
1539-
ZEND_VM_NEXT_OPCODE();
1540-
}
1541-
15421534
if (OP1_TYPE == IS_VAR && UNEXPECTED(Z_ISERROR_P(var_ptr))) {
15431535
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
15441536
ZVAL_NULL(EX_VAR(opline->result.var));
@@ -1572,7 +1564,7 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL))
15721564
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
15731565
}
15741566

1575-
ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL))
1567+
ZEND_VM_HOT_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL))
15761568
{
15771569
USE_OPLINE
15781570
zend_free_op free_op1;
@@ -1581,13 +1573,24 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL))
15811573
var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
15821574

15831575
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
1584-
fast_long_decrement_function(var_ptr);
1576+
fast_long_increment_function(var_ptr);
15851577
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
15861578
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
15871579
}
15881580
ZEND_VM_NEXT_OPCODE();
15891581
}
15901582

1583+
ZEND_VM_DISPATCH_TO_HELPER(zend_pre_inc_helper);
1584+
}
1585+
1586+
ZEND_VM_HELPER(zend_pre_dec_helper, VAR|CV, ANY)
1587+
{
1588+
USE_OPLINE
1589+
zend_free_op free_op1;
1590+
zval *var_ptr;
1591+
1592+
var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
1593+
15911594
if (OP1_TYPE == IS_VAR && UNEXPECTED(Z_ISERROR_P(var_ptr))) {
15921595
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
15931596
ZVAL_NULL(EX_VAR(opline->result.var));
@@ -1622,7 +1625,7 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL))
16221625
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
16231626
}
16241627

1625-
ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY)
1628+
ZEND_VM_HOT_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL))
16261629
{
16271630
USE_OPLINE
16281631
zend_free_op free_op1;
@@ -1631,11 +1634,24 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY)
16311634
var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
16321635

16331636
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
1634-
ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
1635-
fast_long_increment_function(var_ptr);
1637+
fast_long_decrement_function(var_ptr);
1638+
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
1639+
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
1640+
}
16361641
ZEND_VM_NEXT_OPCODE();
16371642
}
16381643

1644+
ZEND_VM_DISPATCH_TO_HELPER(zend_pre_dec_helper);
1645+
}
1646+
1647+
ZEND_VM_HELPER(zend_post_inc_helper, VAR|CV, ANY)
1648+
{
1649+
USE_OPLINE
1650+
zend_free_op free_op1;
1651+
zval *var_ptr;
1652+
1653+
var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
1654+
16391655
if (OP1_TYPE == IS_VAR && UNEXPECTED(Z_ISERROR_P(var_ptr))) {
16401656
ZVAL_NULL(EX_VAR(opline->result.var));
16411657
ZEND_VM_NEXT_OPCODE();
@@ -1666,7 +1682,7 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY)
16661682
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
16671683
}
16681684

1669-
ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY)
1685+
ZEND_VM_HOT_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY)
16701686
{
16711687
USE_OPLINE
16721688
zend_free_op free_op1;
@@ -1676,10 +1692,21 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY)
16761692

16771693
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
16781694
ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
1679-
fast_long_decrement_function(var_ptr);
1695+
fast_long_increment_function(var_ptr);
16801696
ZEND_VM_NEXT_OPCODE();
16811697
}
16821698

1699+
ZEND_VM_DISPATCH_TO_HELPER(zend_post_inc_helper);
1700+
}
1701+
1702+
ZEND_VM_HELPER(zend_post_dec_helper, VAR|CV, ANY)
1703+
{
1704+
USE_OPLINE
1705+
zend_free_op free_op1;
1706+
zval *var_ptr;
1707+
1708+
var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
1709+
16831710
if (OP1_TYPE == IS_VAR && UNEXPECTED(Z_ISERROR_P(var_ptr))) {
16841711
ZVAL_NULL(EX_VAR(opline->result.var));
16851712
ZEND_VM_NEXT_OPCODE();
@@ -1710,6 +1737,23 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY)
17101737
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
17111738
}
17121739

1740+
ZEND_VM_HOT_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY)
1741+
{
1742+
USE_OPLINE
1743+
zend_free_op free_op1;
1744+
zval *var_ptr;
1745+
1746+
var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
1747+
1748+
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
1749+
ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
1750+
fast_long_decrement_function(var_ptr);
1751+
ZEND_VM_NEXT_OPCODE();
1752+
}
1753+
1754+
ZEND_VM_DISPATCH_TO_HELPER(zend_post_dec_helper);
1755+
}
1756+
17131757
ZEND_VM_HANDLER(136, ZEND_ECHO, CONST|TMPVAR|CV, ANY)
17141758
{
17151759
USE_OPLINE
@@ -8996,23 +9040,6 @@ ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_PRE_INC, (op1_info == MAY_BE_LONG), ZEND_PRE_
89969040
ZEND_VM_NEXT_OPCODE();
89979041
}
89989042

8999-
ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_PRE_INC, (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)), ZEND_PRE_INC_LONG_OR_DOUBLE, CV, ANY, SPEC(RETVAL))
9000-
{
9001-
USE_OPLINE
9002-
zval *var_ptr;
9003-
9004-
var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
9005-
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
9006-
fast_long_increment_function(var_ptr);
9007-
} else {
9008-
Z_DVAL_P(var_ptr)++;
9009-
}
9010-
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
9011-
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
9012-
}
9013-
ZEND_VM_NEXT_OPCODE();
9014-
}
9015-
90169043
ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_PRE_DEC, (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG), ZEND_PRE_DEC_LONG_NO_OVERFLOW, CV, ANY, SPEC(RETVAL))
90179044
{
90189045
USE_OPLINE
@@ -9039,23 +9066,6 @@ ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_PRE_DEC, (op1_info == MAY_BE_LONG), ZEND_PRE_
90399066
ZEND_VM_NEXT_OPCODE();
90409067
}
90419068

9042-
ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_PRE_DEC, (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)), ZEND_PRE_DEC_LONG_OR_DOUBLE, CV, ANY, SPEC(RETVAL))
9043-
{
9044-
USE_OPLINE
9045-
zval *var_ptr;
9046-
9047-
var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
9048-
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
9049-
fast_long_decrement_function(var_ptr);
9050-
} else {
9051-
Z_DVAL_P(var_ptr)--;
9052-
}
9053-
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
9054-
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
9055-
}
9056-
ZEND_VM_NEXT_OPCODE();
9057-
}
9058-
90599069
ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_POST_INC, (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG), ZEND_POST_INC_LONG_NO_OVERFLOW, CV, ANY)
90609070
{
90619071
USE_OPLINE
@@ -9078,22 +9088,6 @@ ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_POST_INC, (op1_info == MAY_BE_LONG), ZEND_POS
90789088
ZEND_VM_NEXT_OPCODE();
90799089
}
90809090

9081-
ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_POST_INC, (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)), ZEND_POST_INC_LONG_OR_DOUBLE, CV, ANY)
9082-
{
9083-
USE_OPLINE
9084-
zval *var_ptr;
9085-
9086-
var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
9087-
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
9088-
ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
9089-
fast_long_increment_function(var_ptr);
9090-
} else {
9091-
ZVAL_DOUBLE(EX_VAR(opline->result.var), Z_DVAL_P(var_ptr));
9092-
Z_DVAL_P(var_ptr)++;
9093-
}
9094-
ZEND_VM_NEXT_OPCODE();
9095-
}
9096-
90979091
ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_POST_DEC, (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG), ZEND_POST_DEC_LONG_NO_OVERFLOW, CV, ANY)
90989092
{
90999093
USE_OPLINE
@@ -9116,22 +9110,6 @@ ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_POST_DEC, (op1_info == MAY_BE_LONG), ZEND_POS
91169110
ZEND_VM_NEXT_OPCODE();
91179111
}
91189112

9119-
ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_POST_DEC, (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)), ZEND_POST_DEC_LONG_OR_DOUBLE, CV, ANY)
9120-
{
9121-
USE_OPLINE
9122-
zval *var_ptr;
9123-
9124-
var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
9125-
if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) {
9126-
ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(var_ptr));
9127-
fast_long_decrement_function(var_ptr);
9128-
} else {
9129-
ZVAL_DOUBLE(EX_VAR(opline->result.var), Z_DVAL_P(var_ptr));
9130-
Z_DVAL_P(var_ptr)--;
9131-
}
9132-
ZEND_VM_NEXT_OPCODE();
9133-
}
9134-
91359113
ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_QM_ASSIGN, (op1_info == MAY_BE_DOUBLE), ZEND_QM_ASSIGN_DOUBLE, CONST|TMPVARCV, ANY)
91369114
{
91379115
USE_OPLINE

0 commit comments

Comments
 (0)