]> granicus.if.org Git - php/commitdiff
Use common code for double math
authorDmitry Stogov <dmitry@zend.com>
Fri, 12 Jul 2019 08:40:56 +0000 (11:40 +0300)
committerDmitry Stogov <dmitry@zend.com>
Fri, 12 Jul 2019 08:40:56 +0000 (11:40 +0300)
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 98f6cd6966c22e52dff8a1d55ab85a5f4bc25560..6f91d288fa67ce366cdd06fd485f75bb550cb9eb 100644 (file)
@@ -49,6 +49,7 @@ ZEND_VM_HOT_NOCONSTCONST_HANDLER(1, ZEND_ADD, CONST|TMPVARCV, CONST|TMPVARCV)
        USE_OPLINE
        zend_free_op free_op1, free_op2;
        zval *op1, *op2, *result;
+       double d1, d2;
 
        op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
        op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
@@ -60,19 +61,22 @@ ZEND_VM_HOT_NOCONSTCONST_HANDLER(1, ZEND_ADD, CONST|TMPVARCV, CONST|TMPVARCV)
                        fast_long_add_function(result, op1, op2);
                        ZEND_VM_NEXT_OPCODE();
                } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                       result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) + Z_DVAL_P(op2));
-                       ZEND_VM_NEXT_OPCODE();
+                       d1 = (double)Z_LVAL_P(op1);
+                       d2 = Z_DVAL_P(op2);
+                       ZEND_VM_C_GOTO(add_double);
                }
        } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
                if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       d1 = Z_DVAL_P(op1);
+                       d2 = Z_DVAL_P(op2);
+ZEND_VM_C_LABEL(add_double):
                        result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2));
+                       ZVAL_DOUBLE(result, d1 + d2);
                        ZEND_VM_NEXT_OPCODE();
                } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                       result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, Z_DVAL_P(op1) + ((double)Z_LVAL_P(op2)));
-                       ZEND_VM_NEXT_OPCODE();
+                       d1 = Z_DVAL_P(op1);
+                       d2 = (double)Z_LVAL_P(op2);
+                       ZEND_VM_C_GOTO(add_double);
                }
        }
 
@@ -105,6 +109,7 @@ ZEND_VM_HOT_NOCONSTCONST_HANDLER(2, ZEND_SUB, CONST|TMPVARCV, CONST|TMPVARCV)
        USE_OPLINE
        zend_free_op free_op1, free_op2;
        zval *op1, *op2, *result;
+       double d1, d2;
 
        op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
        op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
@@ -116,19 +121,22 @@ ZEND_VM_HOT_NOCONSTCONST_HANDLER(2, ZEND_SUB, CONST|TMPVARCV, CONST|TMPVARCV)
                        fast_long_sub_function(result, op1, op2);
                        ZEND_VM_NEXT_OPCODE();
                } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                       result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) - Z_DVAL_P(op2));
-                       ZEND_VM_NEXT_OPCODE();
+                       d1 = (double)Z_LVAL_P(op1);
+                       d2 = Z_DVAL_P(op2);
+                       ZEND_VM_C_GOTO(sub_double);
                }
        } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
                if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       d1 = Z_DVAL_P(op1);
+                       d2 = Z_DVAL_P(op2);
+ZEND_VM_C_LABEL(sub_double):
                        result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
+                       ZVAL_DOUBLE(result, d1 - d2);
                        ZEND_VM_NEXT_OPCODE();
                } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                       result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, Z_DVAL_P(op1) - ((double)Z_LVAL_P(op2)));
-                       ZEND_VM_NEXT_OPCODE();
+                       d1 = Z_DVAL_P(op1);
+                       d2 = (double)Z_LVAL_P(op2);
+                       ZEND_VM_C_GOTO(sub_double);
                }
        }
 
@@ -161,6 +169,7 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(3, ZEND_MUL, CONST|TMPVARCV, CONST|TMPVARCV, SPE
        USE_OPLINE
        zend_free_op free_op1, free_op2;
        zval *op1, *op2, *result;
+       double d1, d2;
 
        op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
        op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
@@ -175,19 +184,22 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(3, ZEND_MUL, CONST|TMPVARCV, CONST|TMPVARCV, SPE
                        Z_TYPE_INFO_P(result) = overflow ? IS_DOUBLE : IS_LONG;
                        ZEND_VM_NEXT_OPCODE();
                } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                       result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) * Z_DVAL_P(op2));
