From ee2dd4a4e3ea815c1f798d06c6fed6461139d767 Mon Sep 17 00:00:00 2001 From: Mark Dickinson Date: Sat, 31 Oct 2009 10:20:38 +0000 Subject: Merged revisions 75984 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/py3k ................ r75984 | mark.dickinson | 2009-10-31 10:18:44 +0000 (Sat, 31 Oct 2009) | 12 lines Merged revisions 75982 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r75982 | mark.dickinson | 2009-10-31 10:11:28 +0000 (Sat, 31 Oct 2009) | 5 lines 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.) ........ ................ --- Misc/NEWS | 4 ++++ Python/ceval.c | 20 +++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/Misc/NEWS b/Misc/NEWS index c5ad099..3593e3e 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -130,6 +130,10 @@ Tests 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. + - Issue #6802: Fix build issues on MacOSX 10.6 - Issue #6801 : symmetric_difference_update also accepts |. diff --git a/Python/ceval.c b/Python/ceval.c index b5b5c27..8a24f11 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, -- cgit v0.12