Looks like CLANG and GCC have the opposite ideas WRT when %ebx/%rbx must be preserved. Clang preserves %rbx in x86-64 mode and there is the appropriate comment:
$ cat pepper_canary/toolchain/linux_pnacl/lib/clang/3.7.0/include/cpuid.h
...
/* x86-64 uses %rbx as the base register, so preserve it. */
...
__asm(" xchgq %%rbx,%q1\n" \
...
but GCC does the opposite:
$ cat pepper_canary/toolchain/linux_x86_glibc/lib/gcc/x86_64-nacl/4.4.3/include/cpuid.h
...
#if defined(__i386__) && defined(__PIC__)
/* %ebx may be the PIC register. */
...
__asm__ ("xchg{l}\t{%%}ebx, %1\n\t"
...
They couldn't both be right and still be compatible, so... which compiler does it wrong?