@@ -16,12 +16,102 @@ extern "C" {
1616#include <stdbool.h>
1717
1818
19+ typedef struct _PyJitUopBuffer {
20+ _PyUOpInstruction * start ;
21+ _PyUOpInstruction * next ;
22+ _PyUOpInstruction * end ;
23+ } _PyJitUopBuffer ;
24+
25+
26+ typedef struct _JitOptContext {
27+ char done ;
28+ char out_of_space ;
29+ bool contradiction ;
30+ // Has the builtins dict been watched?
31+ bool builtins_watched ;
32+ // The current "executing" frame.
33+ _Py_UOpsAbstractFrame * frame ;
34+ _Py_UOpsAbstractFrame frames [MAX_ABSTRACT_FRAME_DEPTH ];
35+ int curr_frame_depth ;
36+
37+ // Arena for the symbolic types.
38+ ty_arena t_arena ;
39+
40+ JitOptRef * n_consumed ;
41+ JitOptRef * limit ;
42+ JitOptRef locals_and_stack [MAX_ABSTRACT_INTERP_SIZE ];
43+ _PyJitUopBuffer out_buffer ;
44+ } JitOptContext ;
45+
46+
47+ static inline void
48+ uop_buffer_init (_PyJitUopBuffer * trace , _PyUOpInstruction * start , uint32_t size )
49+ {
50+ trace -> next = trace -> start = start ;
51+ trace -> end = start + size ;
52+ }
53+
54+ static inline _PyUOpInstruction *
55+ uop_buffer_last (_PyJitUopBuffer * trace )
56+ {
57+ assert (trace -> next > trace -> start );
58+ return trace -> next - 1 ;
59+ }
60+
61+ static inline int
62+ uop_buffer_length (_PyJitUopBuffer * trace )
63+ {
64+ return (int )(trace -> next - trace -> start );
65+ }
66+
67+ static inline int
68+ uop_buffer_remaining_space (_PyJitUopBuffer * trace )
69+ {
70+ return (int )(trace -> end - trace -> next );
71+ }
72+
73+ typedef struct _PyJitTracerInitialState {
74+ int stack_depth ;
75+ int chain_depth ;
76+ struct _PyExitData * exit ;
77+ PyCodeObject * code ; // Strong
78+ PyFunctionObject * func ; // Strong
79+ struct _PyExecutorObject * executor ; // Strong
80+ _Py_CODEUNIT * start_instr ;
81+ _Py_CODEUNIT * close_loop_instr ;
82+ _Py_CODEUNIT * jump_backward_instr ;
83+ } _PyJitTracerInitialState ;
84+
85+ typedef struct _PyJitTracerPreviousState {
86+ bool dependencies_still_valid ;
87+ int instr_oparg ;
88+ int instr_stacklevel ;
89+ _Py_CODEUNIT * instr ;
90+ PyCodeObject * instr_code ; // Strong
91+ struct _PyInterpreterFrame * instr_frame ;
92+ _PyBloomFilter dependencies ;
93+ } _PyJitTracerPreviousState ;
94+
95+ typedef struct _PyJitTracerTranslatorState {
96+ int jump_backward_seen ;
97+ } _PyJitTracerTranslatorState ;
98+
99+ typedef struct _PyJitTracerState {
100+ bool is_tracing ;
101+ _PyJitTracerInitialState initial_state ;
102+ _PyJitTracerPreviousState prev_state ;
103+ _PyJitTracerTranslatorState translator_state ;
104+ JitOptContext opt_context ;
105+ _PyJitUopBuffer code_buffer ;
106+ _PyJitUopBuffer out_buffer ;
107+ _PyUOpInstruction uop_array [2 * UOP_MAX_TRACE_LENGTH ];
108+ } _PyJitTracerState ;
109+
19110typedef struct _PyExecutorLinkListNode {
20111 struct _PyExecutorObject * next ;
21112 struct _PyExecutorObject * previous ;
22113} _PyExecutorLinkListNode ;
23114
24-
25115typedef struct {
26116 uint8_t opcode ;
27117 uint8_t oparg ;
@@ -86,8 +176,8 @@ PyAPI_FUNC(void) _Py_Executors_InvalidateCold(PyInterpreterState *interp);
86176
87177int _Py_uop_analyze_and_optimize (
88178 _PyThreadStateImpl * tstate ,
89- _PyUOpInstruction * trace , int trace_len , int curr_stackentries ,
90- _PyBloomFilter * dependencies );
179+ _PyUOpInstruction * input , int trace_len , int curr_stackentries ,
180+ _PyUOpInstruction * output , _PyBloomFilter * dependencies );
91181
92182extern PyTypeObject _PyUOpExecutor_Type ;
93183
@@ -205,6 +295,8 @@ extern JitOptRef _Py_uop_sym_new_truthiness(JitOptContext *ctx, JitOptRef value,
205295extern bool _Py_uop_sym_is_compact_int (JitOptRef sym );
206296extern JitOptRef _Py_uop_sym_new_compact_int (JitOptContext * ctx );
207297extern void _Py_uop_sym_set_compact_int (JitOptContext * ctx , JitOptRef sym );
298+ extern JitOptRef _Py_uop_sym_new_predicate (JitOptContext * ctx , JitOptRef lhs_ref , JitOptRef rhs_ref , JitOptPredicateKind kind );
299+ extern void _Py_uop_sym_apply_predicate_narrowing (JitOptContext * ctx , JitOptRef sym , bool branch_is_true );
208300
209301extern void _Py_uop_abstractcontext_init (JitOptContext * ctx );
210302extern void _Py_uop_abstractcontext_fini (JitOptContext * ctx );
0 commit comments