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.)
This commit is contained in:
Mark Dickinson 2009-10-31 10:11:28 +00:00
parent 09823a2e21
commit 504a151c82
2 changed files with 23 additions and 1 deletions

View File

@ -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``

View File

@ -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,