]> granicus.if.org Git - php/commitdiff
Improved comparison opcode handlers
authorDmitry Stogov <dmitry@zend.com>
Tue, 2 Apr 2019 20:46:21 +0000 (23:46 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 2 Apr 2019 20:46:21 +0000 (23:46 +0300)
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 60c77ce8ae12a7121f8d9875fc38f725d42f9ad6..1d5d01e2984ab6a5631fea3454825fee778489af 100644 (file)
@@ -389,216 +389,204 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(17, ZEND_IS_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR
 {
        USE_OPLINE
        zend_free_op free_op1, free_op2;
-       zval *op1, *op2, *result;
+       zval *op1, *op2;
+       int result;
 
        op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
        op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
-                               result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
-                               FREE_OP1();
-                               FREE_OP2();
-                       } else {
-                               break;
-                       }
+       if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
                } else {
-                       break;
+                       ZEND_VM_C_GOTO(is_equal_slow);
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
-
-       SAVE_OPLINE();
-       if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
+               } else {
+                       ZEND_VM_C_GOTO(is_equal_slow);
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+                       result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+                       FREE_OP1();
+                       FREE_OP2();
+               } else {
+                       ZEND_VM_C_GOTO(is_equal_slow);
+               }
+       } else {
+ZEND_VM_C_LABEL(is_equal_slow):
+               SAVE_OPLINE();
+               if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
+               FREE_OP1();
+               FREE_OP2();
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) == 0;
        }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
-       FREE_OP1();
-       FREE_OP2();
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 ZEND_VM_COLD_CONSTCONST_HANDLER(18, ZEND_IS_NOT_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV, SPEC(COMMUTATIVE))
 {
        USE_OPLINE
        zend_free_op free_op1, free_op2;
-       zval *op1, *op2, *result;
+       zval *op1, *op2;
+       int result;
 
        op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
        op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) != Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
-                               result = !zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
-                               FREE_OP1();
-                               FREE_OP2();
-                       } else {
-                               break;
-                       }
+       if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) != Z_DVAL_P(op2));
                } else {
-                       break;
+                       ZEND_VM_C_GOTO(is_not_equal_slow);
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
-
-       SAVE_OPLINE();
-       if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2)));
+               } else {
+                       ZEND_VM_C_GOTO(is_not_equal_slow);
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+                       result = !zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+                       FREE_OP1();
+                       FREE_OP2();
+               } else {
+                       ZEND_VM_C_GOTO(is_not_equal_slow);
+               }
+       } else {
+ZEND_VM_C_LABEL(is_not_equal_slow):
+               SAVE_OPLINE();
+               if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
+               FREE_OP1();
+               FREE_OP2();
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) != 0;
        }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) != 0);
-       FREE_OP1();
-       FREE_OP2();
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 ZEND_VM_COLD_CONSTCONST_HANDLER(19, ZEND_IS_SMALLER, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
 {
        USE_OPLINE
        zend_free_op free_op1, free_op2;
-       zval *op1, *op2, *result;
+       zval *op1, *op2, *ret;
+       int result;
 
        op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
        op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
+       if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
                } else {
-                       break;
+                       ZEND_VM_C_GOTO(is_smaller_slow);
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
-
-       SAVE_OPLINE();
-       if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
+       } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
+               } else {
+                       ZEND_VM_C_GOTO(is_smaller_slow);
+               }
+       } else {
+ZEND_VM_C_LABEL(is_smaller_slow):
+               SAVE_OPLINE();
+               if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
+               FREE_OP1();
+               FREE_OP2();
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) < 0;
        }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) < 0);
-       FREE_OP1();
-       FREE_OP2();
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 ZEND_VM_COLD_CONSTCONST_HANDLER(20, ZEND_IS_SMALLER_OR_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
 {
        USE_OPLINE
        zend_free_op free_op1, free_op2;
-       zval *op1, *op2, *result;
+       zval *op1, *op2;
+       int result;
 
        op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
        op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
+       if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
                } else {
-                       break;
+                       ZEND_VM_C_GOTO(is_smaller_or_equal_slow);
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
-
-       SAVE_OPLINE();
-       if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
+       } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
+               } else {
+                       ZEND_VM_C_GOTO(is_smaller_or_equal_slow);
+               }
+       } else {
+ZEND_VM_C_LABEL(is_smaller_or_equal_slow):
+               SAVE_OPLINE();
+               if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
+               FREE_OP1();
+               FREE_OP2();
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) <= 0;
        }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) <= 0);
-       FREE_OP1();
-       FREE_OP2();
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 ZEND_VM_COLD_CONSTCONST_HANDLER(170, ZEND_SPACESHIP, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
@@ -5137,56 +5125,53 @@ ZEND_VM_HANDLER(48, ZEND_CASE, TMPVAR, CONST|TMPVAR|CV)
 {
        USE_OPLINE
        zend_free_op free_op1, free_op2;
-       zval *op1, *op2, *result;
+       zval *op1, *op2;
+       int result;
 
        op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
        op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
-                               result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
-                               FREE_OP2();
-                       } else {
-                               break;
-                       }
+       if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
                } else {
-                       break;
+                       ZEND_VM_C_GOTO(case_slow);
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
-
-       SAVE_OPLINE();
-       if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
+               } else {
+                       ZEND_VM_C_GOTO(case_slow);
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+                       result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+                       FREE_OP2();
+               } else {
+                       ZEND_VM_C_GOTO(case_slow);
+               }
+       } else {
+ZEND_VM_C_LABEL(case_slow):
+               SAVE_OPLINE();
+               if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
+               FREE_OP2();
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) == 0;
        }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
-       FREE_OP2();
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 ZEND_VM_HANDLER(68, ZEND_NEW, UNUSED|CLASS_FETCH|CONST|VAR, UNUSED|CACHE_SLOT, NUM)
index f160de75d1d4a92ab1931aace7f918369cfb36c9..c16b763fae55d2dca8637ba1fe0e48a0489e4f8b 100644 (file)
@@ -4412,216 +4412,204 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CON
 {
        USE_OPLINE
 
-       zval *op1, *op2, *result;
+       zval *op1, *op2;
+       int result;
 
        op1 = RT_CONSTANT(opline, opline->op1);
        op2 = RT_CONSTANT(opline, opline->op2);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
-                               result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+       if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
+               } else {
+                       goto is_equal_slow;
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto is_equal_slow;
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+                       result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
 
 
-                       } else {
-                               break;
-                       }
                } else {
-                       break;
+                       goto is_equal_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
-
-       SAVE_OPLINE();
-       if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
-       }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
+       } else {
+is_equal_slow:
+               SAVE_OPLINE();
+               if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
 
 
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) == 0;
+       }
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
 
-       zval *op1, *op2, *result;
+       zval *op1, *op2;
+       int result;
 
        op1 = RT_CONSTANT(opline, opline->op1);
        op2 = RT_CONSTANT(opline, opline->op2);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) != Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
-                               result = !zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+       if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) != Z_DVAL_P(op2));
+               } else {
+                       goto is_not_equal_slow;
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto is_not_equal_slow;
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+                       result = !zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
 
 
-                       } else {
-                               break;
-                       }
                } else {
-                       break;
+                       goto is_not_equal_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
-
-       SAVE_OPLINE();
-       if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
-       }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) != 0);
+       } else {
+is_not_equal_slow:
+               SAVE_OPLINE();
+               if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
 
 
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) != 0;
+       }
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
 
-       zval *op1, *op2, *result;
+       zval *op1, *op2, *ret;
+       int result;
 
        op1 = RT_CONSTANT(opline, opline->op1);
        op2 = RT_CONSTANT(opline, opline->op2);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
+       if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
                } else {
-                       break;
+                       goto is_smaller_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
-
-       SAVE_OPLINE();
-       if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
-       }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) < 0);
+       } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto is_smaller_slow;
+               }
+       } else {
+is_smaller_slow:
+               SAVE_OPLINE();
+               if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
 
 
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) < 0;
+       }
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
 
