From: Shenghou Ma Date: Sun, 24 Feb 2013 14:45:53 +0000 (+0800) Subject: cmd/dist: avoid using %ebx on i386. X-Git-Tag: go1.1rc2~874 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=89ec3a610d2a1c9887fe9ee0bd622f3ab14c6750;p=gostls13.git cmd/dist: avoid using %ebx on i386. Or gcc (-fPIC) will complain: cmd/dist/unix.c: In function ‘cansse2’ cmd/dist/unix.c:774: error: can't find a register in class ‘BREG’ while reloading ‘asm’ cmd/dist/unix.c:774: error: ‘asm’ operand has impossible constraints This affects bootstrapping on native Darwin/386 where all code is compiled with -fPIC. R=golang-dev, iant CC=golang-dev https://golang.org/cl/7394047 --- diff --git a/src/cmd/dist/unix.c b/src/cmd/dist/unix.c index baf019ef9c..d8b88893c9 100644 --- a/src/cmd/dist/unix.c +++ b/src/cmd/dist/unix.c @@ -770,7 +770,15 @@ sigillhand(int signum) static void __cpuid(int dst[4], int ax) { -#if defined(__i386__) || defined(__x86_64__) +#ifdef __i386__ + // we need to avoid ebx on i386 (esp. when -fPIC). + asm volatile( + "mov %%ebx, %%edi\n\t" + "cpuid\n\t" + "xchgl %%ebx, %%edi" + : "=a" (dst[0]), "=D" (dst[1]), "=c" (dst[2]), "=d" (dst[3]) + : "0" (ax)); +#elif defined(__x86_64__) asm volatile("cpuid" : "=a" (dst[0]), "=b" (dst[1]), "=c" (dst[2]), "=d" (dst[3]) : "0" (ax));