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.

Reply via email to