self.assert_specialized(binary_subscr_getitems, "BINARY_SUBSCR_GETITEM")
self.assert_no_opcode(binary_subscr_getitems, "BINARY_SUBSCR")
+ @cpython_only
+ @requires_specialization_ft
+ def test_compare_op(self):
+ def compare_op_int():
+ for _ in range(100):
+ a, b = 1, 2
+ c = a == b
+ self.assertFalse(c)
+
+ compare_op_int()
+ self.assert_specialized(compare_op_int, "COMPARE_OP_INT")
+ self.assert_no_opcode(compare_op_int, "COMPARE_OP")
+
+ def compare_op_float():
+ for _ in range(100):
+ a, b = 1.0, 2.0
+ c = a == b
+ self.assertFalse(c)
+
+ compare_op_float()
+ self.assert_specialized(compare_op_float, "COMPARE_OP_FLOAT")
+ self.assert_no_opcode(compare_op_float, "COMPARE_OP")
+
+ def compare_op_str():
+ for _ in range(100):
+ a, b = "spam", "ham"
+ c = a == b
+ self.assertFalse(c)
+
+ compare_op_str()
+ self.assert_specialized(compare_op_str, "COMPARE_OP_STR")
+ self.assert_no_opcode(compare_op_str, "COMPARE_OP")
+
if __name__ == "__main__":
unittest.main()
};
specializing op(_SPECIALIZE_COMPARE_OP, (counter/1, left, right -- left, right)) {
- #if ENABLE_SPECIALIZATION
+ #if ENABLE_SPECIALIZATION_FT
if (ADAPTIVE_COUNTER_TRIGGERS(counter)) {
next_instr = this_instr;
_Py_Specialize_CompareOp(left, right, next_instr, oparg);
left = stack_pointer[-2];
uint16_t counter = read_u16(&this_instr[1].cache);
(void)counter;
- #if ENABLE_SPECIALIZATION
+ #if ENABLE_SPECIALIZATION_FT
if (ADAPTIVE_COUNTER_TRIGGERS(counter)) {
next_instr = this_instr;
_PyFrame_SetStackPointer(frame, stack_pointer);
{
PyObject *lhs = PyStackRef_AsPyObjectBorrow(lhs_st);
PyObject *rhs = PyStackRef_AsPyObjectBorrow(rhs_st);
+ uint8_t specialized_op;
- assert(ENABLE_SPECIALIZATION);
+ assert(ENABLE_SPECIALIZATION_FT);
assert(_PyOpcode_Caches[COMPARE_OP] == INLINE_CACHE_ENTRIES_COMPARE_OP);
// All of these specializations compute boolean values, so they're all valid
// regardless of the fifth-lowest oparg bit.
- _PyCompareOpCache *cache = (_PyCompareOpCache *)(instr + 1);
if (Py_TYPE(lhs) != Py_TYPE(rhs)) {
SPECIALIZATION_FAIL(COMPARE_OP, compare_op_fail_kind(lhs, rhs));
goto failure;
}
if (PyFloat_CheckExact(lhs)) {
- instr->op.code = COMPARE_OP_FLOAT;
+ specialized_op = COMPARE_OP_FLOAT;
goto success;
}
if (PyLong_CheckExact(lhs)) {
if (_PyLong_IsCompact((PyLongObject *)lhs) && _PyLong_IsCompact((PyLongObject *)rhs)) {
- instr->op.code = COMPARE_OP_INT;
+ specialized_op = COMPARE_OP_INT;
goto success;
}
else {
goto failure;
}
else {
- instr->op.code = COMPARE_OP_STR;
+ specialized_op = COMPARE_OP_STR;
goto success;
}
}
SPECIALIZATION_FAIL(COMPARE_OP, compare_op_fail_kind(lhs, rhs));
failure:
- STAT_INC(COMPARE_OP, failure);
- instr->op.code = COMPARE_OP;
- cache->counter = adaptive_counter_backoff(cache->counter);
+ unspecialize(instr);
return;
success:
- STAT_INC(COMPARE_OP, success);
- cache->counter = adaptive_counter_cooldown();
+ specialize(instr, specialized_op);
}
#ifdef Py_STATS