diff options
author | Kewen Lin <linkw@linux.ibm.com> | 2020-07-08 02:33:03 -0500 |
---|---|---|
committer | Kewen Lin <linkw@linux.ibm.com> | 2020-07-08 02:33:03 -0500 |
commit | d496134a6b1ef1314c18bd316d8c1900158beae9 (patch) | |
tree | bfad76449eb2f1afa06e3972465080f82030f2e7 /gcc/doc | |
parent | c832cf1c1d114aed70c2f84566cf4d63de0a56d0 (diff) | |
download | gcc-d496134a6b1ef1314c18bd316d8c1900158beae9.zip gcc-d496134a6b1ef1314c18bd316d8c1900158beae9.tar.gz gcc-d496134a6b1ef1314c18bd316d8c1900158beae9.tar.bz2 |
IFN/optabs: Support vector load/store with length
This patch is to add the internal function and optabs support for
vector load/store with length.
For the vector load/store with length optab, the length item would
be measured in lanes by default. For the targets which support
length measured in bytes like Power, they should only define VnQI
modes to wrap the other same size vector modes. If the length is
larger than total lane/byte count of the given mode, the behavior
is undefined. For the remaining lanes/bytes which isn't specified
by length, they would be taken as undefined value.
gcc/ChangeLog:
* doc/md.texi (len_load_@var{m}): Document.
(len_store_@var{m}): Likewise.
* internal-fn.c (len_load_direct): New macro.
(len_store_direct): Likewise.
(expand_len_load_optab_fn): Likewise.
(expand_len_store_optab_fn): Likewise.
(direct_len_load_optab_supported_p): Likewise.
(direct_len_store_optab_supported_p): Likewise.
(expand_mask_load_optab_fn): New macro. Original renamed to ...
(expand_partial_load_optab_fn): ... here. Add handlings for
len_load_optab.
(expand_mask_store_optab_fn): New macro. Original renamed to ...
(expand_partial_store_optab_fn): ... here. Add handlings for
len_store_optab.
(internal_load_fn_p): Handle IFN_LEN_LOAD.
(internal_store_fn_p): Handle IFN_LEN_STORE.
(internal_fn_stored_value_index): Handle IFN_LEN_STORE.
* internal-fn.def (LEN_LOAD): New internal function.
(LEN_STORE): Likewise.
* optabs.def (len_load_optab, len_store_optab): New optab.
Diffstat (limited to 'gcc/doc')
-rw-r--r-- | gcc/doc/md.texi | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/gcc/doc/md.texi b/gcc/doc/md.texi index 2c67c81..2b46286 100644 --- a/gcc/doc/md.texi +++ b/gcc/doc/md.texi @@ -5167,6 +5167,32 @@ mode @var{n}. This pattern is not allowed to @code{FAIL}. +@cindex @code{len_load_@var{m}} instruction pattern +@item @samp{len_load_@var{m}} +Load the number of vector elements specified by operand 2 from memory +operand 1 into vector register operand 0, setting the other elements of +operand 0 to undefined values. Operands 0 and 1 have mode @var{m}, +which must be a vector mode. Operand 2 has whichever integer mode the +target prefers. If operand 2 exceeds the number of elements in mode +@var{m}, the behavior is undefined. If the target prefers the length +to be measured in bytes rather than elements, it should only implement +this pattern for vectors of @code{QI} elements. + +This pattern is not allowed to @code{FAIL}. + +@cindex @code{len_store_@var{m}} instruction pattern +@item @samp{len_store_@var{m}} +Store the number of vector elements specified by operand 2 from vector +register operand 1 into memory operand 0, leaving the other elements of +operand 0 unchanged. Operands 0 and 1 have mode @var{m}, which must be +a vector mode. Operand 2 has whichever integer mode the target prefers. +If operand 2 exceeds the number of elements in mode @var{m}, the behavior +is undefined. If the target prefers the length to be measured in bytes +rather than elements, it should only implement this pattern for vectors +of @code{QI} elements. + +This pattern is not allowed to @code{FAIL}. + @cindex @code{vec_perm@var{m}} instruction pattern @item @samp{vec_perm@var{m}} Output a (variable) vector permutation. Operand 0 is the destination |