optabs.def (movmem_optab): Add movmem back for memmove().
2019-07-02 Aaron Sawdey <acsawdey@linux.ibm.com> * optabs.def (movmem_optab): Add movmem back for memmove(). * doc/md.texi: Add description of movmem pattern for overlapping move. From-SVN: r272946
This commit is contained in:
parent
e2790e1eab
commit
02e3025e17
2 changed files with 37 additions and 0 deletions
|
@ -6237,6 +6237,42 @@ to the possibility that the source and destination strings might
|
|||
overlap. These patterns are used to do inline expansion of
|
||||
@code{__builtin_memcpy}.
|
||||
|
||||
@cindex @code{movmem@var{m}} instruction pattern
|
||||
@item @samp{movmem@var{m}}
|
||||
Block move instruction. The destination and source blocks of memory
|
||||
are the first two operands, and both are @code{mem:BLK}s with an
|
||||
address in mode @code{Pmode}.
|
||||
|
||||
The number of bytes to copy is the third operand, in mode @var{m}.
|
||||
Usually, you specify @code{Pmode} for @var{m}. However, if you can
|
||||
generate better code knowing the range of valid lengths is smaller than
|
||||
those representable in a full Pmode pointer, you should provide
|
||||
a pattern with a
|
||||
mode corresponding to the range of values you can handle efficiently
|
||||
(e.g., @code{QImode} for values in the range 0--127; note we avoid numbers
|
||||
that appear negative) and also a pattern with @code{Pmode}.
|
||||
|
||||
The fourth operand is the known shared alignment of the source and
|
||||
destination, in the form of a @code{const_int} rtx. Thus, if the
|
||||
compiler knows that both source and destination are word-aligned,
|
||||
it may provide the value 4 for this operand.
|
||||
|
||||
Optional operands 5 and 6 specify expected alignment and size of block
|
||||
respectively. The expected alignment differs from alignment in operand 4
|
||||
in a way that the blocks are not required to be aligned according to it in
|
||||
all cases. This expected alignment is also in bytes, just like operand 4.
|
||||
Expected size, when unknown, is set to @code{(const_int -1)}.
|
||||
|
||||
Descriptions of multiple @code{movmem@var{m}} patterns can only be
|
||||
beneficial if the patterns for smaller modes have fewer restrictions
|
||||
on their first, second and fourth operands. Note that the mode @var{m}
|
||||
in @code{movmem@var{m}} does not impose any restriction on the mode of
|
||||
individually copied data units in the block.
|
||||
|
||||
The @code{movmem@var{m}} patterns must correctly handle the case where
|
||||
the source and destination strings overlap. These patterns are used to
|
||||
do inline expansion of @code{__builtin_memmove}.
|
||||
|
||||
@cindex @code{movstr} instruction pattern
|
||||
@item @samp{movstr}
|
||||
String copy instruction, with @code{stpcpy} semantics. Operand 0 is
|
||||
|
|
|
@ -257,6 +257,7 @@ OPTAB_D (cmpmem_optab, "cmpmem$a")
|
|||
OPTAB_D (cmpstr_optab, "cmpstr$a")
|
||||
OPTAB_D (cmpstrn_optab, "cmpstrn$a")
|
||||
OPTAB_D (cpymem_optab, "cpymem$a")
|
||||
OPTAB_D (movmem_optab, "movmem$a")
|
||||
OPTAB_D (setmem_optab, "setmem$a")
|
||||
OPTAB_D (strlen_optab, "strlen$a")
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue