Hi,

The attached patch improves speed of numeric operations by inlining the most probable paths directy into executor. It also optimizes some operations for x86 CPU using assembler.

The bench.php gets more than 10% speedup (2.5 sec instead of 2.9 sec)
Real-life applications are not affected. All the PHPT tests are passed.

I'm going to commit the patch on next week if no objections.
Any related ideas are welcome.

Thanks. Dmitry.
Index: Zend/zend_multiply.h
===================================================================
--- Zend/zend_multiply.h        (revision 311277)
+++ Zend/zend_multiply.h        (working copy)
@@ -31,6 +31,18 @@
        else (lval) = __tmpvar;                                                 
                                \
 } while (0)
 
+#elif defined(__x86_64__) && defined(__GNUC__)
+
+#define ZEND_SIGNED_MULTIPLY_LONG(a, b, lval, dval, usedval) do {      \
+       long __tmpvar;                                                          
                                        \
+       __asm__ ("imulq %3,%0\n"                                                
                                \
+               "adcq $0,%1"                                                    
                                        \
+                       : "=r"(__tmpvar),"=r"(usedval)                          
                        \
+                       : "0"(a), "r"(b), "1"(0));                              
                                \
+       if (usedval) (dval) = (double) (a) * (double) (b);                      
        \
+       else (lval) = __tmpvar;                                                 
                                \
+} while (0)
+
 #elif SIZEOF_LONG == 4 && defined(HAVE_ZEND_LONG64)
 
 #define ZEND_SIGNED_MULTIPLY_LONG(a, b, lval, dval, usedval) do {      \
Index: Zend/zend_operators.c
===================================================================
--- Zend/zend_operators.c       (revision 311277)
+++ Zend/zend_operators.c       (working copy)
@@ -27,13 +27,10 @@
 #include "zend_globals.h"
 #include "zend_list.h"
 #include "zend_API.h"
-#include "zend_multiply.h"
 #include "zend_strtod.h"
 #include "zend_exceptions.h"
 #include "zend_closures.h"
 
-#define LONG_SIGN_MASK (1L << (8*sizeof(long)-1))
-
 #if ZEND_USE_TOLOWER_L
 #include <locale.h>
 static _locale_t current_locale = NULL;
Index: Zend/zend_operators.h
===================================================================
--- Zend/zend_operators.h       (revision 311277)
+++ Zend/zend_operators.h       (working copy)
@@ -31,11 +31,14 @@
 #endif
 
 #include "zend_strtod.h"
+#include "zend_multiply.h"
 
 #if 0&&HAVE_BCMATH
 #include "ext/bcmath/libbcmath/src/bcmath.h"
 #endif
 
+#define LONG_SIGN_MASK (1L << (8*sizeof(long)-1))
+
 BEGIN_EXTERN_C()
 ZEND_API int add_function(zval *result, zval *op1, zval *op2 TSRMLS_DC);
 ZEND_API int sub_function(zval *result, zval *op1, zval *op2 TSRMLS_DC);
@@ -448,8 +451,418 @@
 #define zend_update_current_locale()
 #endif
 
+static zend_always_inline int fast_increment_function(zval *op1)
+{
+       if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+#if defined(__GNUC__) && defined(__i386__)
+               __asm__(
+                       "incl (%0)\n\t"
+                       "jno  0f\n\t"
+                       "movl $0x0, (%0)\n\t"
+                       "movl $0x41e00000, 0x4(%0)\n\t"
+                       "movb $0x2,0xc(%0)\n"
+                       "0:"
+                       :
+                       : "r"(op1));
+#elif defined(__GNUC__) && defined(__x86_64__)
+               __asm__(
+                       "incq (%0)\n\t"
+                       "jno  0f\n\t"
+                       "movl $0x0, (%0)\n\t"
+                       "movl $0x43e00000, 0x4(%0)\n\t"
+                       "movb $0x2,0x14(%0)\n"
+                       "0:"
+                       :
+                       : "r"(op1));
+#else
+               if (UNEXPECTED(Z_LVAL_P(op1) == LONG_MAX)) {
+                       /* switch to double */
+                       Z_DVAL_P(op1) = (double)LONG_MAX + 1.0;
+                       Z_TYPE_P(op1) = IS_DOUBLE;
+               } else {
+                       Z_LVAL_P(op1)++;
+               }
 #endif
+               return SUCCESS;
+       }
+       return increment_function(op1);
+}
 