-                       ZEND_VM_NEXT_OPCODE();
+                       d1 = (double)Z_LVAL_P(op1);
+                       d2 = Z_DVAL_P(op2);
+                       ZEND_VM_C_GOTO(mul_double);
                }
        } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
                if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       d1 = Z_DVAL_P(op1);
+                       d2 = Z_DVAL_P(op2);
+ZEND_VM_C_LABEL(mul_double):
                        result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, Z_DVAL_P(op1) * Z_DVAL_P(op2));
+                       ZVAL_DOUBLE(result, d1 * d2);
                        ZEND_VM_NEXT_OPCODE();
                } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                       result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, Z_DVAL_P(op1) * ((double)Z_LVAL_P(op2)));
-                       ZEND_VM_NEXT_OPCODE();
+                       d1 = Z_DVAL_P(op1);
+                       d2 = (double)Z_LVAL_P(op2);
+                       ZEND_VM_C_GOTO(mul_double);
                }
        }
 
index 22c9114dbf26b5e1e5f862ea97bf3fb5f6d343be..4da388bf60f9572d28878e69c4d3a124e11f5fbc 100644 (file)
@@ -4634,6 +4634,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CONST_CO
        USE_OPLINE
 
        zval *op1, *op2, *result;
+       double d1, d2;
 
        op1 = RT_CONSTANT(opline, opline->op1);
        op2 = RT_CONSTANT(opline, opline->op2);
@@ -4645,19 +4646,22 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CONST_CO
                        fast_long_add_function(result, op1, op2);
                        ZEND_VM_NEXT_OPCODE();
                } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                       result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) + Z_DVAL_P(op2));
-                       ZEND_VM_NEXT_OPCODE();
+                       d1 = (double)Z_LVAL_P(op1);
+                       d2 = Z_DVAL_P(op2);
+                       goto add_double;
                }
        } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
                if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       d1 = Z_DVAL_P(op1);
+                       d2 = Z_DVAL_P(op2);
+add_double:
                        result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2));
+                       ZVAL_DOUBLE(result, d1 + d2);
                        ZEND_VM_NEXT_OPCODE();
                } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                       result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, Z_DVAL_P(op1) + ((double)Z_LVAL_P(op2)));
-                       ZEND_VM_NEXT_OPCODE();
+                       d1 = Z_DVAL_P(op1);
+                       d2 = (double)Z_LVAL_P(op2);
+                       goto add_double;
                }
        }
 
@@ -4669,6 +4673,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CONST_CO
        USE_OPLINE
 
        zval *op1, *op2, *result;
+       double d1, d2;
 
        op1 = RT_CONSTANT(opline, opline->op1);
        op2 = RT_CONSTANT(opline, opline->op2);
@@ -4680,19 +4685,22 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CONST_CO
                        fast_long_sub_function(result, op1, op2);
                        ZEND_VM_NEXT_OPCODE();
                } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                       result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) - Z_DVAL_P(op2));
-                       ZEND_VM_NEXT_OPCODE();
+                       d1 = (double)Z_LVAL_P(op1);
+                       d2 = Z_DVAL_P(op2);
+                       goto sub_double;
                }
        } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
                if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       d1 = Z_DVAL_P(op1);
+                       d2 = Z_DVAL_P(op2);
+sub_double:
                        result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
+                       ZVAL_DOUBLE(result, d1 - d2);
                        ZEND_VM_NEXT_OPCODE();
                } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                       result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, Z_DVAL_P(op1) - ((double)Z_LVAL_P(op2)));
-                       ZEND_VM_NEXT_OPCODE();
+                       d1 = Z_DVAL_P(op1);
+                       d2 = (double)Z_LVAL_P(op2);
+                       goto sub_double;
                }
        }
 
@@ -4704,6 +4712,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CONST_CO
        USE_OPLINE
 
        zval *op1, *op2, *result;
