Hi, On 12/15/2015 13:52, Bernd Schmidt wrote: > > On 12/14/2015 09:10 AM, Segher Boessenkool wrote: > > That, and adding a memory clobber degrades performance for a lot of > > existing basic asm that does not expect the clobber, e.g. asm(""), > > asm("#"), asm("nop"), ... > > I wonder about this. People keep bringing up "a lot of existing basic > asm" in general, but are there any known examples in real software?
Yes, there are, I see a few in our own tree: ./libatomic/config/x86/fenv.c: asm volatile ("fwait"); ./libcilkrts/runtime/config/x86/os-fence.h:# define __cilkrts_fence() __asm__ volatile ("lock addl $0,(%rsp)") ./libsanitizer/sanitizer_common/sanitizer_atomic_clang_x86.h: __asm__ __volatile__("pause"); ./libgfortran/config/fpu-387.h: __asm__ __volatile__ ("fwait"); ./libgcc/unwind-dw2.c: asm (""); ./libgcc/config/i386/sfp-exceptions.c: asm volatile ("fwait"); ./libgcc/config/lm32/_udivsi3.c: __asm__ __volatile__ ("mv ea, ra"); ./boehm-gc/include/private/gc_locks.h:# define GC_clear(addr) { asm("mb"); *(volatile unsigned *)addr = 0; } !! this one really needs memory clobber !! ./boehm-gc/include/private/gc_locks.h:# define GC_memory_barrier() asm("mb") ./boehm-gc/mach_dep.c: asm("pushl r11"); asm("calls $1,_GC_push_one"); .... Bernd.