Gerald, are you ok with this version? Jason's approval is conditional to your opinion ;-)

On Tue, 31 Dec 2013, Marc Glisse wrote:

On Mon, 2 Dec 2013, Gerald Pfeifer wrote:

On Mon, 2 Dec 2013, Marc Glisse wrote:
Index: doc/extend.texi
===================================================================
+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}

Why "same size and number of elements" in the above?  What is the
difference between these two?
(on x86_64)
A vector of 4 int and a vector of 4 long have the same number of elements but
not the same size.
A vector of 8 int and a vector of 4 long have the same size but not the same
number of elements.

For semantics, we want the same number of elements. To match the
hardware, we want the same size.

Ah, so it was good I asked. :-)  Thanks for your explanation.

It seems the way this is intended is
 integer vector of the (same size and number of elements) as
whereas I parsed it as
 (integer vector of the same size) and (number of elements) as
hence wondering what the difference between the size of the vector and
the number of elements was.

I think you had parsed it ok. In code terms:
size: sizeof(vec)
number of elements: sizeof(vec)/sizeof(vec[0])

Now when the number of elements is fixed, saying that vectors have the same (total) size or that they have elements of the same size is equivalent, so any interpretation is fine.

Rephrasing this as "the same number and size of elements as" or better
"the same number of elements of the same size as" may help avoid this.

Ok. Like this then?

+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 with the same number of elements of the same size 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}.

(though arguably one could parse this to mean that the elements of a
have the same size as the whole vector b, but I am fine with ignoring
this)

--
Marc Glisse

Reply via email to