Re: const versus __attribute__((const))

H. Peter Anvin
2003-12-09T05:37:50Z

Jamie Lokier wrote:
> H. Peter Anvin wrote:
>
>>>It would be nice to have a way to declare an asm like "pure" not
>>>"const", so that it's allowed to read memory but multiple calls can be
>>>eliminated; I don't know of a way to express that.
>>
>>Just specify memory input operands.
>
>
> Thanks. That's even more useful than "pure" because it implies the
> asm only reads the explicitly passed memory operands.
>
> Memory input operands don't work if you want the asm to read arbitrary
> memory not mentioned in the inputs (like "pure" allows) or traverse
> linked lists.
>
> (A long time ago there was a question about whether GCC could ever
> copy the value associated with an "m" operand to a stack slot, and
> pass the address of the stack slot. After all, GCC _will_ copy the
> value if the operand is an "r", and presumably gives mixed results
> with "rm". We seem to have concluded that it never will).
>

Sure it will:

int foo(int x)
{
int y, z;

asm("movl %1,%0" : "=r" (y) : "r" (x));
asm("movl %1,%0" : "=r" (z) : "m" (y));

return z;
}

: smyrno 21 ; gcc -O2 -c testme.c
: smyrno 22 ; objdump -dr testme.o

testme.o: file format elf32-i386

Disassembly of section .text:

00000000 <foo>:
0: 55 push %ebp ; Make stack frame
1: 89 e5 mov %esp,%ebp ; d:o
3: 50 push %eax ; Allocate stack slot
4: 8b 45 08 mov 0x8(%ebp),%eax ; Copy to register
7: 89 c0 mov %eax,%eax ; First asm()
9: 89 45 fc mov %eax,0xfffffffc(%ebp) ; Copy to stack slot
c: 8b 45 fc mov 0xfffffffc(%ebp),%eax ; Second asm()
f: c9 leave ; Destroy stack frame
10: c3 ret