@@ -87,10 +87,11 @@ static PyObject *jump;
87
87
// Dummy variables for stack effects
88
88
static int when_to_jump_mask ;
89
89
// Dummy opcode names for 'op' opcodes
90
- #define _BINARY_OP_INPLACE_ADD_UNICODE_PART_1 1
91
- #define _BINARY_OP_INPLACE_ADD_UNICODE_PART_2 2
92
- #define _COMPARE_OP_FLOAT 3
93
- #define _JUMP_ON_SIGN 4
90
+ #define _BINARY_OP_INPLACE_ADD_UNICODE_PART_1 1001
91
+ #define _BINARY_OP_INPLACE_ADD_UNICODE_PART_2 1002
92
+ #define _COMPARE_OP_FLOAT 1003
93
+ #define _COMPARE_OP_INT 1004
94
+ #define _JUMP_ON_SIGN 1005
94
95
95
96
static PyObject *
96
97
dummy_func (
@@ -2063,7 +2064,7 @@ dummy_func(
2063
2064
family (compare_op ) = {
2064
2065
COMPARE_OP ,
2065
2066
_COMPARE_OP_FLOAT ,
2066
- // COMPARE_OP_INT_JUMP ,
2067
+ _COMPARE_OP_INT ,
2067
2068
// COMPARE_OP_STR_JUMP,
2068
2069
};
2069
2070
@@ -2111,14 +2112,10 @@ dummy_func(
2111
2112
// We're praying that the compiler optimizes the flags manipuations.
2112
2113
super (COMPARE_OP_FLOAT_JUMP ) = _COMPARE_OP_FLOAT + _JUMP_ON_SIGN ;
2113
2114
2114
- // stack effect: (__0 -- )
2115
- inst ( COMPARE_OP_INT_JUMP ) {
2115
+ // Similar to COMPARE_OP_FLOAT
2116
+ op ( _COMPARE_OP_INT , ( unused / 1 , left , right , when_to_jump_mask / 1 -- jump ) ) {
2116
2117
assert (cframe .use_tracing == 0 );
2117
2118
// Combined: COMPARE_OP (int ? int) + POP_JUMP_IF_(true/false)
2118
- _PyCompareOpCache * cache = (_PyCompareOpCache * )next_instr ;
2119
- int when_to_jump_mask = cache -> mask ;
2120
- PyObject * right = TOP ();
2121
- PyObject * left = SECOND ();
2122
2119
DEOPT_IF (!PyLong_CheckExact (left ), COMPARE_OP );
2123
2120
DEOPT_IF (!PyLong_CheckExact (right ), COMPARE_OP );
2124
2121
DEOPT_IF ((size_t )(Py_SIZE (left ) + 1 ) > 2 , COMPARE_OP );
@@ -2127,21 +2124,13 @@ dummy_func(
2127
2124
assert (Py_ABS (Py_SIZE (left )) <= 1 && Py_ABS (Py_SIZE (right )) <= 1 );
2128
2125
Py_ssize_t ileft = Py_SIZE (left ) * ((PyLongObject * )left )-> ob_digit [0 ];
2129
2126
Py_ssize_t iright = Py_SIZE (right ) * ((PyLongObject * )right )-> ob_digit [0 ];
2130
- int sign = (ileft > iright ) - (ileft < iright );
2131
- JUMPBY (INLINE_CACHE_ENTRIES_COMPARE_OP );
2132
- NEXTOPARG ();
2133
- STACK_SHRINK (2 );
2127
+ // 1 if <, 2 if ==, 4 if >; this matches when _to_jump_mask
2128
+ int sign_ish = 2 * (ileft > iright ) + 2 - (ileft < iright );
2134
2129
_Py_DECREF_SPECIALIZED (left , (destructor )PyObject_Free );
2135
2130
_Py_DECREF_SPECIALIZED (right , (destructor )PyObject_Free );
2136
- assert (opcode == POP_JUMP_IF_FALSE || opcode == POP_JUMP_IF_TRUE );
2137
- int jump = (1 << (sign + 1 )) & when_to_jump_mask ;
2138
- if (!jump ) {
2139
- next_instr ++ ;
2140
- }
2141
- else {
2142
- JUMPBY (1 + oparg );
2143
- }
2131
+ jump = (PyObject * )(size_t )(sign_ish & when_to_jump_mask );
2144
2132
}
2133
+ super (COMPARE_OP_INT_JUMP ) = _COMPARE_OP_INT + _JUMP_ON_SIGN ;
2145
2134
2146
2135
// stack effect: (__0 -- )
2147
2136
inst (COMPARE_OP_STR_JUMP ) {
0 commit comments