diff options
Diffstat (limited to 'Python/optimizer_cases.c.h')
-rw-r--r-- | Python/optimizer_cases.c.h | 44 |
1 files changed, 40 insertions, 4 deletions
diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index fc70ee31a80..a1119171fa4 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -1281,11 +1281,38 @@ } case _COMPARE_OP_INT: { + JitOptSymbol *right; + JitOptSymbol *left; JitOptSymbol *res; - res = sym_new_type(ctx, &PyBool_Type); - stack_pointer[-2] = res; - stack_pointer += -1; - assert(WITHIN_STACK_BOUNDS()); + right = stack_pointer[-1]; + left = stack_pointer[-2]; + if (sym_is_const(ctx, left) && sym_is_const(ctx, right)) + { + assert(PyLong_CheckExact(sym_get_const(ctx, left))); + assert(PyLong_CheckExact(sym_get_const(ctx, right))); + stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); + PyObject *tmp = PyObject_RichCompare(sym_get_const(ctx, left), + sym_get_const(ctx, right), + oparg >> 5); + if (tmp == NULL) { + goto error; + } + assert(PyBool_Check(tmp)); + assert(_Py_IsImmortal(tmp)); + REPLACE_OP(this_instr, _POP_TWO_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)tmp); + res = sym_new_const(ctx, tmp); + stack_pointer[0] = res; + stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); + Py_DECREF(tmp); + } + else { + res = sym_new_type(ctx, &PyBool_Type); + stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); + } + stack_pointer[-1] = res; break; } @@ -2392,6 +2419,15 @@ break; } + case _POP_TWO_LOAD_CONST_INLINE_BORROW: { + JitOptSymbol *value; + value = sym_new_not_null(ctx); + stack_pointer[-2] = value; + stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); + break; + } + case _CHECK_FUNCTION: { break; } |