X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fia32%2Fia32_architecture.c;h=2ffda784695a4978ef011716482113a95af91704;hb=09913c6466bf204f32f0fe00961011e2ba952157;hp=78bca5a3b25ab93cfa62f74f9960e088ab74d44f;hpb=225580e8d7eabc0488b2ac4437cd34ec65cc93d6;p=libfirm diff --git a/ir/be/ia32/ia32_architecture.c b/ir/be/ia32/ia32_architecture.c index 78bca5a3b..2ffda7846 100644 --- a/ir/be/ia32/ia32_architecture.c +++ b/ir/be/ia32/ia32_architecture.c @@ -740,12 +740,25 @@ typedef union { static void x86_cpuid(cpuid_registers *regs, unsigned level) { #if defined(__GNUC__) +# if defined(__PIC__) && !defined(__amd64) // GCC cannot handle EBX in PIC + __asm ( + "pushl %%ebx\n\t" + "cpuid\n\t" + "movl %%ebx, %1\n\t" + "popl %%ebx" + : "=a" (regs->r.eax), "=r" (regs->r.ebx), "=c" (regs->r.ecx), "=d" (regs->r.edx) + : "a" (level) + ); +# else __asm ("cpuid\n\t" : "=a" (regs->r.eax), "=b" (regs->r.ebx), "=c" (regs->r.ecx), "=d" (regs->r.edx) : "a" (level) ); +# endif #elif defined(_MSC_VER) __cpuid(regs->bulk, level); +#else +# error CPUID is missing #endif }