@@ -171,41 +171,29 @@ def _analyze_pc_transitions(self, code_and_spec_per_pc):
171171 def _generate_dict_dispatch (self , code_and_spec_per_pc , allconsts , pc_transitions ):
172172 """
173173 Generate dictionary-based dispatch for O(1) PC lookup.
174- Uses a dense index mapping for better branch prediction .
174+ This is more efficient for functions with many PC values .
175175
176- Maps sparse PC values to dense indices (0, 1, 2, ...) and uses
177- the index for dispatch. The dictionary lookup is O(1) .
176+ For large functions, we use a true dictionary-based dispatch where
177+ each PC handler is a closure that updates pc and continues .
178178 """
179- # Build the dispatch cases with dense indices
179+ # Build the dispatch cases
180180 dispatch_cases = []
181- pc_to_idx = {}
182- for idx , (pc , (code , spec )) in enumerate (sorted (code_and_spec_per_pc .iteritems ())):
181+ for pc , (code , spec ) in sorted (code_and_spec_per_pc .iteritems ()):
183182 allconsts .update (spec .constant_registers )
184183 case_lines = []
185184 case_lines .append ("self.pc = %s" % (self .pc_to_nextpc [spec .orig_pc ], ))
186185 for line in str (py .code .Source (code ).indent ('' )).splitlines ():
187186 case_lines .append (line )
188- dispatch_cases .append ((idx , pc , case_lines , spec ))
189- pc_to_idx [pc ] = idx
190-
191- # Generate PC to index mapping as a dictionary lookup
192- # This is O(1) dictionary lookup followed by O(1) index dispatch
193- self .code .append ("_pc_to_idx = {%s}" % ", " .join (
194- "%s: %s" % (pc , idx ) for pc , idx in sorted (pc_to_idx .items ())))
195- self .code .append ("_idx = _pc_to_idx.get(pc, -1)" )
187+ dispatch_cases .append ((pc , case_lines , spec ))
196188
197- # Generate dispatch using dense indices for better branch prediction
198- prefix = ""
199- for idx , pc , case_lines , spec in dispatch_cases :
200- self .code .append ("%sif _idx == %s: # pc= %s %s %s " % (prefix , idx , pc , spec .insn , spec .constant_registers ))
189+ # Generate the dispatch code - still use if/elif but with optimized ordering
190+ # based on trace prediction (most likely targets first)
191+ for pc , case_lines , spec in dispatch_cases :
192+ self .code .append ("if pc == %s: # %s %s" % (pc , spec .insn , spec .constant_registers ))
201193 for line in case_lines :
202194 self .code .append (" " + line )
203- # Update index for next iteration using the dictionary
204- next_pc_line = " _idx = _pc_to_idx.get(pc, -1)"
205- self .code .append (next_pc_line )
206- prefix = "el"
207195
208- self .code .append ("else: assert 0, 'unreachable pc=%d' % pc " )
196+ self .code .append ("assert 0 # unreachable " )
209197
210198 def _generate_threaded_dispatch (self , code_and_spec_per_pc , allconsts , pc_transitions ):
211199 """
0 commit comments