H. Peter Anvin wrote: > Muli Ben-Yehuda wrote: >> Ok, let's try again: >> >> You're changing this (pageattr.c) >> >> asm volatile("clflush (%0)" :: "r" (adr + i)); >> >> into this: >> >> asm volatile("clflush %0" : "+m" (*(char __force*)(adr + i))); >> >> The original one calls clflush with (adr + i), the new one with (*(adr >> + i)). Are these calls equivalent? > > Yes, they are. The parentheses which are part of the old assembly > string has the same effect as the asterisk operator in C. > > The difference between the two is that the latter form allows the C > compiler to select the addressing mode, which allows the full range of > addressing modes, whereas the former forces it to use a single register > indirect. >
Just to be absolutely obvious about it: : tazenda 15 ; cat demo.c #define __force static inline void clflush1(volatile void *__p) { asm volatile("clflush %0" : "+m" (*(char __force *)__p)); } static inline void clflush2(volatile void *__p) { asm volatile("clflush (%0)" :: "r" (__p)); } void demo(void *q) { clflush1(q); clflush2(q); } : tazenda 16 ; gcc -m32 -O3 -S demo.c : tazenda 17 ; cat demo.s .file "demo.c" .text .p2align 4,,15 .globl demo .type demo, @function demo: pushl %ebp movl %esp, %ebp movl 8(%ebp), %eax #APP clflush (%eax) clflush (%eax) #NO_APP popl %ebp ret .size demo, .-demo .ident "GCC: (GNU) 4.1.2 20070626 (Red Hat 4.1.2-13)" .section .note.GNU-stack,"",@progbits - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/