This is the mail archive of the mailing list for the GCC project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: vector conditional expression with scalar arguments

On Sun, 4 Aug 2013, Gerald Pfeifer wrote:

On Sat, 13 Jul 2013, Marc Glisse wrote:
2013-07-14  Marc Glisse  <>

	* 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:

Here is an updated version that also mentions the new scalar case:

2013-08-23  Marc Glisse  <>

	* 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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]