summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2024-08-27 09:49:39 (GMT)
committerGitHub <noreply@github.com>2024-08-27 09:49:39 (GMT)
commit54a05a46002ee1c9211f299df38f444f16866ef5 (patch)
treeeb4e94b3b62723936598a68bfcaef6eb6d66c389 /Python
parent89328f7b129a6e4d7164f954b976bf45da69f0b2 (diff)
downloadcpython-54a05a46002ee1c9211f299df38f444f16866ef5.zip
cpython-54a05a46002ee1c9211f299df38f444f16866ef5.tar.gz
cpython-54a05a46002ee1c9211f299df38f444f16866ef5.tar.bz2
GH-123232: Factor BINARY_SLICE and STORE_SLICE to handle stats properly for tier 2. (GH-123381)
Diffstat (limited to 'Python')
-rw-r--r--Python/bytecodes.c24
-rw-r--r--Python/executor_cases.c.h2
-rw-r--r--Python/generated_cases.c.h74
3 files changed, 66 insertions, 34 deletions
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index ad30fb3..01e88a3 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -668,11 +668,17 @@ dummy_func(
macro(BINARY_SUBSCR) = _SPECIALIZE_BINARY_SUBSCR + _BINARY_SUBSCR;
- inst(BINARY_SLICE, (container, start, stop -- res)) {
+ specializing op(_SPECIALIZE_BINARY_SLICE, (container, start, stop -- container, start, stop)) {
+ // Placeholder until we implement BINARY_SLICE specialization
+ #if ENABLE_SPECIALIZATION
+ OPCODE_DEFERRED_INC(BINARY_SLICE);
+ #endif /* ENABLE_SPECIALIZATION */
+ }
+
+ op(_BINARY_SLICE, (container, start, stop -- res)) {
PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start),
PyStackRef_AsPyObjectSteal(stop));
PyObject *res_o;
- OPCODE_DEFERRED_INC(BINARY_SLICE);
// Can't use ERROR_IF() here, because we haven't
// DECREF'ed container yet, and we still own slice.
if (slice == NULL) {
@@ -687,10 +693,18 @@ dummy_func(
res = PyStackRef_FromPyObjectSteal(res_o);
}
- inst(STORE_SLICE, (v, container, start, stop -- )) {
+ macro(BINARY_SLICE) = _SPECIALIZE_BINARY_SLICE + _BINARY_SLICE;
+
+ specializing op(_SPECIALIZE_STORE_SLICE, (v, container, start, stop -- v, container, start, stop)) {
+ // Placeholder until we implement STORE_SLICE specialization
+ #if ENABLE_SPECIALIZATION
+ OPCODE_DEFERRED_INC(STORE_SLICE);
+ #endif /* ENABLE_SPECIALIZATION */
+ }
+
+ op(_STORE_SLICE, (v, container, start, stop -- )) {
PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start),
PyStackRef_AsPyObjectSteal(stop));
- OPCODE_DEFERRED_INC(STORE_SLICE);
int err;
if (slice == NULL) {
err = 1;
@@ -704,6 +718,8 @@ dummy_func(
ERROR_IF(err, error);
}
+ macro(STORE_SLICE) = _SPECIALIZE_STORE_SLICE + _STORE_SLICE;
+
inst(BINARY_SUBSCR_LIST_INT, (unused/1, list_st, sub_st -- res)) {
PyObject *sub = PyStackRef_AsPyObjectBorrow(sub_st);
PyObject *list = PyStackRef_AsPyObjectBorrow(list_st);
diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h
index 3d0f3b3..0de5c8a 100644
--- a/Python/executor_cases.c.h
+++ b/Python/executor_cases.c.h
@@ -797,7 +797,6 @@
PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start),
PyStackRef_AsPyObjectSteal(stop));
PyObject *res_o;
- OPCODE_DEFERRED_INC(BINARY_SLICE);
// Can't use ERROR_IF() here, because we haven't
// DECREF'ed container yet, and we still own slice.
if (slice == NULL) {
@@ -827,7 +826,6 @@
v = stack_pointer[-4];
PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start),
PyStackRef_AsPyObjectSteal(stop));
- OPCODE_DEFERRED_INC(STORE_SLICE);
int err;
if (slice == NULL) {
err = 1;
diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h
index bf75cb9..9a75101 100644
--- a/Python/generated_cases.c.h
+++ b/Python/generated_cases.c.h
@@ -371,25 +371,34 @@
_PyStackRef start;
_PyStackRef stop;
_PyStackRef res;
+ // _SPECIALIZE_BINARY_SLICE
+ {
+ // Placeholder until we implement BINARY_SLICE specialization
+ #if ENABLE_SPECIALIZATION
+ OPCODE_DEFERRED_INC(BINARY_SLICE);
+ #endif /* ENABLE_SPECIALIZATION */
+ }
+ // _BINARY_SLICE
stop = stack_pointer[-1];
start = stack_pointer[-2];
container = stack_pointer[-3];
- PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start),
- PyStackRef_AsPyObjectSteal(stop));
- PyObject *res_o;
- OPCODE_DEFERRED_INC(BINARY_SLICE);
- // Can't use ERROR_IF() here, because we haven't
- // DECREF'ed container yet, and we still own slice.
- if (slice == NULL) {
- res_o = NULL;
- }
- else {
- res_o = PyObject_GetItem(PyStackRef_AsPyObjectBorrow(container), slice);
- Py_DECREF(slice);
+ {
+ PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start),
+ PyStackRef_AsPyObjectSteal(stop));
+ PyObject *res_o;
+ // Can't use ERROR_IF() here, because we haven't
+ // DECREF'ed container yet, and we still own slice.
+ if (slice == NULL) {
+ res_o = NULL;
+ }
+ else {
+ res_o = PyObject_GetItem(PyStackRef_AsPyObjectBorrow(container), slice);
+ Py_DECREF(slice);
+ }
+ PyStackRef_CLOSE(container);
+ if (res_o == NULL) goto pop_3_error;
+ res = PyStackRef_FromPyObjectSteal(res_o);
}
- PyStackRef_CLOSE(container);
- if (res_o == NULL) goto pop_3_error;
- res = PyStackRef_FromPyObjectSteal(res_o);
stack_pointer[-3] = res;
stack_pointer += -2;
assert(WITHIN_STACK_BOUNDS());
@@ -7085,24 +7094,33 @@
_PyStackRef container;
_PyStackRef start;
_PyStackRef stop;
+ // _SPECIALIZE_STORE_SLICE
+ {
+ // Placeholder until we implement STORE_SLICE specialization
+ #if ENABLE_SPECIALIZATION
+ OPCODE_DEFERRED_INC(STORE_SLICE);
+ #endif /* ENABLE_SPECIALIZATION */
+ }
+ // _STORE_SLICE
stop = stack_pointer[-1];
start = stack_pointer[-2];
container = stack_pointer[-3];
v = stack_pointer[-4];
- PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start),
- PyStackRef_AsPyObjectSteal(stop));
- OPCODE_DEFERRED_INC(STORE_SLICE);
- int err;
- if (slice == NULL) {
- err = 1;
- }
- else {
- err = PyObject_SetItem(PyStackRef_AsPyObjectBorrow(container), slice, PyStackRef_AsPyObjectBorrow(v));
- Py_DECREF(slice);
+ {
+ PyObject *slice = _PyBuildSlice_ConsumeRefs(PyStackRef_AsPyObjectSteal(start),
+ PyStackRef_AsPyObjectSteal(stop));
+ int err;
+ if (slice == NULL) {
+ err = 1;
+ }
+ else {
+ err = PyObject_SetItem(PyStackRef_AsPyObjectBorrow(container), slice, PyStackRef_AsPyObjectBorrow(v));
+ Py_DECREF(slice);
+ }
+ PyStackRef_CLOSE(v);
+ PyStackRef_CLOSE(container);
+ if (err) goto pop_4_error;
}
- PyStackRef_CLOSE(v);
- PyStackRef_CLOSE(container);
- if (err) goto pop_4_error;
stack_pointer += -4;
assert(WITHIN_STACK_BOUNDS());
DISPATCH();