summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
Diffstat (limited to 'Python')
-rw-r--r--Python/bytecodes.c30
-rw-r--r--Python/ceval.c40
-rw-r--r--Python/executor_cases.c.h36
3 files changed, 66 insertions, 40 deletions
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index 176dbb5..1fe9970 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -3654,6 +3654,36 @@ dummy_func(
Py_UNREACHABLE();
}
+ ///////// Tier-2 only opcodes /////////
+
+ op(_POP_JUMP_IF_FALSE, (flag -- )) {
+ if (Py_IsFalse(flag)) {
+ pc = oparg;
+ }
+ }
+
+ op(_POP_JUMP_IF_TRUE, (flag -- )) {
+ if (Py_IsTrue(flag)) {
+ pc = oparg;
+ }
+ }
+
+ op(JUMP_TO_TOP, (--)) {
+ pc = 0;
+ CHECK_EVAL_BREAKER();
+ }
+
+ op(SAVE_IP, (--)) {
+ frame->prev_instr = ip_offset + oparg;
+ }
+
+ op(EXIT_TRACE, (--)) {
+ frame->prev_instr--; // Back up to just before destination
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ Py_DECREF(self);
+ return frame;
+ }
+
// END BYTECODES //
diff --git a/Python/ceval.c b/Python/ceval.c
index de44085..d6c72fa 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -2764,46 +2764,6 @@ _PyUopExecute(_PyExecutorObject *executor, _PyInterpreterFrame *frame, PyObject
#define ENABLE_SPECIALIZATION 0
#include "executor_cases.c.h"
- // NOTE: These pop-jumps move the uop pc, not the bytecode ip
- case _POP_JUMP_IF_FALSE:
- {
- if (Py_IsFalse(stack_pointer[-1])) {
- pc = oparg;
- }
- stack_pointer--;
- break;
- }
-
- case _POP_JUMP_IF_TRUE:
- {
- if (Py_IsTrue(stack_pointer[-1])) {
- pc = oparg;
- }
- stack_pointer--;
- break;
- }
-
- case JUMP_TO_TOP:
- {
- pc = 0;
- CHECK_EVAL_BREAKER();
- break;
- }
-
- case SAVE_IP:
- {
- frame->prev_instr = ip_offset + oparg;
- break;
- }
-
- case EXIT_TRACE:
- {
- frame->prev_instr--; // Back up to just before destination
- _PyFrame_SetStackPointer(frame, stack_pointer);
- Py_DECREF(self);
- return frame;
- }
-
default:
{
fprintf(stderr, "Unknown uop %d, operand %" PRIu64 "\n", opcode, operand);
diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h
index 805ea06..ce54755 100644
--- a/Python/executor_cases.c.h
+++ b/Python/executor_cases.c.h
@@ -1987,3 +1987,39 @@
stack_pointer[-(2 + (oparg-2))] = top;
break;
}
+
+ case _POP_JUMP_IF_FALSE: {
+ PyObject *flag = stack_pointer[-1];
+ if (Py_IsFalse(flag)) {
+ pc = oparg;
+ }
+ STACK_SHRINK(1);
+ break;
+ }
+
+ case _POP_JUMP_IF_TRUE: {
+ PyObject *flag = stack_pointer[-1];
+ if (Py_IsTrue(flag)) {
+ pc = oparg;
+ }
+ STACK_SHRINK(1);
+ break;
+ }
+
+ case JUMP_TO_TOP: {
+ pc = 0;
+ break;
+ }
+
+ case SAVE_IP: {
+ frame->prev_instr = ip_offset + oparg;
+ break;
+ }
+
+ case EXIT_TRACE: {
+ frame->prev_instr--; // Back up to just before destination
+ _PyFrame_SetStackPointer(frame, stack_pointer);
+ Py_DECREF(self);
+ return frame;
+ break;
+ }