This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Memory outputs in inline asm
- From: Andrew Haley <aph at redhat dot com>
- To: Richard Biener <richard dot guenther at gmail dot com>
- Cc: "gcc at gcc dot gnu dot org" <gcc at gcc dot gnu dot org>
- Date: Wed, 26 Feb 2014 11:10:27 +0000
- Subject: Re: Memory outputs in inline asm
- Authentication-results: sourceware.org; auth=none
- References: <530DC2D3 dot 9030301 at redhat dot com> <CAFiYyc1yLSCMpKYtfXOdskBfNNpSeRS953BEmQt=6EhtDGggQg at mail dot gmail dot com>
On 02/26/2014 10:51 AM, Richard Biener wrote:
> But yes, technically you write p[0] here but as "m" merely builds
> an address to the memory I'd say that we have to treat any "m"
> operand as possibly reading from / writing to / clobbering the
> whole object that can be refered to using that address.
I think so too.
> Anything else would need extra syntax to specify a memory
> range that is accessed.
>
> And yes, I probably should implement at least basic disambiguation
> against memory accessing asm()s ;)
>
> Summary: I consider your asm ok without changes. Does documentation
> tell you otherwise? Did you run into optimization issues?
Yes. Here is my original test case that zeroes a block of memory:
int main() {
int arr[20];
int *p = (int*)arr;
int len = 20;
__asm__("\t0:\n"
"\tstr wzr, [%2, #4]!\n"
"\tsub %1, %1, #1\n"
"\tcbnz %1, 0b\n"
: "=m"(*p), "+r"(len) : "r"(p));
return p[5];
}
and here is the code GCC emits for main:
main:
sub sp, sp, #80
ldr w0, [sp,20]
add sp, sp, 80
ret
If I change "=m"(*p) to "=m"(p[5]) I get this:
main:
sub sp, sp, #80
mov x1, sp
mov w0, 20
#APP
// 7 "t.c" 1
0:
str wzr, [x1, #4]!
sub x0, x0, #1
cbnz x0, 0b
// 0 "" 2
#NO_APP
ldr w0, [sp,20]
add sp, sp, 80
ret
This has all come up because of questions on gcc-help and because I've been
looking at improving the documentation of inline asm.
If my kludge involving a struct that contains a zero-length array is
supposed to work, we can document it.
Andrew.