On Feb 25, 2008, at 6:40 PM, Avi Kivity wrote: > Alexander Graf wrote: >> >> The ebx store was done because of PIC code, which does not allow >> ebx to get clobbered. If we are not in PIC code, =r contains ebx as >> GPR though, so the assumption that ebx needs to be restored was >> wrong then. This new version only enables the store/restore code if >> i386 and PIC code are used. There is no need to distinguish between >> x86_64 and i386 for the other cases. >> >> So does this version work? >> > > It probably will, but it seems fragile to depend on the details of > PIC. I committed something more generic: > > #ifdef __x86_64__ > asm volatile("cpuid" > : "=a"(vec[0]), "=b"(vec[1]), > "=c"(vec[2]), "=d"(vec[3]) > : "0"(function) : "cc");
This code works fine for all targets, including i386. With PIC enabled, gcc registers the ebx registers and complains about this, thus errors out. This is the only special case I am aware of, so I doubt we should treat any case different from the "normal" case but the PIC one. > > #else > asm volatile("pusha \n\t" > > "cpuid \n\t" > "mov %%eax, 0(%1) \n\t" > "mov %%ebx, 4(%1) \n\t" > "mov %%ecx, 8(%1) \n\t" > "mov %%edx, 12(%1) \n\t" > > "popa" > : "a"(function), "S"(vec) : "memory", "cc"); > #endif Basically #ifdef __x86_64__ is even wrong, as the problem is not that too many registers are being used, but that ebx is reserved and can't be saved/restored automatically. Furthermore I believe that the less assembler is used, the better the code looks. So for cases the snippet above is not required, why use it? Overusing assembler is imho exactly the reason the previous code broke. There's one more thing I'd like to add here. Gcc optimizes really well when one lets it to. So for this exact case with -O2 used, there are no memory accesses. The vector is simply stored in 4 registers and thus no more movs are required. Alex ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ kvm-devel mailing list kvm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-devel