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
|
@ -247,6 +247,16 @@ ASDLGEN= $(srcdir)/Parser/asdl_c.py
|
|||
|
||||
##########################################################################
|
||||
# Python
|
||||
|
||||
OPCODETARGETS_H= \
|
||||
$(srcdir)/Python/opcode_targets.h
|
||||
|
||||
OPCODETARGETGEN= \
|
||||
$(srcdir)/Python/makeopcodetargets.py
|
||||
|
||||
OPCODETARGETGEN_FILES= \
|
||||
$(OPCODETARGETGEN) $(srcdir)/Lib/opcode.py
|
||||
|
||||
PYTHON_OBJS= \
|
||||
Python/_warnings.o \
|
||||
Python/Python-ast.o \
|
||||
|
@ -567,6 +577,11 @@ Objects/unicodeobject.o: $(srcdir)/Objects/unicodeobject.c \
|
|||
$(BYTESTR_DEPS) \
|
||||
$(srcdir)/Objects/stringlib/formatter.h
|
||||
|
||||
$(OPCODETARGETS_H): $(OPCODETARGETGEN_FILES)
|
||||
$(OPCODETARGETGEN) $(OPCODETARGETS_H)
|
||||
|
||||
Python/ceval.o: $(OPCODETARGETS_H)
|
||||
|
||||
Python/formatter_unicode.o: $(srcdir)/Python/formatter_unicode.c \
|
||||
$(BYTESTR_DEPS)
|
||||
|
||||
|
|
|
@ -12,6 +12,11 @@ What's New in Python 3.1 alpha 0
|
|||
Core and Builtins
|
||||
-----------------
|
||||
|
||||
- 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.
|
||||
|
||||
- Issue #4874: Most builtin decoders now reject unicode input.
|
||||
|
||||
- Issue #4842: Don't allow trailing 'L' when constructing an integer
|
||||
|
|
497
Python/ceval.c
497
Python/ceval.c
File diff suppressed because it is too large
Load Diff
|
@ -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()
|
|
@ -0,0 +1,258 @@
|
|||
static void *opcode_targets[256] = {
|
||||
&&_unknown_opcode,
|
||||
&&TARGET_POP_TOP,
|
||||
&&TARGET_ROT_TWO,
|
||||
&&TARGET_ROT_THREE,
|
||||
&&TARGET_DUP_TOP,
|
||||
&&TARGET_ROT_FOUR,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&TARGET_NOP,
|
||||
&&TARGET_UNARY_POSITIVE,
|
||||
&&TARGET_UNARY_NEGATIVE,
|
||||
&&TARGET_UNARY_NOT,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&TARGET_UNARY_INVERT,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&TARGET_BINARY_POWER,
|
||||
&&TARGET_BINARY_MULTIPLY,
|
||||
&&_unknown_opcode,
|
||||
&&TARGET_BINARY_MODULO,
|
||||
&&TARGET_BINARY_ADD,
|
||||
&&TARGET_BINARY_SUBTRACT,
|
||||
&&TARGET_BINARY_SUBSCR,
|
||||
&&TARGET_BINARY_FLOOR_DIVIDE,
|
||||
&&TARGET_BINARY_TRUE_DIVIDE,
|
||||
&&TARGET_INPLACE_FLOOR_DIVIDE,
|
||||
&&TARGET_INPLACE_TRUE_DIVIDE,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&TARGET_STORE_MAP,
|
||||
&&TARGET_INPLACE_ADD,
|
||||
&&TARGET_INPLACE_SUBTRACT,
|
||||
&&TARGET_INPLACE_MULTIPLY,
|
||||
&&_unknown_opcode,
|
||||
&&TARGET_INPLACE_MODULO,
|
||||
&&TARGET_STORE_SUBSCR,
|
||||
&&TARGET_DELETE_SUBSCR,
|
||||
&&TARGET_BINARY_LSHIFT,
|
||||
&&TARGET_BINARY_RSHIFT,
|
||||
&&TARGET_BINARY_AND,
|
||||
&&TARGET_BINARY_XOR,
|
||||
&&TARGET_BINARY_OR,
|
||||
&&TARGET_INPLACE_POWER,
|
||||
&&TARGET_GET_ITER,
|
||||
&&TARGET_STORE_LOCALS,
|
||||
&&TARGET_PRINT_EXPR,
|
||||
&&TARGET_LOAD_BUILD_CLASS,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&TARGET_INPLACE_LSHIFT,
|
||||
&&TARGET_INPLACE_RSHIFT,
|
||||
&&TARGET_INPLACE_AND,
|
||||
&&TARGET_INPLACE_XOR,
|
||||
&&TARGET_INPLACE_OR,
|
||||
&&TARGET_BREAK_LOOP,
|
||||
&&TARGET_WITH_CLEANUP,
|
||||
&&_unknown_opcode,
|
||||
&&TARGET_RETURN_VALUE,
|
||||
&&TARGET_IMPORT_STAR,
|
||||
&&_unknown_opcode,
|
||||
&&TARGET_YIELD_VALUE,
|
||||
&&TARGET_POP_BLOCK,
|
||||
&&TARGET_END_FINALLY,
|
||||
&&TARGET_POP_EXCEPT,
|
||||
&&TARGET_STORE_NAME,
|
||||
&&TARGET_DELETE_NAME,
|
||||
&&TARGET_UNPACK_SEQUENCE,
|
||||
&&TARGET_FOR_ITER,
|
||||
&&TARGET_UNPACK_EX,
|
||||
&&TARGET_STORE_ATTR,
|
||||
&&TARGET_DELETE_ATTR,
|
||||
&&TARGET_STORE_GLOBAL,
|
||||
&&TARGET_DELETE_GLOBAL,
|
||||
&&TARGET_DUP_TOPX,
|
||||
&&TARGET_LOAD_CONST,
|
||||
&&TARGET_LOAD_NAME,
|
||||
&&TARGET_BUILD_TUPLE,
|
||||
&&TARGET_BUILD_LIST,
|
||||
&&TARGET_BUILD_SET,
|
||||
&&TARGET_BUILD_MAP,
|
||||
&&TARGET_LOAD_ATTR,
|
||||
&&TARGET_COMPARE_OP,
|
||||
&&TARGET_IMPORT_NAME,
|
||||
&&TARGET_IMPORT_FROM,
|
||||
&&TARGET_JUMP_FORWARD,
|
||||
&&TARGET_JUMP_IF_FALSE,
|
||||
&&TARGET_JUMP_IF_TRUE,
|
||||
&&TARGET_JUMP_ABSOLUTE,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&TARGET_LOAD_GLOBAL,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&TARGET_CONTINUE_LOOP,
|
||||
&&TARGET_SETUP_LOOP,
|
||||
&&TARGET_SETUP_EXCEPT,
|
||||
&&TARGET_SETUP_FINALLY,
|
||||
&&_unknown_opcode,
|
||||
&&TARGET_LOAD_FAST,
|
||||
&&TARGET_STORE_FAST,
|
||||
&&TARGET_DELETE_FAST,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&TARGET_RAISE_VARARGS,
|
||||
&&TARGET_CALL_FUNCTION,
|
||||
&&TARGET_MAKE_FUNCTION,
|
||||
&&TARGET_BUILD_SLICE,
|
||||
&&TARGET_MAKE_CLOSURE,
|
||||
&&TARGET_LOAD_CLOSURE,
|
||||
&&TARGET_LOAD_DEREF,
|
||||
&&TARGET_STORE_DEREF,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&TARGET_CALL_FUNCTION_VAR,
|
||||
&&TARGET_CALL_FUNCTION_KW,
|
||||
&&TARGET_CALL_FUNCTION_VAR_KW,
|
||||
&&TARGET_EXTENDED_ARG,
|
||||
&&_unknown_opcode,
|
||||
&&TARGET_LIST_APPEND,
|
||||
&&TARGET_SET_ADD,
|
||||
&&TARGET_MAP_ADD,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode,
|
||||
&&_unknown_opcode
|
||||
};
|
16
configure.in
16
configure.in
|
@ -3660,6 +3660,22 @@ then
|
|||
wide chars that would be converted.])
|
||||
fi
|
||||
|
||||
# Check for --with-computed-gotos
|
||||
AC_MSG_CHECKING(for --with-computed-gotos)
|
||||
AC_ARG_WITH(computed-gotos,
|
||||
AC_HELP_STRING(--with-computed-gotos,
|
||||
Use computed gotos / threaded dispatch in evaluation loop (not available on all compilers)),
|
||||
[
|
||||
if test "$withval" != no
|
||||
then
|
||||
AC_DEFINE(USE_COMPUTED_GOTOS, 1,
|
||||
[Define if you want to use computed gotos in ceval.c.])
|
||||
AC_MSG_RESULT(yes)
|
||||
else AC_MSG_RESULT(no)
|
||||
fi],
|
||||
[AC_MSG_RESULT(no)])
|
||||
|
||||
|
||||
AC_SUBST(THREADHEADERS)
|
||||
|
||||
for h in `(cd $srcdir;echo Python/thread_*.h)`
|
||||
|
|
|
@ -5,6 +5,9 @@
|
|||
#define Py_PYCONFIG_H
|
||||
|
||||
|
||||
/* Define if building universal (internal helper macro) */
|
||||
#undef AC_APPLE_UNIVERSAL_BUILD
|
||||
|
||||
/* Define for AIX if your compiler is a genuine IBM xlC/xlC_r and you want
|
||||
support for AIX C++ shared extension modules. */
|
||||
#undef AIX_GENUINE_CPLUSPLUS
|
||||
|
@ -949,6 +952,31 @@
|
|||
/* Define to 1 if your <sys/time.h> declares `struct tm'. */
|
||||
#undef TM_IN_SYS_TIME
|
||||
|
||||
/* Define if you want to use computed gotos in ceval.c. */
|
||||
#undef USE_COMPUTED_GOTOS
|
||||
|
||||
/* Enable extensions on AIX 3, Interix. */
|
||||
#ifndef _ALL_SOURCE
|
||||
# undef _ALL_SOURCE
|
||||
#endif
|
||||
/* Enable GNU extensions on systems that have them. */
|
||||
#ifndef _GNU_SOURCE
|
||||
# undef _GNU_SOURCE
|
||||
#endif
|
||||
/* Enable threading extensions on Solaris. */
|
||||
#ifndef _POSIX_PTHREAD_SEMANTICS
|
||||
# undef _POSIX_PTHREAD_SEMANTICS
|
||||
#endif
|
||||
/* Enable extensions on HP NonStop. */
|
||||
#ifndef _TANDEM_SOURCE
|
||||
# undef _TANDEM_SOURCE
|
||||
#endif
|
||||
/* Enable general extensions on Solaris. */
|
||||
#ifndef __EXTENSIONS__
|
||||
# undef __EXTENSIONS__
|
||||
#endif
|
||||
|
||||
|
||||
/* Define if a va_list is an array of some kind */
|
||||
#undef VA_LIST_IS_ARRAY
|
||||
|
||||
|
@ -986,20 +1014,21 @@
|
|||
/* Define to profile with the Pentium timestamp counter */
|
||||
#undef WITH_TSC
|
||||
|
||||
/* Define to 1 if your processor stores words with the most significant byte
|
||||
first (like Motorola and SPARC, unlike Intel and VAX). */
|
||||
#undef WORDS_BIGENDIAN
|
||||
/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
|
||||
significant byte first (like Motorola and SPARC, unlike Intel). */
|
||||
#if defined AC_APPLE_UNIVERSAL_BUILD
|
||||
# if defined __BIG_ENDIAN__
|
||||
# define WORDS_BIGENDIAN 1
|
||||
# endif
|
||||
#else
|
||||
# ifndef WORDS_BIGENDIAN
|
||||
# undef WORDS_BIGENDIAN
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Define if arithmetic is subject to x87-style double rounding issue */
|
||||
#undef X87_DOUBLE_ROUNDING
|
||||
|
||||
/* Define to 1 if on AIX 3.
|
||||
System headers sometimes define this.
|
||||
We just want to avoid a redefinition error message. */
|
||||
#ifndef _ALL_SOURCE
|
||||
# undef _ALL_SOURCE
|
||||
#endif
|
||||
|
||||
/* Define on OpenBSD to activate all library features */
|
||||
#undef _BSD_SOURCE
|
||||
|
||||
|
@ -1018,15 +1047,25 @@
|
|||
/* This must be defined on some systems to enable large file support. */
|
||||
#undef _LARGEFILE_SOURCE
|
||||
|
||||
/* Define to 1 if on MINIX. */
|
||||
#undef _MINIX
|
||||
|
||||
/* Define on NetBSD to activate all library features */
|
||||
#undef _NETBSD_SOURCE
|
||||
|
||||
/* Define _OSF_SOURCE to get the makedev macro. */
|
||||
#undef _OSF_SOURCE
|
||||
|
||||
/* Define to 2 if the system does not provide POSIX.1 features except with
|
||||
this defined. */
|
||||
#undef _POSIX_1_SOURCE
|
||||
|
||||
/* Define to activate features from IEEE Stds 1003.1-2001 */
|
||||
#undef _POSIX_C_SOURCE
|
||||
|
||||
/* Define to 1 if you need to in order for `stat' and other things to work. */
|
||||
#undef _POSIX_SOURCE
|
||||
|
||||
/* Define if you have POSIX threads, and your system does not define that. */
|
||||
#undef _POSIX_THREADS
|
||||
|
||||
|
|
Loading…
Reference in New Issue