Messages in this thread | | | Date | Mon, 08 Dec 2003 21:37:33 -0800 | From | "H. Peter Anvin" <> | Subject | Re: const versus __attribute__((const)) |
| |
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/
| |