views:

124

answers:

2

Hi, I came across this inline asm. I am not sure how it should look without this syntax... Could someone show it to me?

__asm__ volatile ("lock\n\tincl %0"
        :"=m"(llvm_cbe_tmp__29)
        :"m"(*(llvm_cbe_tmp__29))"cc");
+4  A: 
lock
incl   llvm_cbe_tmp__29

However, because the operand is specified abstractly, the compiler will generate the code needed to reference it, even if that means a load and store. As a result it is possible that more than two instructions or an addressing mode will be added.

DigitalRoss
+3  A: 

Using gcc -S on this:

int main()
{
    int *p;
    asm volatile ("lock\n\tincl %0":"=m"(p):"m"(*(p)):"cc");
}

gives

   .type   main, @function
main:
    leal    4(%esp), %ecx
    andl    $-16, %esp
    pushl   -4(%ecx)
    pushl   %ebp
    movl    %esp, %ebp
    pushl   %ecx
    subl    $20, %esp
    movl    -8(%ebp), %eax
#APP
# 4 "asm.c" 1
    lock
    incl -8(%ebp)
# 0 "" 2
#NO_APP
    addl    $20, %esp
    popl    %ecx
    popl    %ebp
    leal    -4(%ecx), %esp
    ret
Richard Pennington