-       zval *op1, *op2, *result;
+       zval *op1, *op2;
+       int result;
 
        op1 = RT_CONSTANT(opline, opline->op1);
        op2 = RT_CONSTANT(opline, opline->op2);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
+       if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
                } else {
-                       break;
+                       goto is_smaller_or_equal_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
-
-       SAVE_OPLINE();
-       if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
-       }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) <= 0);
+       } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto is_smaller_or_equal_slow;
+               }
+       } else {
+is_smaller_or_equal_slow:
+               SAVE_OPLINE();
+               if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
 
 
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) <= 0;
+       }
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -6899,100 +6887,94 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_TMPVAR_H
 {
        USE_OPLINE
        zend_free_op free_op2;
-       zval *op1, *op2, *result;
+       zval *op1, *op2, *ret;
+       int result;
 
        op1 = RT_CONSTANT(opline, opline->op1);
        op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
+       if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
                } else {
-                       break;
+                       goto is_smaller_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
+       } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto is_smaller_slow;
+               }
+       } else {
+is_smaller_slow:
+               SAVE_OPLINE();
+               if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
 
-       SAVE_OPLINE();
-       if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
+               zval_ptr_dtor_nogc(free_op2);
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) < 0;
        }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) < 0);
-
-       zval_ptr_dtor_nogc(free_op2);
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
        zend_free_op free_op2;
-       zval *op1, *op2, *result;
+       zval *op1, *op2;
+       int result;
 
        op1 = RT_CONSTANT(opline, opline->op1);
        op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
+       if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
                } else {
-                       break;
+                       goto is_smaller_or_equal_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
+       } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto is_smaller_or_equal_slow;
+               }
+       } else {
+is_smaller_or_equal_slow:
+               SAVE_OPLINE();
+               if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
 
-       SAVE_OPLINE();
-       if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
+               zval_ptr_dtor_nogc(free_op2);
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) <= 0;
        }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) <= 0);
-
-       zval_ptr_dtor_nogc(free_op2);
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -9910,100 +9892,94 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_CV_HANDL
 {
        USE_OPLINE
 
-       zval *op1, *op2, *result;
+       zval *op1, *op2, *ret;
+       int result;
 
        op1 = RT_CONSTANT(opline, opline->op1);
        op2 = EX_VAR(opline->op2.var);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
+       if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
                } else {
-                       break;
+                       goto is_smaller_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
-
-       SAVE_OPLINE();
-       if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
-       }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) < 0);
+       } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto is_smaller_slow;
+               }
+       } else {
+is_smaller_slow:
+               SAVE_OPLINE();
+               if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
 
 
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) < 0;
+       }
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
 
-       zval *op1, *op2, *result;
+       zval *op1, *op2;
+       int result;
 
        op1 = RT_CONSTANT(opline, opline->op1);
        op2 = EX_VAR(opline->op2.var);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
+       if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
                } else {
-                       break;
+                       goto is_smaller_or_equal_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
-
-       SAVE_OPLINE();
-       if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
-       }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) <= 0);
+       } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto is_smaller_or_equal_slow;
+               }
+       } else {
+is_smaller_or_equal_slow:
+               SAVE_OPLINE();
+               if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
 
 
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) <= 0;
+       }
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -13361,216 +13337,204 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_HAN
 {
        USE_OPLINE
        zend_free_op free_op1;
-       zval *op1, *op2, *result;
+       zval *op1, *op2;
+       int result;
 
        op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
        op2 = RT_CONSTANT(opline, opline->op2);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
-                               result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
-                               zval_ptr_dtor_nogc(free_op1);
+       if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
+               } else {
+                       goto is_equal_slow;
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto is_equal_slow;
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+                       result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+                       zval_ptr_dtor_nogc(free_op1);
 
-                       } else {
-                               break;
-                       }
                } else {
-                       break;
+                       goto is_equal_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
+       } else {
+is_equal_slow:
+               SAVE_OPLINE();
+               if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
+               zval_ptr_dtor_nogc(free_op1);
 
-       SAVE_OPLINE();
-       if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) == 0;
        }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
