why the barrier() can not take effect?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

    According to the gcc's manual, in an extended assembly statement,
if the string "memory" is added to the list of of clobbered registers,
it will cause "gcc to not keep memory values cached in registers
across the assembler instrution and not optimize stores or loads to
that memory". To this end, IMO, after this kind of statement all
values cached in registers should be write into the corresponding
memory locations. But, the following example illustrates some
different thing.

#define barrier() __asm__ __volatile__("": : :"memory")

int main()
{
    int i, n;
    int s = 0;

    scanf("%d", &n);
    for (i = 0; i < n; i++)
         s += i;
    barrier();
    printf("%d\n", s);

    return 0;
}

# gcc -S -O tst.c

We get the assembly code like this:

       leal    -8(%ebp), %eax
       pushl   %eax
       pushl   $.LC0
       call    scanf
       movl    -8(%ebp), %edx   <--- cache n into edx
    addl    $16, %esp
       testl   %edx, %edx
       jg      .L2
       movl    $0, %ecx
       jmp     .L4
.L2:
       movl    $0, %eax       <--- cache i into eax
    movl    $0, %ecx       <---  cache s into ecx
.L5:
       addl    %eax, %ecx
       incl    %eax
    cmpl    %eax, %edx
       jne     .L5
.L4:
<--- at this point, I think the barrier() will cause the values cached
in edx, eax and ecx will be write back to n, i, and s, respectively.
But, this is not really the case.

       subl    $8, %esp
       pushl   %ecx
    pushl   $.LC1
       call    printf

Maybe there is some misunderstanding about the role of the string
"memory" in a clobbered list. Is that so?


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux