summaryrefslogtreecommitdiffstats
path: root/Python/ceval.c
diff options
context:
space:
mode:
authorMark Dickinson <dickinsm@gmail.com>2009-10-31 10:20:38 (GMT)
committerMark Dickinson <dickinsm@gmail.com>2009-10-31 10:20:38 (GMT)
commitee2dd4a4e3ea815c1f798d06c6fed6461139d767 (patch)
treee46a7eb45245e8f7e60ebd8c21be8fe899aacb0c /Python/ceval.c
parentaa8be96b983dd4de302e43e883eaa019eab012b0 (diff)
downloadcpython-ee2dd4a4e3ea815c1f798d06c6fed6461139d767.zip
cpython-ee2dd4a4e3ea815c1f798d06c6fed6461139d767.tar.gz
cpython-ee2dd4a4e3ea815c1f798d06c6fed6461139d767.tar.bz2
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.) ........ ................
Diffstat (limited to 'Python/ceval.c')
-rw-r--r--Python/ceval.c20
1 files changed, 19 insertions, 1 deletions
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,