-       zval_ptr_dtor_nogc(free_op1);
-
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
        zend_free_op free_op1;
-       zval *op1, *op2, *result;
+       zval *op1, *op2;
+       int result;
 
        op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
        op2 = RT_CONSTANT(opline, opline->op2);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) != Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
-                               result = !zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
-                               zval_ptr_dtor_nogc(free_op1);
+       if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) != Z_DVAL_P(op2));
+               } else {
+                       goto is_not_equal_slow;
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto is_not_equal_slow;
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+                       result = !zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+                       zval_ptr_dtor_nogc(free_op1);
 
-                       } else {
-                               break;
-                       }
                } else {
-                       break;
+                       goto is_not_equal_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
+       } else {
+is_not_equal_slow:
+               SAVE_OPLINE();
+               if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
+               zval_ptr_dtor_nogc(free_op1);
 
-       SAVE_OPLINE();
-       if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) != 0;
        }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) != 0);
-       zval_ptr_dtor_nogc(free_op1);
-
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
        zend_free_op free_op1;
-       zval *op1, *op2, *result;
+       zval *op1, *op2, *ret;
+       int result;
 
        op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
        op2 = RT_CONSTANT(opline, opline->op2);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
+       if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
                } else {
-                       break;
+                       goto is_smaller_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
+       } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto is_smaller_slow;
+               }
+       } else {
+is_smaller_slow:
+               SAVE_OPLINE();
+               if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
+               zval_ptr_dtor_nogc(free_op1);
 
-       SAVE_OPLINE();
-       if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) < 0;
        }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) < 0);
-       zval_ptr_dtor_nogc(free_op1);
-
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
        zend_free_op free_op1;
-       zval *op1, *op2, *result;
+       zval *op1, *op2;
+       int result;
 
        op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
        op2 = RT_CONSTANT(opline, opline->op2);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
+       if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
                } else {
-                       break;
+                       goto is_smaller_or_equal_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
+       } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto is_smaller_or_equal_slow;
+               }
+       } else {
+is_smaller_or_equal_slow:
+               SAVE_OPLINE();
+               if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
+               zval_ptr_dtor_nogc(free_op1);
 
-       SAVE_OPLINE();
-       if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) <= 0;
        }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) <= 0);
-       zval_ptr_dtor_nogc(free_op1);
-
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -14238,56 +14202,53 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_TMPVAR_CONST_HANDLER
 {
        USE_OPLINE
        zend_free_op free_op1;
-       zval *op1, *op2, *result;
+       zval *op1, *op2;
+       int result;
 
        op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
        op2 = RT_CONSTANT(opline, opline->op2);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
-                               result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+       if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
+               } else {
+                       goto case_slow;
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto case_slow;
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+                       result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
 
-                       } else {
-                               break;
-                       }
                } else {
-                       break;
+                       goto case_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
+       } else {
+case_slow:
+               SAVE_OPLINE();
+               if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
 
-       SAVE_OPLINE();
-       if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) == 0;
        }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
-
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -14976,216 +14937,204 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_HA
 {
        USE_OPLINE
        zend_free_op free_op1, free_op2;
-       zval *op1, *op2, *result;
+       zval *op1, *op2;
+       int result;
 
        op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
        op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
-                               result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
-                               zval_ptr_dtor_nogc(free_op1);
-                               zval_ptr_dtor_nogc(free_op2);
-                       } else {
-                               break;
-                       }
+       if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
                } else {
-                       break;
+                       goto is_equal_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
-
-       SAVE_OPLINE();
-       if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto is_equal_slow;
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+                       result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+                       zval_ptr_dtor_nogc(free_op1);
+                       zval_ptr_dtor_nogc(free_op2);
+               } else {
+                       goto is_equal_slow;
+               }
+       } else {
+is_equal_slow:
+               SAVE_OPLINE();
+               if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
+               zval_ptr_dtor_nogc(free_op1);
+               zval_ptr_dtor_nogc(free_op2);
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) == 0;
        }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
