mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	Issue #4753: By enabling a configure option named '--with-computed-gotos'
on compilers that support it (notably: gcc, SunPro, icc), the bytecode evaluation loop is compiled with a new dispatch mechanism which gives speedups of up to 20%, depending on the system, on various benchmarks.
This commit is contained in:
		
							parent
							
								
									e6aad75f2b
								
							
						
					
					
						commit
						b52ec78baf
					
				
					 8 changed files with 7570 additions and 6217 deletions
				
			
		
							
								
								
									
										43
									
								
								Python/makeopcodetargets.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								Python/makeopcodetargets.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,43 @@ | |||
| #! /usr/bin/env python | ||||
| """Generate C code for the jump table of the threaded code interpreter | ||||
| (for compilers supporting computed gotos or "labels-as-values", such as gcc). | ||||
| """ | ||||
| 
 | ||||
| import imp | ||||
| import os | ||||
| 
 | ||||
| 
 | ||||
| def find_module(modname): | ||||
|     """Finds and returns a module in the local dist/checkout. | ||||
|     """ | ||||
|     modpath = os.path.join( | ||||
|         os.path.dirname(os.path.dirname(__file__)), "Lib") | ||||
|     return imp.load_module(modname, *imp.find_module(modname, [modpath])) | ||||
| 
 | ||||
| def write_contents(f): | ||||
|     """Write C code contents to the target file object. | ||||
|     """ | ||||
|     opcode = find_module("opcode") | ||||
|     targets = ['_unknown_opcode'] * 256 | ||||
|     for opname, op in opcode.opmap.items(): | ||||
|         if opname == "STOP_CODE": | ||||
|             # XXX opcode not implemented | ||||
|             continue | ||||
|         targets[op] = "TARGET_%s" % opname | ||||
|     f.write("static void *opcode_targets[256] = {\n") | ||||
|     f.write(",\n".join("\t&&%s" % s for s in targets)) | ||||
|     f.write("\n};\n") | ||||
| 
 | ||||
| 
 | ||||
| if __name__ == "__main__": | ||||
|     import sys | ||||
|     assert len(sys.argv) < 3, "Too many arguments" | ||||
|     if len(sys.argv) == 2: | ||||
|         target = sys.argv[1] | ||||
|     else: | ||||
|         target = "Python/opcode_targets.h" | ||||
|     f = open(target, "w") | ||||
|     try: | ||||
|         write_contents(f) | ||||
|     finally: | ||||
|         f.close() | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Antoine Pitrou
						Antoine Pitrou