This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: vector conditional expression with scalar arguments
- From: Marc Glisse <marc dot glisse at inria dot fr>
- To: Gerald Pfeifer <gerald at pfeifer dot com>
- Cc: Jason Merrill <jason at redhat dot com>, gcc-patches at gcc dot gnu dot org
- Date: Fri, 23 Aug 2013 21:04:35 +0200 (CEST)
- Subject: Re: vector conditional expression with scalar arguments
- References: <alpine dot DEB dot 2 dot 02 dot 1307071343320 dot 31289 at stedding dot saclay dot inria dot fr> <51DAE2FE dot 1040707 at redhat dot com> <alpine dot DEB dot 2 dot 10 dot 1307081810170 dot 17629 at stedding dot saclay dot inria dot fr> <51DB7FA0 dot 8090601 at redhat dot com> <alpine dot DEB dot 2 dot 02 dot 1307132114160 dot 18427 at stedding dot saclay dot inria dot fr> <alpine dot LNX dot 2 dot 00 dot 1308041851180 dot 9767 at trevally dot site>
On Sun, 4 Aug 2013, Gerald Pfeifer wrote:
On Sat, 13 Jul 2013, Marc Glisse wrote:
2013-07-14 Marc Glisse <marc.glisse@inria.fr>
gcc/cp/
* call.c (build_conditional_expr_1): Handle the case with 1 vector
and 2 scalars. Call save_expr before building a vector.
* typeck.c (cp_build_binary_op): Check complain before complaining.
Shouldn't this be documented somewhere (gcc/doc/*.texi and our web based
release notes)?
Yes, it should. I had posted this some time ago:
http://gcc.gnu.org/ml/gcc-patches/2013-02/msg00664.html
Here is an updated version that also mentions the new scalar case:
2013-08-23 Marc Glisse <marc.glisse@inria.fr>
* doc/extend.texi (Vector Extensions): Document ?: in C++.
--
Marc Glisse
Index: doc/extend.texi
===================================================================
--- doc/extend.texi (revision 201948)
+++ doc/extend.texi (working copy)
@@ -7023,20 +7023,33 @@ otherwise. Consider the following exampl
typedef int v4si __attribute__ ((vector_size (16)));
v4si a = @{1,2,3,4@};
v4si b = @{3,2,1,4@};
v4si c;
c = a > b; /* The result would be @{0, 0,-1, 0@} */
c = a == b; /* The result would be @{0,-1, 0,-1@} */
@end smallexample
+In C++, the ternary operator @code{?:} is available. @code{a?b:c}, where
+@code{b} and @code{c} are vectors of the same type and @code{a} is an
+integer vector of the same size and number of elements as @code{b} and
+@code{c}, computes all three arguments and creates a vector
+@code{@{a[0]?b[0]:c[0], a[1]?b[1]:c[1], @dots{}@}}. Note that unlike in
+OpenCL, @code{a} is thus interpreted as @code{a != 0} and not @code{a < 0}.
+As in the case of binary operations, this syntax is also accepted when
+one of @code{b} or @code{c} is a scalar that is then transformed into a
+vector. If both @code{b} and @code{c} are scalars and the type of
+@code{true?b:c} has the same size as the element type of @code{a}, then
+@code{b} and @code{c} are converted to a vector type whose elements have
+this type and with the same number of elements as @code{a}.
+
Vector shuffling is available using functions
@code{__builtin_shuffle (vec, mask)} and
@code{__builtin_shuffle (vec0, vec1, mask)}.
Both functions construct a permutation of elements from one or two
vectors and return a vector of the same type as the input vector(s).
The @var{mask} is an integral vector with the same width (@var{W})
and element count (@var{N}) as the output vector.
The elements of the input vectors are numbered in memory ordering of
@var{vec0} beginning at 0 and @var{vec1} beginning at @var{N}. The