-       zval_ptr_dtor_nogc(free_op1);
-       zval_ptr_dtor_nogc(free_op2);
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
        zend_free_op free_op1, free_op2;
-       zval *op1, *op2, *result;
+       zval *op1, *op2;
+       int result;
 
        op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
        op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) != Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
-                               result = !zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
-                               zval_ptr_dtor_nogc(free_op1);
-                               zval_ptr_dtor_nogc(free_op2);
-                       } else {
-                               break;
-                       }
+       if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) != Z_DVAL_P(op2));
                } else {
-                       break;
+                       goto is_not_equal_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
-
-       SAVE_OPLINE();
-       if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto is_not_equal_slow;
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+                       result = !zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+                       zval_ptr_dtor_nogc(free_op1);
+                       zval_ptr_dtor_nogc(free_op2);
+               } else {
+                       goto is_not_equal_slow;
+               }
+       } else {
+is_not_equal_slow:
+               SAVE_OPLINE();
+               if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
+               zval_ptr_dtor_nogc(free_op1);
+               zval_ptr_dtor_nogc(free_op2);
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) != 0;
        }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) != 0);
-       zval_ptr_dtor_nogc(free_op1);
-       zval_ptr_dtor_nogc(free_op2);
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
        zend_free_op free_op1, free_op2;
-       zval *op1, *op2, *result;
+       zval *op1, *op2, *ret;
+       int result;
 
        op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
        op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
+       if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
                } else {
-                       break;
+                       goto is_smaller_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
-
-       SAVE_OPLINE();
-       if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
+       } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto is_smaller_slow;
+               }
+       } else {
+is_smaller_slow:
+               SAVE_OPLINE();
+               if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
+               zval_ptr_dtor_nogc(free_op1);
+               zval_ptr_dtor_nogc(free_op2);
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) < 0;
        }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) < 0);
-       zval_ptr_dtor_nogc(free_op1);
-       zval_ptr_dtor_nogc(free_op2);
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
        zend_free_op free_op1, free_op2;
-       zval *op1, *op2, *result;
+       zval *op1, *op2;
+       int result;
 
        op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
        op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
+       if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
                } else {
-                       break;
+                       goto is_smaller_or_equal_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
-
-       SAVE_OPLINE();
-       if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
+       } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto is_smaller_or_equal_slow;
+               }
+       } else {
+is_smaller_or_equal_slow:
+               SAVE_OPLINE();
+               if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
+               zval_ptr_dtor_nogc(free_op1);
+               zval_ptr_dtor_nogc(free_op2);
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) <= 0;
        }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) <= 0);
-       zval_ptr_dtor_nogc(free_op1);
-       zval_ptr_dtor_nogc(free_op2);
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -15799,56 +15748,53 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_TMPVAR_TMPVAR_HANDLE
 {
        USE_OPLINE
        zend_free_op free_op1, free_op2;
-       zval *op1, *op2, *result;
+       zval *op1, *op2;
+       int result;
 
        op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
        op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
-                               result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
-                               zval_ptr_dtor_nogc(free_op2);
-                       } else {
-                               break;
-                       }
+       if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
                } else {
-                       break;
+                       goto case_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
-
-       SAVE_OPLINE();
-       if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto case_slow;
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+                       result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+                       zval_ptr_dtor_nogc(free_op2);
+               } else {
+                       goto case_slow;
+               }
+       } else {
+case_slow:
+               SAVE_OPLINE();
+               if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
+               zval_ptr_dtor_nogc(free_op2);
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) == 0;
        }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
-       zval_ptr_dtor_nogc(free_op2);
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -16809,100 +16755,94 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMPVAR_CV_HAND
 {
        USE_OPLINE
        zend_free_op free_op1;
-       zval *op1, *op2, *result;
+       zval *op1, *op2, *ret;
+       int result;
 
        op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
        op2 = EX_VAR(opline->op2.var);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
+       if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
                } else {
-                       break;
+                       goto is_smaller_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
+       } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto is_smaller_slow;
+               }
+       } else {
+is_smaller_slow:
+               SAVE_OPLINE();
+               if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
+               zval_ptr_dtor_nogc(free_op1);
 
-       SAVE_OPLINE();
-       if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) < 0;
        }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) < 0);