+       double d1, d2;
 
        op1 = RT_CONSTANT(opline, opline->op1);
        op2 = RT_CONSTANT(opline, opline->op2);
@@ -4718,19 +4727,22 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_CONST_CO
                        Z_TYPE_INFO_P(result) = overflow ? IS_DOUBLE : IS_LONG;
                        ZEND_VM_NEXT_OPCODE();
                } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                       result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) * Z_DVAL_P(op2));
-                       ZEND_VM_NEXT_OPCODE();
+                       d1 = (double)Z_LVAL_P(op1);
+                       d2 = Z_DVAL_P(op2);
+                       goto mul_double;
                }
        } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
                if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       d1 = Z_DVAL_P(op1);
+                       d2 = Z_DVAL_P(op2);
+mul_double:
                        result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, Z_DVAL_P(op1) * Z_DVAL_P(op2));
+                       ZVAL_DOUBLE(result, d1 * d2);
                        ZEND_VM_NEXT_OPCODE();
                } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                       result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, Z_DVAL_P(op1) * ((double)Z_LVAL_P(op2)));
-                       ZEND_VM_NEXT_OPCODE();
+                       d1 = Z_DVAL_P(op1);
+                       d2 = (double)Z_LVAL_P(op2);
+                       goto mul_double;
                }
        }
 
@@ -6614,6 +6626,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CONST_TMP
        USE_OPLINE
 
        zval *op1, *op2, *result;
+       double d1, d2;
 
        op1 = RT_CONSTANT(opline, opline->op1);
        op2 = EX_VAR(opline->op2.var);
@@ -6625,19 +6638,22 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CONST_TMP
                        fast_long_add_function(result, op1, op2);
                        ZEND_VM_NEXT_OPCODE();
                } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                       result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) + Z_DVAL_P(op2));
-                       ZEND_VM_NEXT_OPCODE();
+                       d1 = (double)Z_LVAL_P(op1);
+                       d2 = Z_DVAL_P(op2);
+                       goto add_double;
                }
        } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
                if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       d1 = Z_DVAL_P(op1);
+                       d2 = Z_DVAL_P(op2);
+add_double:
                        result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2));
+                       ZVAL_DOUBLE(result, d1 + d2);
                        ZEND_VM_NEXT_OPCODE();
                } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                       result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, Z_DVAL_P(op1) + ((double)Z_LVAL_P(op2)));
-                       ZEND_VM_NEXT_OPCODE();
+                       d1 = Z_DVAL_P(op1);
+                       d2 = (double)Z_LVAL_P(op2);
+                       goto add_double;
                }
        }
 
@@ -6649,6 +6665,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CONST_TMP
        USE_OPLINE
 
        zval *op1, *op2, *result;
+       double d1, d2;
 
        op1 = RT_CONSTANT(opline, opline->op1);
        op2 = EX_VAR(opline->op2.var);
@@ -6660,19 +6677,22 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_CONST_TMP
                        fast_long_sub_function(result, op1, op2);
                        ZEND_VM_NEXT_OPCODE();
                } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                       result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) - Z_DVAL_P(op2));
-                       ZEND_VM_NEXT_OPCODE();
+                       d1 = (double)Z_LVAL_P(op1);
+                       d2 = Z_DVAL_P(op2);
+                       goto sub_double;
                }
        } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
                if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       d1 = Z_DVAL_P(op1);
+                       d2 = Z_DVAL_P(op2);
+sub_double:
                        result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
+                       ZVAL_DOUBLE(result, d1 - d2);
                        ZEND_VM_NEXT_OPCODE();
                } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                       result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, Z_DVAL_P(op1) - ((double)Z_LVAL_P(op2)));
-                       ZEND_VM_NEXT_OPCODE();
+                       d1 = Z_DVAL_P(op1);
+                       d2 = (double)Z_LVAL_P(op2);
+                       goto sub_double;
                }
        }
 
@@ -11088,6 +11108,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_TMPVARCV_
        USE_OPLINE
 
        zval *op1, *op2, *result;
