X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=ir%2Fbe%2Fia32%2Fia32_architecture.c;h=2ffda784695a4978ef011716482113a95af91704;hb=bba15007f36643c7c6f9281c8be00d8511bfb4f9;hp=7bce4ab4de4043dae2faaf3e1c70dc459f0a8a0f;hpb=6538813a1436408b9d5547090dd181d25d820bf5;p=libfirm diff --git a/ir/be/ia32/ia32_architecture.c b/ir/be/ia32/ia32_architecture.c index 7bce4ab4d..2ffda7846 100644 --- a/ir/be/ia32/ia32_architecture.c +++ b/ir/be/ia32/ia32_architecture.c @@ -708,15 +708,16 @@ static cpu_support auto_detect_AMD(x86_cpu_info_t const *info) { break; default: /* unknown K7 */ - auto_arch = arch_athlon | arch_feature_p6_insn;; + auto_arch = arch_athlon | arch_feature_p6_insn; break; } break; case 0x0F: - auto_arch = arch_k8 | arch_feature_p6_insn;; + auto_arch = arch_k8 | arch_feature_p6_insn; break; case 0x1F: - auto_arch = arch_k10 | arch_feature_p6_insn;; + case 0x2F: /* AMD Family 11h */ + auto_arch = arch_k10 | arch_feature_p6_insn; break; default: /* unknown */ @@ -739,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 }