-       zval_ptr_dtor_nogc(free_op1);
-
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
        zend_free_op free_op1;
-       zval *op1, *op2, *result;
+       zval *op1, *op2;
+       int result;
 
        op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
        op2 = EX_VAR(opline->op2.var);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
+       if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
                } else {
-                       break;
+                       goto is_smaller_or_equal_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
+       } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto is_smaller_or_equal_slow;
+               }
+       } else {
+is_smaller_or_equal_slow:
+               SAVE_OPLINE();
+               if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
+               zval_ptr_dtor_nogc(free_op1);
 
-       SAVE_OPLINE();
-       if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) <= 0;
        }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) <= 0);
-       zval_ptr_dtor_nogc(free_op1);
-
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -17420,56 +17360,53 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_TMPVAR_CV_HANDLER(ZE
 {
        USE_OPLINE
        zend_free_op free_op1;
-       zval *op1, *op2, *result;
+       zval *op1, *op2;
+       int result;
 
        op1 = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
        op2 = EX_VAR(opline->op2.var);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
-                               result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+       if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
+               } else {
+                       goto case_slow;
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto case_slow;
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+                       result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
 
-                       } else {
-                               break;
-                       }
                } else {
-                       break;
+                       goto case_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
+       } else {
+case_slow:
+               SAVE_OPLINE();
+               if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
 
-       SAVE_OPLINE();
-       if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) == 0;
        }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
-
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -40603,216 +40540,204 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_CONST_HANDLER
 {
        USE_OPLINE
 
-       zval *op1, *op2, *result;
+       zval *op1, *op2;
+       int result;
 
        op1 = EX_VAR(opline->op1.var);
        op2 = RT_CONSTANT(opline, opline->op2);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
-                               result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+       if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
+               } else {
+                       goto is_equal_slow;
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto is_equal_slow;
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+                       result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
 
 
-                       } else {
-                               break;
-                       }
                } else {
-                       break;
+                       goto is_equal_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
-
-       SAVE_OPLINE();
-       if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
-       }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
+       } else {
+is_equal_slow:
+               SAVE_OPLINE();
+               if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
 
 
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) == 0;
+       }
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
 
-       zval *op1, *op2, *result;
+       zval *op1, *op2;
+       int result;
 
        op1 = EX_VAR(opline->op1.var);
        op2 = RT_CONSTANT(opline, opline->op2);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) != Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
-                               result = !zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+       if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) != Z_DVAL_P(op2));
+               } else {
+                       goto is_not_equal_slow;
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto is_not_equal_slow;
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+                       result = !zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
 
 
-                       } else {
-                               break;
-                       }
                } else {
-                       break;
+                       goto is_not_equal_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
-
-       SAVE_OPLINE();
-       if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
-       }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) != 0);
+       } else {
+is_not_equal_slow:
+               SAVE_OPLINE();
+               if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
 
 
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) != 0;
+       }
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
 
-       zval *op1, *op2, *result;
+       zval *op1, *op2, *ret;
+       int result;
 
        op1 = EX_VAR(opline->op1.var);
        op2 = RT_CONSTANT(opline, opline->op2);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
+       if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
                } else {
-                       break;
+                       goto is_smaller_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
-
-       SAVE_OPLINE();
-       if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
-       }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) < 0);
+       } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto is_smaller_slow;
+               }
+       } else {
+is_smaller_slow:
+               SAVE_OPLINE();
+               if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
 
 
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) < 0;
+       }
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
 
-       zval *op1, *op2, *result;
+       zval *op1, *op2;
+       int result;
 
        op1 = EX_VAR(opline->op1.var);
        op2 = RT_CONSTANT(opline, opline->op2);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