+       double d1, d2;
 
        op1 = EX_VAR(opline->op1.var);
        op2 = RT_CONSTANT(opline, opline->op2);
@@ -11099,19 +11120,22 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_TMPVARCV_
                        fast_long_add_function(result, op1, op2);
                        ZEND_VM_NEXT_OPCODE();
                } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                       result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) + Z_DVAL_P(op2));
-                       ZEND_VM_NEXT_OPCODE();
+                       d1 = (double)Z_LVAL_P(op1);
+                       d2 = Z_DVAL_P(op2);
+                       goto add_double;
                }
        } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
                if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       d1 = Z_DVAL_P(op1);
+                       d2 = Z_DVAL_P(op2);
+add_double:
                        result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2));
+                       ZVAL_DOUBLE(result, d1 + d2);
                        ZEND_VM_NEXT_OPCODE();
                } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                       result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, Z_DVAL_P(op1) + ((double)Z_LVAL_P(op2)));
-                       ZEND_VM_NEXT_OPCODE();
+                       d1 = Z_DVAL_P(op1);
+                       d2 = (double)Z_LVAL_P(op2);
+                       goto add_double;
                }
        }
 
@@ -11123,6 +11147,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_TMPVARCV_
        USE_OPLINE
 
        zval *op1, *op2, *result;
+       double d1, d2;
 
        op1 = EX_VAR(opline->op1.var);
        op2 = RT_CONSTANT(opline, opline->op2);
@@ -11134,19 +11159,22 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_TMPVARCV_
                        fast_long_sub_function(result, op1, op2);
                        ZEND_VM_NEXT_OPCODE();
                } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                       result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) - Z_DVAL_P(op2));
-                       ZEND_VM_NEXT_OPCODE();
+                       d1 = (double)Z_LVAL_P(op1);
+                       d2 = Z_DVAL_P(op2);
+                       goto sub_double;
                }
        } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
                if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       d1 = Z_DVAL_P(op1);
+                       d2 = Z_DVAL_P(op2);
+sub_double:
                        result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
+                       ZVAL_DOUBLE(result, d1 - d2);
                        ZEND_VM_NEXT_OPCODE();
                } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                       result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, Z_DVAL_P(op1) - ((double)Z_LVAL_P(op2)));
-                       ZEND_VM_NEXT_OPCODE();
+                       d1 = Z_DVAL_P(op1);
+                       d2 = (double)Z_LVAL_P(op2);
+                       goto sub_double;
                }
        }
 
@@ -11158,6 +11186,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_TMPVARCV_CONST_HANDLE
        USE_OPLINE
 
        zval *op1, *op2, *result;
+       double d1, d2;
 
        op1 = EX_VAR(opline->op1.var);
        op2 = RT_CONSTANT(opline, opline->op2);
@@ -11172,19 +11201,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_TMPVARCV_CONST_HANDLE
                        Z_TYPE_INFO_P(result) = overflow ? IS_DOUBLE : IS_LONG;
                        ZEND_VM_NEXT_OPCODE();
                } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                       result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) * Z_DVAL_P(op2));
-                       ZEND_VM_NEXT_OPCODE();
+                       d1 = (double)Z_LVAL_P(op1);
+                       d2 = Z_DVAL_P(op2);
+                       goto mul_double;
                }
        } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
                if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       d1 = Z_DVAL_P(op1);
+                       d2 = Z_DVAL_P(op2);
+mul_double:
                        result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, Z_DVAL_P(op1) * Z_DVAL_P(op2));
+                       ZVAL_DOUBLE(result, d1 * d2);
                        ZEND_VM_NEXT_OPCODE();
                } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                       result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, Z_DVAL_P(op1) * ((double)Z_LVAL_P(op2)));
-                       ZEND_VM_NEXT_OPCODE();
+                       d1 = Z_DVAL_P(op1);
+                       d2 = (double)Z_LVAL_P(op2);
+                       goto mul_double;
                }
        }
 
@@ -11941,6 +11973,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_TMPVARCV_
        USE_OPLINE
 
        zval *op1, *op2, *result;
+       double d1, d2;
 
        op1 = EX_VAR(opline->op1.var);
        op2 = EX_VAR(opline->op2.var);
