فهرست منبع

add `PREDICT_INT_DIV_OP`

blueloveTH 1 سال پیش
والد
کامیت
44c61a8c3a
1فایلهای تغییر یافته به همراه9 افزوده شده و 0 حذف شده
  1. 9 0
      src/ceval.cpp

+ 9 - 0
src/ceval.cpp

@@ -8,6 +8,13 @@ namespace pkpy{
         DISPATCH() \
     }
 
+#define PREDICT_INT_DIV_OP(op)  \
+    if(is_small_int(_0) && is_small_int(_1)){   \
+        if(_1 == VAR(0)) ZeroDivisionError();   \
+        TOP() = VAR((i64)(PK_BITS(_0)>>2) op (i64)(PK_BITS(_1)>>2)); \
+        DISPATCH() \
+    }
+
 
 #define BINARY_F_COMPARE(func, op, rfunc)                           \
         PyObject* ret;                                              \
@@ -419,6 +426,7 @@ __NEXT_STEP:;
     TARGET(BINARY_FLOORDIV){
         PyObject* _1 = POPX();
         PyObject* _0 = TOP();
+        PREDICT_INT_DIV_OP(/)
         const PyTypeInfo* _ti;
         BINARY_OP_SPECIAL(__floordiv__);
         if(TOP() == NotImplemented) BinaryOptError("//", _0, _1);
@@ -426,6 +434,7 @@ __NEXT_STEP:;
     TARGET(BINARY_MOD){
         PyObject* _1 = POPX();
         PyObject* _0 = TOP();
+        PREDICT_INT_DIV_OP(%)
         const PyTypeInfo* _ti;
         BINARY_OP_SPECIAL(__mod__);
         if(TOP() == NotImplemented) BinaryOptError("%", _0, _1);