+       if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
                } else {
-                       break;
+                       goto is_smaller_or_equal_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
-
-       SAVE_OPLINE();
-       if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
-       }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) <= 0);
+       } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto is_smaller_or_equal_slow;
+               }
+       } else {
+is_smaller_or_equal_slow:
+               SAVE_OPLINE();
+               if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
 
 
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) <= 0;
+       }
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -44758,216 +44683,204 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_TMPVAR_HANDLE
 {
        USE_OPLINE
        zend_free_op free_op2;
-       zval *op1, *op2, *result;
+       zval *op1, *op2;
+       int result;
 
        op1 = EX_VAR(opline->op1.var);
        op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
-                               result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+       if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
+               } else {
+                       goto is_equal_slow;
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto is_equal_slow;
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+                       result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
 
-                               zval_ptr_dtor_nogc(free_op2);
-                       } else {
-                               break;
-                       }
+                       zval_ptr_dtor_nogc(free_op2);
                } else {
-                       break;
+                       goto is_equal_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
+       } else {
+is_equal_slow:
+               SAVE_OPLINE();
+               if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
 
-       SAVE_OPLINE();
-       if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
+               zval_ptr_dtor_nogc(free_op2);
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) == 0;
        }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
-
-       zval_ptr_dtor_nogc(free_op2);
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
        zend_free_op free_op2;
-       zval *op1, *op2, *result;
+       zval *op1, *op2;
+       int result;
 
        op1 = EX_VAR(opline->op1.var);
        op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) != Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
-                               result = !zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+       if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) != Z_DVAL_P(op2));
+               } else {
+                       goto is_not_equal_slow;
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto is_not_equal_slow;
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+                       result = !zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
 
-                               zval_ptr_dtor_nogc(free_op2);
-                       } else {
-                               break;
-                       }
+                       zval_ptr_dtor_nogc(free_op2);
                } else {
-                       break;
+                       goto is_not_equal_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
+       } else {
+is_not_equal_slow:
+               SAVE_OPLINE();
+               if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
 
-       SAVE_OPLINE();
-       if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
+               zval_ptr_dtor_nogc(free_op2);
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) != 0;
        }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) != 0);
-
-       zval_ptr_dtor_nogc(free_op2);
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
        zend_free_op free_op2;
-       zval *op1, *op2, *result;
+       zval *op1, *op2, *ret;
+       int result;
 
        op1 = EX_VAR(opline->op1.var);
        op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
+       if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
                } else {
-                       break;
+                       goto is_smaller_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
+       } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto is_smaller_slow;
+               }
+       } else {
+is_smaller_slow:
+               SAVE_OPLINE();
+               if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
 
-       SAVE_OPLINE();
-       if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
+               zval_ptr_dtor_nogc(free_op2);
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) < 0;
        }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) < 0);
-
-       zval_ptr_dtor_nogc(free_op2);
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
        zend_free_op free_op2;
-       zval *op1, *op2, *result;
+       zval *op1, *op2;
+       int result;
 
        op1 = EX_VAR(opline->op1.var);
        op2 = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
+       if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
                } else {
-                       break;
+                       goto is_smaller_or_equal_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
+       } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto is_smaller_or_equal_slow;
+               }
+       } else {
+is_smaller_or_equal_slow:
+               SAVE_OPLINE();
+               if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
 
-       SAVE_OPLINE();
-       if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
+               zval_ptr_dtor_nogc(free_op2);
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) <= 0;
        }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) <= 0);
-
-       zval_ptr_dtor_nogc(free_op2);
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -50760,216 +50673,204 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_CV_HANDLER(ZE
 {
        USE_OPLINE
 
-       zval *op1, *op2, *result;
+       zval *op1, *op2;
+       int result;
 
        op1 = EX_VAR(opline->op1.var);
        op2 = EX_VAR(opline->op2.var);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
-                               result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+       if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) == Z_DVAL_P(op2));
+               } else {
+                       goto is_equal_slow;
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto is_equal_slow;
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+                       result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
 
 
-                       } else {
-                               break;
-                       }
                } else {
-                       break;
+                       goto is_equal_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
-
-       SAVE_OPLINE();
-       if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
-       }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) == 0);
+       } else {
+is_equal_slow:
+               SAVE_OPLINE();
+               if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
 
 
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) == 0;
+       }
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
 