@@ -11952,19 +11985,22 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_TMPVARCV_
                        fast_long_add_function(result, op1, op2);
                        ZEND_VM_NEXT_OPCODE();
                } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                       result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) + Z_DVAL_P(op2));
-                       ZEND_VM_NEXT_OPCODE();
+                       d1 = (double)Z_LVAL_P(op1);
+                       d2 = Z_DVAL_P(op2);
+                       goto add_double;
                }
        } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
                if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       d1 = Z_DVAL_P(op1);
+                       d2 = Z_DVAL_P(op2);
+add_double:
                        result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, Z_DVAL_P(op1) + Z_DVAL_P(op2));
+                       ZVAL_DOUBLE(result, d1 + d2);
                        ZEND_VM_NEXT_OPCODE();
                } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                       result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, Z_DVAL_P(op1) + ((double)Z_LVAL_P(op2)));
-                       ZEND_VM_NEXT_OPCODE();
+                       d1 = Z_DVAL_P(op1);
+                       d2 = (double)Z_LVAL_P(op2);
+                       goto add_double;
                }
        }
 
@@ -11976,6 +12012,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_TMPVARCV_
        USE_OPLINE
 
        zval *op1, *op2, *result;
+       double d1, d2;
 
        op1 = EX_VAR(opline->op1.var);
        op2 = EX_VAR(opline->op2.var);
@@ -11987,19 +12024,22 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SUB_SPEC_TMPVARCV_
                        fast_long_sub_function(result, op1, op2);
                        ZEND_VM_NEXT_OPCODE();
                } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                       result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) - Z_DVAL_P(op2));
-                       ZEND_VM_NEXT_OPCODE();
+                       d1 = (double)Z_LVAL_P(op1);
+                       d2 = Z_DVAL_P(op2);
+                       goto sub_double;
                }
        } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
                if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       d1 = Z_DVAL_P(op1);
+                       d2 = Z_DVAL_P(op2);
+sub_double:
                        result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, Z_DVAL_P(op1) - Z_DVAL_P(op2));
+                       ZVAL_DOUBLE(result, d1 - d2);
                        ZEND_VM_NEXT_OPCODE();
                } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                       result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, Z_DVAL_P(op1) - ((double)Z_LVAL_P(op2)));
-                       ZEND_VM_NEXT_OPCODE();
+                       d1 = Z_DVAL_P(op1);
+                       d2 = (double)Z_LVAL_P(op2);
+                       goto sub_double;
                }
        }
 
@@ -12011,6 +12051,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_TMPVARCV_TMPVARCV_HAN
        USE_OPLINE
 
        zval *op1, *op2, *result;
+       double d1, d2;
 
        op1 = EX_VAR(opline->op1.var);
        op2 = EX_VAR(opline->op2.var);
@@ -12025,19 +12066,22 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_MUL_SPEC_TMPVARCV_TMPVARCV_HAN
                        Z_TYPE_INFO_P(result) = overflow ? IS_DOUBLE : IS_LONG;
                        ZEND_VM_NEXT_OPCODE();
                } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                       result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, ((double)Z_LVAL_P(op1)) * Z_DVAL_P(op2));
-                       ZEND_VM_NEXT_OPCODE();
+                       d1 = (double)Z_LVAL_P(op1);
+                       d2 = Z_DVAL_P(op2);
+                       goto mul_double;
                }
        } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
                if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       d1 = Z_DVAL_P(op1);
+                       d2 = Z_DVAL_P(op2);
+mul_double:
                        result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, Z_DVAL_P(op1) * Z_DVAL_P(op2));
+                       ZVAL_DOUBLE(result, d1 * d2);
                        ZEND_VM_NEXT_OPCODE();
                } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                       result = EX_VAR(opline->result.var);
-                       ZVAL_DOUBLE(result, Z_DVAL_P(op1) * ((double)Z_LVAL_P(op2)));
-                       ZEND_VM_NEXT_OPCODE();
+                       d1 = Z_DVAL_P(op1);
+                       d2 = (double)Z_LVAL_P(op2);
+                       goto mul_double;
                }
        }