some GCC versions still do not manage to compile the cpuid code with -fPIC - make...
authorsgorbuno <sgorbuno@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 12 Jul 2012 12:57:59 +0000 (12:57 +0000)
committersgorbuno <sgorbuno@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 12 Jul 2012 12:57:59 +0000 (12:57 +0000)
Vc/src/cpuid.cpp

index 6bcda4d..818fe06 100644 (file)
@@ -68,16 +68,23 @@ bool   CpuId::s_noL2orL3 = false;
     } while (false)
 #elif defined(__i386__) && defined(__PIC__)
 // %ebx may be the PIC register.
+static inline void _Vc_cpuid(int leaf, unsigned int &eax, unsigned int &ebx, unsigned int &ecx, unsigned int &edx)
+{
+    int tmpb;
+    asm("mov %%ebx, %[tmpb]\n\t"
+        "cpuid\n\t"
+        "mov %%ebx, %[ebx]\n\t"
+        "mov %[tmpb], %%ebx\n\t"
+        : [tmpb]"=m"(tmpb), "=a"(eax), [ebx] "=m"(ebx), "+c"(ecx), "=d"(edx)
+        : [leaf] "a"(leaf)
+      );
+}
 #define CPUID(leaf) \
-    __asm__("xchg{l} {%%}ebx, %1\n\t" \
-            "cpuid\n\t"               \
-            "xchg{l} {%%}ebx, %1\n\t" \
-            : "=a"(eax), "=r"(ebx), "=c"(ecx), "=d"(edx) : "a"(leaf))
+    ecx = 0; \
+    _Vc_cpuid(leaf, eax, ebx, ecx, edx)
 #define CPUID_C(leaf, _ecx_) \
-    __asm__("xchg{l} {%%}ebx, %1\n\t" \
-            "cpuid\n\t"               \
-            "xchg{l} {%%}ebx, %1\n\t" \
-            : "=a"(eax), "=r"(ebx), "=c"(ecx), "=d"(edx) : "a"(leaf), "c"(_ecx_))
+    ecx = _ecx_; \
+    _Vc_cpuid(leaf, eax, ebx, ecx, edx)
 #else
 #define CPUID(leaf) \
     __asm__("cpuid" : "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx) : "a"(leaf))