-       zval *op1, *op2, *result;
+       zval *op1, *op2;
+       int result;
 
        op1 = EX_VAR(opline->op1.var);
        op2 = EX_VAR(opline->op2.var);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) != Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
-                       if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
-                               result = !zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
+       if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) != Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) != Z_DVAL_P(op2));
+               } else {
+                       goto is_not_equal_slow;
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) != Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto is_not_equal_slow;
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) {
+                       result = !zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2));
 
 
-                       } else {
-                               break;
-                       }
                } else {
-                       break;
+                       goto is_not_equal_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
-
-       SAVE_OPLINE();
-       if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
-       }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) != 0);
+       } else {
+is_not_equal_slow:
+               SAVE_OPLINE();
+               if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
 
 
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) != 0;
+       }
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
 
-       zval *op1, *op2, *result;
+       zval *op1, *op2, *ret;
+       int result;
 
        op1 = EX_VAR(opline->op1.var);
        op2 = EX_VAR(opline->op2.var);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
+       if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) < Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) < Z_DVAL_P(op2));
                } else {
-                       break;
+                       goto is_smaller_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
-
-       SAVE_OPLINE();
-       if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
-       }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) < 0);
+       } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) < Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto is_smaller_slow;
+               }
+       } else {
+is_smaller_slow:
+               SAVE_OPLINE();
+               if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
 
 
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) < 0;
+       }
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
 
-       zval *op1, *op2, *result;
+       zval *op1, *op2;
+       int result;
 
        op1 = EX_VAR(opline->op1.var);
        op2 = EX_VAR(opline->op2.var);
-       do {
-               int result;
-
-               if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = ((double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
-                       } else {
-                               break;
-                       }
-               } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
-                       if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
-                               result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
-                       } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
-                               result = (Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
-                       } else {
-                               break;
-                       }
+       if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_LVAL_P(op1) <= Z_LVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = ((double)Z_LVAL_P(op1) <= Z_DVAL_P(op2));
                } else {
-                       break;
+                       goto is_smaller_or_equal_slow;
                }
-               ZEND_VM_SMART_BRANCH(result, 0);
-               ZVAL_BOOL(EX_VAR(opline->result.var), result);
-               ZEND_VM_NEXT_OPCODE();
-       } while (0);
-
-       SAVE_OPLINE();
-       if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
-               op1 = ZVAL_UNDEFINED_OP1();
-       }
-       if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
-               op2 = ZVAL_UNDEFINED_OP2();
-       }
-       result = EX_VAR(opline->result.var);
-       compare_function(result, op1, op2);
-       ZVAL_BOOL(result, Z_LVAL_P(result) <= 0);
+       } else if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_DOUBLE)) {
+                       result = (Z_DVAL_P(op1) <= Z_DVAL_P(op2));
+               } else if (EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)) {
+                       result = (Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2)));
+               } else {
+                       goto is_smaller_or_equal_slow;
+               }
+       } else {
+is_smaller_or_equal_slow:
+               SAVE_OPLINE();
+               if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op1) == IS_UNDEF)) {
+                       op1 = ZVAL_UNDEFINED_OP1();
+               }
+               if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(op2) == IS_UNDEF)) {
+                       op2 = ZVAL_UNDEFINED_OP2();
+               }
+               compare_function(EX_VAR(opline->result.var), op1, op2);
 
 
-       ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+               if (UNEXPECTED(EG(exception))) {
+                       HANDLE_EXCEPTION();
+               }
+               result = Z_LVAL_P(EX_VAR(opline->result.var)) <= 0;
+       }
+       ZEND_VM_SMART_BRANCH(result, 0);
+       ZVAL_BOOL(EX_VAR(opline->result.var), result);
+       ZEND_VM_NEXT_OPCODE();
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SPACESHIP_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)