![]() | ||||||||||
Messages in this thread |
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
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
| |||||||||
| Last update: 2005-03-22 12:59 [from the cache] ©2003-2008 | ||||||||||