diff options
| author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2012-05-02 21:39:10 (GMT) | 
|---|---|---|
| committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2012-05-02 21:39:10 (GMT) | 
| commit | b01b765d7b57559048e606b7a01156a807b26b9c (patch) | |
| tree | 8835c59d6164b82f15ea847bacc04e7a074b666c /unix/tclUnixCompat.c | |
| parent | fc2fcb8cf98f705a260551269c44f3c2ea80bc6c (diff) | |
| parent | 99557b6c57a524f31c81cde6d39cc2a5e51983f3 (diff) | |
| download | tcl-b01b765d7b57559048e606b7a01156a807b26b9c.zip tcl-b01b765d7b57559048e606b7a01156a807b26b9c.tar.gz tcl-b01b765d7b57559048e606b7a01156a807b26b9c.tar.bz2 | |
Better detection and implementation for cpuid instruction on Intel-derived processors, both 32-bit and 64-bit
Diffstat (limited to 'unix/tclUnixCompat.c')
| -rw-r--r-- | unix/tclUnixCompat.c | 17 | 
1 files changed, 8 insertions, 9 deletions
| diff --git a/unix/tclUnixCompat.c b/unix/tclUnixCompat.c index 1043115..6e2666b 100644 --- a/unix/tclUnixCompat.c +++ b/unix/tclUnixCompat.c @@ -675,8 +675,7 @@ TclpGetHostByAddr(const char *addr, int length, int type)   *	Get CPU ID information on an Intel box under UNIX (either Linux or Cygwin)   *   * Results: - *	Returns TCL_OK if successful, TCL_ERROR if CPUID is not supported or - *	fails. + *	Returns TCL_OK if successful, TCL_ERROR if CPUID is not supported.   *   * Side effects:   *	If successful, stores EAX, EBX, ECX and EDX registers after the CPUID @@ -692,14 +691,14 @@ TclWinCPUID(  {      int status = TCL_ERROR; -#if defined(HAVE_CPUID) && defined(__CYGWIN__) -    __asm__ __volatile__("pushl %%ebx      \n\t" /* save %ebx */ +    /* See: <http://en.wikipedia.org/wiki/CPUID> */ +#if defined(HAVE_CPUID) +    __asm__ __volatile__("mov %%ebx, %%edi     \n\t" /* save %ebx */                   "cpuid            \n\t" -                 "movl %%ebx, %1   \n\t" /* save what cpuid just put in %ebx */ -                 "popl %%ebx       \n\t" /* restore the old %ebx */ -                 : "=a"(regsPtr[0]), "=r"(regsPtr[1]), "=c"(regsPtr[2]), "=d"(regsPtr[3]) -                 : "a"(index) -                 : "cc"); +                 "mov %%ebx, %%esi   \n\t" /* save what cpuid just put in %ebx */ +                 "mov %%edi, %%ebx  \n\t" /* restore the old %ebx */ +                 : "=a"(regsPtr[0]), "=S"(regsPtr[1]), "=c"(regsPtr[2]), "=d"(regsPtr[3]) +                 : "a"(index));      status = TCL_OK;  #endif      return status; | 
