All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Zack Weinberg" <zack@codesourcery.com>
To: Richard Henderson <rth@redhat.com>
Cc: Andreas Jaeger <aj@suse.de>,
	libc-alpha@sources.redhat.com, linux-gcc@vger.kernel.org,
	gcc@gcc.gnu.org
Subject: Re: i386 inline-asm string functions - some questions
Date: Sat, 27 Dec 2003 10:38:49 -0800	[thread overview]
Message-ID: <87brpum7gm.fsf@egil.codesourcery.com> (raw)
In-Reply-To: <20031227163540.B6728@zzz.ward.six> (Denis Zaitsev's message of "Sat, 27 Dec 2003 16:35:40 +0500")

Denis Zaitsev <zzz@anda.ru> writes:

>> so, first off, I don't think this kind of optimization is libc's
>> business; we have the tools to do a better job over here in the
>> compiler.
>
> Should the compiler implement all the string functions?

That is the trend.  The compiler can make a better decision about
whether memcpy (for example) should be inlined at all, if it knows the
properties.  If it does decide to inline a general memcpy algorithm,
it doesn't have to treat it as a giant opaque block of assembly
language, not to be modified.  It can schedule other things
simultaneously, if that's a good move; it can prove that some of the
insns are unnecessary and eliminate them; etc. etc.

> Very probably not.  But anyway, then these problem will be inside
> the compiler (again).

No; we have more flexible ways of expressing this sort of thing inside
the compiler.

>> And furthermore I think it's buggy - if the block to be copied is
>> large and not aligned, it will overwrite memory past the end of the
>> destination.
>
> Why do you think so?  The code looks ok.  I don't think it's the
> fastest one, but it's correct.

I misunderstood the consequences of doing rep movsl with unaligned
pointers.  It just does lots of slow misaligned memory accesses; it
doesn't overwrite memory outside the destination block.

>> @ is a character not otherwise used in constraints; it means 'the
>> value here is a pointer and the memory pointed to will be accessed'.
>
> Why isn't it documented?  Is it a kind of "new" one?

I just made it up.  It is not implemented at present, nor will it
necessarily _be_ implemented.  I was making a suggestion for a better
way to write this stuff.

> (The only remark is - it must be "+@&S" etc., there are the
> earlyclobbered operands.)

There are now only three operands and they have non-overlapping
register classes, so & is not necessary.

> Does this "@" behaves as well with unrestricted pointers like just
> (char *s)?

The less information the compiler has about the pointer, the more
memory it would have to assume is modified.  At worst, "@" should
be equivalent to clobbering "memory".

> I've just tried this (on mine examples, with unrestricted pointers).
> The things seem to be fine.  Not ideal (reloading suffers sometimes,
> but this is not the @-specific problem), but completely free of the
> problems introduced by "m".

Please remember that "m" (extension struct blah blah __dest) was
written in the original for a reason.  You're not going to see it in
simple test cases, but the compiler has to be told that the asm
statement modifies memory, or it *will* mis-optimize around it. My
example code, with no meaning implemented for "@", is like that.

The point of the original construct was to tell the compiler exactly
what blocks of memory were modified.  This turns out to have
undesirable side effects, which we're trying to get around here, but
let's not forget what the original point was.  If there weren't cases
where clobbering "memory" caused poor optimization, no one would have
bothered with the "m" mess in the first place.

zw

  reply	other threads:[~2003-12-27 18:38 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-12-25  0:20 i386 inline-asm string functions - some questions Denis Zaitsev
2003-12-25  0:38 ` Richard Henderson
2003-12-25  1:15   ` Denis Zaitsev
2003-12-25  1:21     ` Zack Weinberg
2003-12-25  1:45       ` Denis Zaitsev
2003-12-26  3:40         ` Zack Weinberg
2003-12-27  4:58           ` Richard Henderson
2003-12-27 10:24             ` Zack Weinberg
2003-12-27 11:35               ` Denis Zaitsev
2003-12-27 18:38                 ` Zack Weinberg [this message]
2003-12-28 20:58                   ` Denis Zaitsev
2003-12-29  2:22                     ` Zack Weinberg
2003-12-29  2:44                       ` Denis Zaitsev
2003-12-29  2:46                         ` Zack Weinberg
2003-12-29  2:53                           ` Denis Zaitsev
2003-12-29  3:35                       ` Ulrich Drepper
2003-12-29  3:54                         ` Andrew Pinski
2003-12-29  6:57                           ` Jakub Jelinek
2003-12-29  3:56                         ` Zack Weinberg
2003-12-29  5:31                           ` Daniel Jacobowitz
2003-12-29  5:55                             ` Zack Weinberg
2003-12-29 18:37                             ` Denis Zaitsev
2003-12-29 19:09                               ` Zack Weinberg
2003-12-29 19:31                                 ` Denis Zaitsev
2003-12-29 19:37                                   ` Denis Zaitsev
2003-12-29 18:51                           ` Denis Zaitsev
2003-12-29 19:15                             ` Zack Weinberg
2003-12-27 10:52           ` Denis Zaitsev
     [not found]   ` <20031225060850.C7419@zzz.ward.six>
     [not found]     ` <20031225012711.GD13447@redhat.com>
2003-12-25  1:38       ` Denis Zaitsev
2003-12-25  1:53         ` Richard Henderson
2003-12-25  2:08           ` Denis Zaitsev
2003-12-25  0:39 ` Roland McGrath
2003-12-25  1:13   ` Denis Zaitsev

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87brpum7gm.fsf@egil.codesourcery.com \
    --to=zack@codesourcery.com \
    --cc=aj@suse.de \
    --cc=gcc@gcc.gnu.org \
    --cc=libc-alpha@sources.redhat.com \
    --cc=linux-gcc@vger.kernel.org \
    --cc=rth@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.