diff options
| author | Mark Dickinson <dickinsm@gmail.com> | 2009-10-31 10:11:28 (GMT) | 
|---|---|---|
| committer | Mark Dickinson <dickinsm@gmail.com> | 2009-10-31 10:11:28 (GMT) | 
| commit | 504a151c825a28e85f81a94c8acbe6b865d66912 (patch) | |
| tree | c0f25304faa5960953fbc2f02e1594ff9bbb9bdc | |
| parent | 09823a2e215bea1bde9941766f8d11c0aee26b76 (diff) | |
| download | cpython-504a151c825a28e85f81a94c8acbe6b865d66912.zip cpython-504a151c825a28e85f81a94c8acbe6b865d66912.tar.gz cpython-504a151c825a28e85f81a94c8acbe6b865d66912.tar.bz2  | |
Issue #6603: Fix --with-tsc build failures on x86-64 that resulted
from a gcc inline assembler peculiarity. (gcc's "A" constraint
apparently means 'rax or rdx' in 64-bit mode, not edx:eax
or rdx:rax as one might expect.)
| -rw-r--r-- | Misc/NEWS | 4 | ||||
| -rw-r--r-- | Python/ceval.c | 20 | 
2 files changed, 23 insertions, 1 deletions
@@ -1345,6 +1345,10 @@ Tools/Demos  Build  ----- +- Issue #6603: Change READ_TIMESTAMP macro in ceval.c so that it +  compiles correctly under gcc on x86-64.  This fixes a reported +  problem with the --with-tsc build on x86-64. +  - Add 2 new options to ``--with-universal-archs`` on MacOSX:    ``intel`` builds a distribution with ``i386`` and ``x86_64`` architectures,    while ``3-way`` builds a distribution with the ``ppc``, ``i386`` diff --git a/Python/ceval.c b/Python/ceval.c index ea4bd05..dd820f2 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -51,11 +51,29 @@ ppc_getcounter(uint64 *v)  	((long*)(v))[1] = tb;  } -#else /* this is for linux/x86 (and probably any other GCC/x86 combo) */ +#elif defined(__i386__) + +/* this is for linux/x86 (and probably any other GCC/x86 combo) */  #define READ_TIMESTAMP(val) \       __asm__ __volatile__("rdtsc" : "=A" (val)) +#elif defined(__x86_64__) + +/* for gcc/x86_64, the "A" constraint in DI mode means *either* rax *or* rdx; +   not edx:eax as it does for i386.  Since rdtsc puts its result in edx:eax +   even in 64-bit mode, we need to use "a" and "d" for the lower and upper +   32-bit pieces of the result. */ + +#define READ_TIMESTAMP(val) \ +    __asm__ __volatile__("rdtsc" : \ +                         "=a" (((int*)&(val))[0]), "=d" (((int*)&(val))[1])); + + +#else + +#error "Don't know how to implement timestamp counter for this architecture" +  #endif  void dump_tsc(int opcode, int ticked, uint64 inst0, uint64 inst1,  | 
