diff options
author | Richard Sandiford <richard.sandiford@arm.com> | 2018-07-03 10:03:44 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2018-07-03 10:03:44 +0000 |
commit | 0267732baeb06ec100c1d610197bb88aae1c5123 (patch) | |
tree | 611c2aafe9c38ce62a4090cc7799136e0a16ad12 /gcc/doc | |
parent | 4ef79c960aa0967cf0298dc496a30a40d86ebd3c (diff) | |
download | gcc-0267732baeb06ec100c1d610197bb88aae1c5123.zip gcc-0267732baeb06ec100c1d610197bb88aae1c5123.tar.gz gcc-0267732baeb06ec100c1d610197bb88aae1c5123.tar.bz2 |
[16/n] PR85694: Add detection of averaging operations
This patch adds detection of average instructions:
a = (((wide) b + (wide) c) >> 1);
--> a = (wide) .AVG_FLOOR (b, c);
a = (((wide) b + (wide) c + 1) >> 1);
--> a = (wide) .AVG_CEIL (b, c);
in cases where users of "a" need only the low half of the result,
making the cast to (wide) redundant. The heavy lifting was done by
earlier patches.
This showed up another problem in vectorizable_call: if the call is a
pattern definition statement rather than the main pattern statement,
the type of vectorised call might be different from the type of the
original statement.
2018-07-03 Richard Sandiford <richard.sandiford@arm.com>
gcc/
PR tree-optimization/85694
* doc/md.texi (avgM3_floor, uavgM3_floor, avgM3_ceil)
(uavgM3_ceil): Document new optabs.
* doc/sourcebuild.texi (vect_avg_qi): Document new target selector.
* internal-fn.def (IFN_AVG_FLOOR, IFN_AVG_CEIL): New internal
functions.
* optabs.def (savg_floor_optab, uavg_floor_optab, savg_ceil_optab)
(savg_ceil_optab): New optabs.
* tree-vect-patterns.c (vect_recog_average_pattern): New function.
(vect_vect_recog_func_ptrs): Add it.
* tree-vect-stmts.c (vectorizable_call): Get the type of the zero
constant directly from the associated lhs.
gcc/testsuite/
PR tree-optimization/85694
* lib/target-supports.exp (check_effective_target_vect_avg_qi): New
proc.
* gcc.dg/vect/vect-avg-1.c: New test.
* gcc.dg/vect/vect-avg-2.c: Likewise.
* gcc.dg/vect/vect-avg-3.c: Likewise.
* gcc.dg/vect/vect-avg-4.c: Likewise.
* gcc.dg/vect/vect-avg-5.c: Likewise.
* gcc.dg/vect/vect-avg-6.c: Likewise.
* gcc.dg/vect/vect-avg-7.c: Likewise.
* gcc.dg/vect/vect-avg-8.c: Likewise.
* gcc.dg/vect/vect-avg-9.c: Likewise.
* gcc.dg/vect/vect-avg-10.c: Likewise.
* gcc.dg/vect/vect-avg-11.c: Likewise.
* gcc.dg/vect/vect-avg-12.c: Likewise.
* gcc.dg/vect/vect-avg-13.c: Likewise.
* gcc.dg/vect/vect-avg-14.c: Likewise.
From-SVN: r262335
Diffstat (limited to 'gcc/doc')
-rw-r--r-- | gcc/doc/md.texi | 28 | ||||
-rw-r--r-- | gcc/doc/sourcebuild.texi | 4 |
2 files changed, 32 insertions, 0 deletions
diff --git a/gcc/doc/md.texi b/gcc/doc/md.texi index 22919e4..09d6e30 100644 --- a/gcc/doc/md.texi +++ b/gcc/doc/md.texi @@ -5599,6 +5599,34 @@ Other shift and rotate instructions, analogous to the Vector shift and rotate instructions that take vectors as operand 2 instead of a scalar type. +@cindex @code{avg@var{m}3_floor} instruction pattern +@cindex @code{uavg@var{m}3_floor} instruction pattern +@item @samp{avg@var{m}3_floor} +@itemx @samp{uavg@var{m}3_floor} +Signed and unsigned average instructions. These instructions add +operands 1 and 2 without truncation, divide the result by 2, +round towards -Inf, and store the result in operand 0. This is +equivalent to the C code: +@smallexample +narrow op0, op1, op2; +@dots{} +op0 = (narrow) (((wide) op1 + (wide) op2) >> 1); +@end smallexample +where the sign of @samp{narrow} determines whether this is a signed +or unsigned operation. + +@cindex @code{avg@var{m}3_ceil} instruction pattern +@cindex @code{uavg@var{m}3_ceil} instruction pattern +@item @samp{avg@var{m}3_ceil} +@itemx @samp{uavg@var{m}3_ceil} +Like @samp{avg@var{m}3_floor} and @samp{uavg@var{m}3_floor}, but round +towards +Inf. This is equivalent to the C code: +@smallexample +narrow op0, op1, op2; +@dots{} +op0 = (narrow) (((wide) op1 + (wide) op2 + 1) >> 1); +@end smallexample + @cindex @code{bswap@var{m}2} instruction pattern @item @samp{bswap@var{m}2} Reverse the order of bytes of operand 1 and store the result in operand 0. diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi index d52183d..8915707 100644 --- a/gcc/doc/sourcebuild.texi +++ b/gcc/doc/sourcebuild.texi @@ -1417,6 +1417,10 @@ Target supports Fortran @code{real} kinds larger than @code{real(8)}. The target's ABI allows stack variables to be aligned to the preferred vector alignment. +@item vect_avg_qi +Target supports both signed and unsigned averaging operations on vectors +of bytes. + @item vect_condition Target supports vector conditional operations. |