+static zend_always_inline int fast_decrement_function(zval *op1)
+{
+       if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+#if defined(__GNUC__) && defined(__i386__)
+               __asm__(
+                       "decl (%0)\n\t"
+                       "jno  0f\n\t"
+                       "movl $0x00200000, (%0)\n\t"
+                       "movl $0xc1e00000, 0x4(%0)\n\t"
+                       "movb $0x2,0xc(%0)\n"
+                       "0:"
+                       :
+                       : "r"(op1));
+#elif defined(__GNUC__) && defined(__x86_64__)
+               __asm__(
+                       "decq (%0)\n\t"
+                       "jno  0f\n\t"
+                       "movl $0x00000000, (%0)\n\t"
+                       "movl $0xc3e00000, 0x4(%0)\n\t"
+                       "movb $0x2,0x14(%0)\n"
+                       "0:"
+                       :
+                       : "r"(op1));
+#else
+               if (UNEXPECTED(Z_LVAL_P(op1) == LONG_MIN)) {
+                       /* switch to double */
+                       Z_DVAL_P(op1) = (double)LONG_MIN - 1.0;
+                       Z_TYPE_P(op1) = IS_DOUBLE;
+               } else {
+                       Z_LVAL_P(op1)--;
+               }
+#endif
+               return SUCCESS;
+       }
+       return decrement_function(op1);
+}
+
+static zend_always_inline int fast_add_function(zval *result, zval *op1, zval 
*op2 TSRMLS_DC)
+{
+       if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+#if defined(__GNUC__) && defined(__i386__)
+               __asm__(
+                       "movl   (%1), %%eax\n\t"
+                       "addl   (%2), %%eax\n\t"
+                       "jo     0f\n\t"     
+                       "movl   %%eax, (%0)\n\t"
+                       "movb   $0x1,0xc(%0)\n"
+                       "jmp    1f\n"
+                       "0:\n\t"
+                       "fildl  (%1)\n\t"
+                       "fildl  (%2)\n\t"
+                       "faddp  %%st, %%st(1)\n\t"
+                       "movb   $0x2,0xc(%0)\n\t"
+                       "fstpl  (%0)\n"
+                       "1:"
+                       : 
+                       : "r"(result),
+                         "r"(op1),
+                         "r"(op2)
+                       : "eax");
+#elif defined(__GNUC__) && defined(__x86_64__)
+               __asm__(
+                       "movq   (%1), %%rax\n\t"
+                       "addq   (%2), %%rax\n\t"
+                       "jo     0f\n\t"     
+                       "movq   %%rax, (%0)\n\t"
+                       "movb   $0x1,0x14(%0)\n"
+                       "jmp    1f\n"
+                       "0:\n\t"
+                       "fildq  (%1)\n\t"
+                       "fildq  (%2)\n\t"
+                       "faddp  %%st, %%st(1)\n\t"
+                       "movb   $0x2,0x14(%0)\n\t"
+                       "fstpl  (%0)\n"
+                       "1:"
+                       : 
+                       : "r"(result),
+                         "r"(op1),
+                         "r"(op2)
+                       : "rax");
+#else
+                       Z_LVAL_P(result) = Z_LVAL_P(op1) + Z_LVAL_P(op2);
+
+                       if (UNEXPECTED((Z_LVAL_P(op1) & LONG_SIGN_MASK) == 
(Z_LVAL_P(op2) & LONG_SIGN_MASK)
+                               && (Z_LVAL_P(op1) & LONG_SIGN_MASK) != 
(Z_LVAL_P(result) & LONG_SIGN_MASK))) {
+                               Z_DVAL_P(result) = (double) Z_LVAL_P(op1) + 
(double) Z_LVAL_P(op2);
+                               Z_TYPE_P(result) = IS_DOUBLE;
+                       } else {
+                               Z_TYPE_P(result) = IS_LONG;
+                       }
+#endif
+                       return SUCCESS;
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       Z_DVAL_P(result) = ((double)Z_LVAL_P(op1)) + 
Z_DVAL_P(op2);
+                       Z_TYPE_P(result) = IS_DOUBLE;
+                       return SUCCESS;
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       Z_DVAL_P(result) = Z_DVAL_P(op1) + Z_DVAL_P(op2);
+                       Z_TYPE_P(result) = IS_DOUBLE;
+                       return SUCCESS;
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       Z_DVAL_P(result) = Z_DVAL_P(op1) + 
((double)Z_LVAL_P(op2));
+                       Z_TYPE_P(result) = IS_DOUBLE;
+                       return SUCCESS;
+               }
+       }
+       return add_function(result, op1, op2 TSRMLS_CC);
+}
+
+static zend_always_inline int fast_sub_function(zval *result, zval *op1, zval 
*op2 TSRMLS_DC)
+{
+       if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+#if defined(__GNUC__) && defined(__i386__)
+               __asm__(
+                       "movl   (%1), %%eax\n\t"
+                       "subl   (%2), %%eax\n\t"
+                       "jo     0f\n\t"     
+                       "movl   %%eax, (%0)\n\t"
+                       "movb   $0x1,0xc(%0)\n"
+                       "jmp    1f\n"
+                       "0:\n\t"
+                       "fildl  (%2)\n\t"
+                       "fildl  (%1)\n\t"
+                       "fsubp  %%st, %%st(1)\n\t"
+                       "movb   $0x2,0xc(%0)\n\t"
+                       "fstpl  (%0)\n"
+                       "1:"
+                       : 
+                       : "r"(result),
+                         "r"(op1),
+                         "r"(op2)
+                       : "eax");
+#elif defined(__GNUC__) && defined(__x86_64__)
+               __asm__(
+                       "movq   (%1), %%rax\n\t"
+                       "subq   (%2), %%rax\n\t"
+                       "jo     0f\n\t"     
+                       "movq   %%rax, (%0)\n\t"
+                       "movb   $0x1,0x14(%0)\n"
+                       "jmp    1f\n"
+                       "0:\n\t"
+                       "fildq  (%2)\n\t"
+                       "fildq  (%1)\n\t"
+                       "fsubp  %%st, %%st(1)\n\t"
+                       "movb   $0x2,0x14(%0)\n\t"
+                       "fstpl  (%0)\n"
+                       "1:"
+                       : 
+                       : "r"(result),
+                         "r"(op1),
+                         "r"(op2)
+                       : "rax");
+#else
+                       Z_LVAL_P(result) = Z_LVAL_P(op1) - Z_LVAL_P(op2);
+
+                       if (UNEXPECTED((Z_LVAL_P(op1) & LONG_SIGN_MASK) != 
(Z_LVAL_P(op2) & LONG_SIGN_MASK)
+                               && (Z_LVAL_P(op1) & LONG_SIGN_MASK) != 
(Z_LVAL_P(result) & LONG_SIGN_MASK))) {
+                               Z_DVAL_P(result) = (double) Z_LVAL_P(op1) + 
(double) Z_LVAL_P(op2);
+                               Z_TYPE_P(result) = IS_DOUBLE;
+                       } else {
+                               Z_TYPE_P(result) = IS_LONG;
+                       }
+#endif
+                       return SUCCESS;
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       Z_DVAL_P(result) = ((double)Z_LVAL_P(op1)) - 
Z_DVAL_P(op2);
+                       Z_TYPE_P(result) = IS_DOUBLE;
+                       return SUCCESS;
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       Z_DVAL_P(result) = Z_DVAL_P(op1) - Z_DVAL_P(op2);
+                       Z_TYPE_P(result) = IS_DOUBLE;
+                       return SUCCESS;
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       Z_DVAL_P(result) = Z_DVAL_P(op1) - 
((double)Z_LVAL_P(op2));
+                       Z_TYPE_P(result) = IS_DOUBLE;
+                       return SUCCESS;
+               }
+       }
+       return sub_function(result, op1, op2 TSRMLS_CC);
+}
+
+static zend_always_inline int fast_mul_function(zval *result, zval *op1, zval 
*op2 TSRMLS_DC)
+{
+       if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       long overflow;
+
+                       ZEND_SIGNED_MULTIPLY_LONG(Z_LVAL_P(op1), Z_LVAL_P(op2), 
Z_LVAL_P(result), Z_DVAL_P(result), overflow);
+                       Z_TYPE_P(result) = overflow ? IS_DOUBLE : IS_LONG;
+                       return SUCCESS;
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       Z_DVAL_P(result) = ((double)Z_LVAL_P(op1)) * 
Z_DVAL_P(op2);
+                       Z_TYPE_P(result) = IS_DOUBLE;
+                       return SUCCESS;
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       Z_DVAL_P(result) = Z_DVAL_P(op1) * Z_DVAL_P(op2);
+                       Z_TYPE_P(result) = IS_DOUBLE;
+                       return SUCCESS;
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       Z_DVAL_P(result) = Z_DVAL_P(op1) * 
((double)Z_LVAL_P(op2));
+                       Z_TYPE_P(result) = IS_DOUBLE;
+                       return SUCCESS;
+               }
+       }
+       return mul_function(result, op1, op2 TSRMLS_CC);
+}
+
+static zend_always_inline int fast_div_function(zval *result, zval *op1, zval 
*op2 TSRMLS_DC)
+{
+       if (EXPECTED(Z_TYPE_P(op1) == IS_LONG) && 0) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
+                               zend_error(E_WARNING, "Division by zero");
+                               Z_LVAL_P(result) = 0;
+                               Z_TYPE_P(result) = IS_BOOL;
+                               return FAILURE;
+                       } else if (UNEXPECTED(Z_LVAL_P(op2) == -1 && 
Z_LVAL_P(op1) == LONG_MIN)) {
+                               /* Prevent overflow error/crash */
+                               Z_DVAL_P(result) = (double) LONG_MIN / -1;
+                               Z_TYPE_P(result) = IS_DOUBLE;
+                       } else if (EXPECTED(Z_LVAL_P(op1) % Z_LVAL_P(op2) == 
0)) {
+                               /* integer */
+                               Z_LVAL_P(result) = Z_LVAL_P(op1) / 
Z_LVAL_P(op2);
+                               Z_TYPE_P(result) = IS_LONG;
+                       } else {
+                               Z_DVAL_P(result) = ((double) Z_LVAL_P(op1)) / 
((double)Z_LVAL_P(op2));
+                               Z_TYPE_P(result) = IS_DOUBLE;
+                       }
+                       return SUCCESS;
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       if (UNEXPECTED(Z_DVAL_P(op2) == 0)) {
+                               zend_error(E_WARNING, "Division by zero");
+                               Z_LVAL_P(result) = 0;
+                               Z_TYPE_P(result) = IS_BOOL;
+                               return FAILURE;
+                       }
+                       Z_DVAL_P(result) = ((double)Z_LVAL_P(op1)) / 
Z_DVAL_P(op2);
+                       Z_TYPE_P(result) = IS_DOUBLE;
+                       return SUCCESS;
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE) && 0) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       if (UNEXPECTED(Z_DVAL_P(op2) == 0)) {
+                               zend_error(E_WARNING, "Division by zero");
+                               Z_LVAL_P(result) = 0;
+                               Z_TYPE_P(result) = IS_BOOL;
+                               return FAILURE;
+                       }
+                       Z_DVAL_P(result) = Z_DVAL_P(op1) / Z_DVAL_P(op2);
+                       Z_TYPE_P(result) = IS_DOUBLE;
+                       return SUCCESS;
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
+                               zend_error(E_WARNING, "Division by zero");
+                               Z_LVAL_P(result) = 0;
+                               Z_TYPE_P(result) = IS_BOOL;
+                               return FAILURE;
+                       }
+                       Z_DVAL_P(result) = Z_DVAL_P(op1) / 
((double)Z_LVAL_P(op2));
+                       Z_TYPE_P(result) = IS_DOUBLE;
+                       return SUCCESS;
+               }
+       }
+       return div_function(result, op1, op2 TSRMLS_CC);
+}
+
+static zend_always_inline int fast_mod_function(zval *result, zval *op1, zval 
*op2 TSRMLS_DC)
+{
+       if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       if (UNEXPECTED(Z_LVAL_P(op2) == 0)) {
+                               zend_error(E_WARNING, "Division by zero");
+                               Z_LVAL_P(result) = 0;
+                               Z_TYPE_P(result) = IS_BOOL;
+                               return FAILURE;
+                       } else if (UNEXPECTED(Z_LVAL_P(op2) == -1)) {
+                               /* Prevent overflow error/crash if 
op1==LONG_MIN */
+                               Z_LVAL_P(result) = 0;
+                               Z_TYPE_P(result) = IS_LONG;
+                               return SUCCESS;
+                       }
+                       Z_LVAL_P(result) = Z_LVAL_P(op1) % Z_LVAL_P(op2);
+                       Z_TYPE_P(result) = IS_LONG;
+                       return SUCCESS;
+               }
+       }
+       return mod_function(result, op1, op2 TSRMLS_CC);
+}
+
+static zend_always_inline int fast_equal_function(zval *result, zval *op1, 
zval *op2 TSRMLS_DC)
+{
+       if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       return Z_LVAL_P(op1) == Z_LVAL_P(op2);
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       return ((double)Z_LVAL_P(op1)) == Z_DVAL_P(op2);
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       return Z_DVAL_P(op1) == Z_DVAL_P(op2);
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       return Z_DVAL_P(op1) == ((double)Z_LVAL_P(op2));
+               }
+       }
+       compare_function(result, op1, op2 TSRMLS_CC);
+       return Z_LVAL_P(result) == 0;
+}
+
+static zend_always_inline int fast_not_equal_function(zval *result, zval *op1, 
zval *op2 TSRMLS_DC)
+{
+       if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       return Z_LVAL_P(op1) != Z_LVAL_P(op2);
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       return ((double)Z_LVAL_P(op1)) != Z_DVAL_P(op2);
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       return Z_DVAL_P(op1) != Z_DVAL_P(op2);
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       return Z_DVAL_P(op1) != ((double)Z_LVAL_P(op2));
+               }
+       }
+       compare_function(result, op1, op2 TSRMLS_CC);
+       return Z_LVAL_P(result) != 0;
+}
+
+static zend_always_inline int fast_is_smaller_function(zval *result, zval 
*op1, zval *op2 TSRMLS_DC)
+{
+       if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       return Z_LVAL_P(op1) < Z_LVAL_P(op2);
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       return ((double)Z_LVAL_P(op1)) < Z_DVAL_P(op2);
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       return Z_DVAL_P(op1) < Z_DVAL_P(op2);
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       return Z_DVAL_P(op1) < ((double)Z_LVAL_P(op2));
+               }
+       }
+       compare_function(result, op1, op2 TSRMLS_CC);
+       return Z_LVAL_P(result) < 0;
+}
+
+static zend_always_inline int fast_is_smaller_or_equal_function(zval *result, 
zval *op1, zval *op2 TSRMLS_DC)
+{
+       if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       return Z_LVAL_P(op1) <= Z_LVAL_P(op2);
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       return ((double)Z_LVAL_P(op1)) <= Z_DVAL_P(op2);
+               }
+       } else if (EXPECTED(Z_TYPE_P(op1) == IS_DOUBLE)) {
+               if (EXPECTED(Z_TYPE_P(op2) == IS_DOUBLE)) {
+                       return Z_DVAL_P(op1) <= Z_DVAL_P(op2);
+               } else if (EXPECTED(Z_TYPE_P(op2) == IS_LONG)) {
+                       return Z_DVAL_P(op1) <= ((double)Z_LVAL_P(op2));
+               }
+       }
+       compare_function(result, op1, op2 TSRMLS_CC);
+       return Z_LVAL_P(result) <= 0;
+}
+
+#endif
+
 /*
  * Local variables:
  * tab-width: 4
Index: Zend/zend_vm_def.h
===================================================================
--- Zend/zend_vm_def.h  (revision 311277)
+++ Zend/zend_vm_def.h  (working copy)
@@ -31,7 +31,7 @@
        zend_free_op free_op1, free_op2;
 
        SAVE_OPLINE();
-       add_function(&EX_T(opline->result.var).tmp_var,
+       fast_add_function(&EX_T(opline->result.var).tmp_var,
                GET_OP1_ZVAL_PTR(BP_VAR_R),
                GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
        FREE_OP1();
@@ -46,7 +46,7 @@
        zend_free_op free_op1, free_op2;
 
        SAVE_OPLINE();
-       sub_function(&EX_T(opline->result.var).tmp_var,
+       fast_sub_function(&EX_T(opline->result.var).tmp_var,
                GET_OP1_ZVAL_PTR(BP_VAR_R),
                GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
        FREE_OP1();
@@ -61,7 +61,7 @@
        zend_free_op free_op1, free_op2;
 
        SAVE_OPLINE();
-       mul_function(&EX_T(opline->result.var).tmp_var,
+       fast_mul_function(&EX_T(opline->result.var).tmp_var,
                GET_OP1_ZVAL_PTR(BP_VAR_R),
                GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
        FREE_OP1();
@@ -76,7 +76,7 @@
        zend_free_op free_op1, free_op2;
 
        SAVE_OPLINE();
-       div_function(&EX_T(opline->result.var).tmp_var,
+       fast_div_function(&EX_T(opline->result.var).tmp_var,
                GET_OP1_ZVAL_PTR(BP_VAR_R),
                GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
        FREE_OP1();
@@ -91,7 +91,7 @@
        zend_free_op free_op1, free_op2;
 
        SAVE_OPLINE();
-       mod_function(&EX_T(opline->result.var).tmp_var,
+       fast_mod_function(&EX_T(opline->result.var).tmp_var,
                GET_OP1_ZVAL_PTR(BP_VAR_R),
                GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
        FREE_OP1();
@@ -184,10 +184,9 @@
        zval *result = &EX_T(opline->result.var).tmp_var;
 
        SAVE_OPLINE();
-       compare_function(result,
+       ZVAL_BOOL(result, fast_equal_function(result,
                GET_OP1_ZVAL_PTR(BP_VAR_R),
-               GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
-       ZVAL_BOOL(result, (Z_LVAL_P(result) == 0));
+               GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC));
        FREE_OP1();
        FREE_OP2();
        CHECK_EXCEPTION();
@@ -201,10 +200,9 @@
        zval *result = &EX_T(opline->result.var).tmp_var;
 
        SAVE_OPLINE();
-       compare_function(result,
+       ZVAL_BOOL(result, fast_not_equal_function(result,
                GET_OP1_ZVAL_PTR(BP_VAR_R),
-               GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
-       ZVAL_BOOL(result, (Z_LVAL_P(result) != 0));
+               GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC));
        FREE_OP1();
        FREE_OP2();
        CHECK_EXCEPTION();
@@ -218,10 +216,9 @@
        zval *result = &EX_T(opline->result.var).tmp_var;
 
        SAVE_OPLINE();
-       compare_function(result,
+       ZVAL_BOOL(result, fast_is_smaller_function(result,
                GET_OP1_ZVAL_PTR(BP_VAR_R),
-               GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
-       ZVAL_BOOL(result, (Z_LVAL_P(result) < 0));
+               GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC));
        FREE_OP1();
        FREE_OP2();
        CHECK_EXCEPTION();
@@ -235,10 +232,9 @@
        zval *result = &EX_T(opline->result.var).tmp_var;
 
        SAVE_OPLINE();
-       compare_function(result,
+       ZVAL_BOOL(result, fast_is_smaller_or_equal_function(result,
                GET_OP1_ZVAL_PTR(BP_VAR_R),
-               GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
-       ZVAL_BOOL(result, (Z_LVAL_P(result) <= 0));
+               GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC));
        FREE_OP1();
        FREE_OP2();
        CHECK_EXCEPTION();
@@ -824,11 +820,11 @@
                /* proxy object */
                zval *val = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
                Z_ADDREF_P(val);
-               increment_function(val);
+               fast_increment_function(val);
                Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, val TSRMLS_CC);
                zval_ptr_dtor(&val);
        } else {
-               increment_function(*var_ptr);
+               fast_increment_function(*var_ptr);
        }
 
        if (RETURN_VALUE_USED(opline)) {
@@ -871,11 +867,11 @@
                /* proxy object */
                zval *val = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
                Z_ADDREF_P(val);
-               decrement_function(val);
+               fast_decrement_function(val);
                Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, val TSRMLS_CC);
                zval_ptr_dtor(&val);
        } else {
-               decrement_function(*var_ptr);
+               fast_decrement_function(*var_ptr);
        }
 
        if (RETURN_VALUE_USED(opline)) {
@@ -919,11 +915,11 @@
                /* proxy object */
                zval *val = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
                Z_ADDREF_P(val);
-               increment_function(val);
+               fast_increment_function(val);
                Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, val TSRMLS_CC);
                zval_ptr_dtor(&val);
        } else {
-               increment_function(*var_ptr);
+               fast_increment_function(*var_ptr);
        }
 
        FREE_OP1_VAR_PTR();
@@ -962,11 +958,11 @@
                /* proxy object */
                zval *val = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
                Z_ADDREF_P(val);
-               decrement_function(val);
+               fast_decrement_function(val);
                Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, val TSRMLS_CC);
                zval_ptr_dtor(&val);
        } else {
-               decrement_function(*var_ptr);
+               fast_decrement_function(*var_ptr);
        }
 
        FREE_OP1_VAR_PTR();

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to