On Thu, Oct 11, 2012 at 11:25 AM, Marc Glisse <marc.gli...@inria.fr> wrote:
> Hello,
>
> this documents both my latest C++ FE patch, something I noticed while doing
> the FE work (shifts can mix vectors and scalars) and the result of the
> conversation with Richard B on how the middle-end should model vector truth
> values. The patch is a little early compared to the code (VEC_COND_EXPR
> still requires a comparison as first argument) but that shouldn't take too
> long to fix and it documents the intent.

Ok.

Many thanks,
Richard.

> 2012-10-11  Marc Glisse  <marc.gli...@inria.fr>
>
>         * doc/extend.texi (Vector Extensions): C++ improvements.
>         * doc/generic.texi (LSHIFT_EXPR, RSHIFT_EXPR): Mixed vector-scalar.
>         (LT_EXPR, LE_EXPR, GT_EXPR, GE_EXPR, EQ_EXPR, NE_EXPR): Specify
>         the vector case.
>         (VEC_COND_EXPR): Document it.
>
> --
> Marc Glisse
> Index: doc/generic.texi
> ===================================================================
> --- doc/generic.texi    (revision 192348)
> +++ doc/generic.texi    (working copy)
> @@ -1381,21 +1381,22 @@ a fixed-point value to a floating-point
>
>  @item LSHIFT_EXPR
>  @itemx RSHIFT_EXPR
>  These nodes represent left and right shifts, respectively.  The first
>  operand is the value to shift; it will always be of integral type.  The
>  second operand is an expression for the number of bits by which to
>  shift.  Right shift should be treated as arithmetic, i.e., the
>  high-order bits should be zero-filled when the expression has unsigned
>  type and filled with the sign bit when the expression has signed type.
>  Note that the result is undefined if the second operand is larger
> -than or equal to the first operand's type size.
> +than or equal to the first operand's type size. Unlike most nodes, these
> +can have a vector as first operand and a scalar as second operand.
>
>
>  @item BIT_IOR_EXPR
>  @itemx BIT_XOR_EXPR
>  @itemx BIT_AND_EXPR
>  These nodes represent bitwise inclusive or, bitwise exclusive or, and
>  bitwise and, respectively.  Both operands will always have integral
>  type.
>
>  @item TRUTH_ANDIF_EXPR
> @@ -1475,25 +1476,26 @@ allows the backend to choose between the
>  @code{CEIL_DIV_EXPR} and @code{FLOOR_DIV_EXPR} for the current target.
>
>  @item LT_EXPR
>  @itemx LE_EXPR
>  @itemx GT_EXPR
>  @itemx GE_EXPR
>  @itemx EQ_EXPR
>  @itemx NE_EXPR
>  These nodes represent the less than, less than or equal to, greater
>  than, greater than or equal to, equal, and not equal comparison
> -operators.  The first and second operand with either be both of integral
> -type or both of floating type.  The result type of these expressions
> -will always be of integral or boolean type.  These operations return
> -the result type's zero value for false, and the result type's one value
> -for true.
> +operators.  The first and second operands will either be both of integral
> +type, both of floating type or both of vector type.  The result type of
> +these expressions will always be of integral, boolean or signed integral
> +vector type.  These operations return the result type's zero value for
> +false, the result type's one value for true, and a vector whose elements
> +are zero (false) or minus one (true) for vectors.
>
>  For floating point comparisons, if we honor IEEE NaNs and either operand
>  is NaN, then @code{NE_EXPR} always returns true and the remaining operators
>  always return false.  On some targets, comparisons against an IEEE NaN,
>  other than equality and inequality, may generate a floating point
> exception.
>
>  @item ORDERED_EXPR
>  @itemx UNORDERED_EXPR
>  These nodes represent non-trapping ordered and unordered comparison
>  operators.  These operations take two floating point operands and
> @@ -1762,20 +1764,31 @@ is half as wide.  The elements of the tw
>  (concatenated) to form the output vector.
>
>  @item VEC_PACK_FIX_TRUNC_EXPR
>  This node represents packing of elements of the two input vectors into the
>  output vector, where the values are converted from floating point
>  to fixed point.  Input operands are vectors that contain the same number
>  of elements of a floating point type.  The result is a vector that contains
>  twice as many elements of an integral type whose size is half as wide.  The
>  elements of the two vectors are merged (concatenated) to form the output
>  vector.
> +
> +@item VEC_COND_EXPR
> +These nodes represent @code{?:} expressions.  The three operands must be
> +vectors of the same size and number of elements.  The second and third
> +operands must have the same type as the entire expression.  The first
> +operand is of signed integral vector type.  If an element of the first
> +operand evaluates to a zero value, the corresponding element of the
> +result is taken from the third operand. If it evaluates to a minus one
> +value, it is taken from the second operand. It should never evaluate to
> +any other value. In contrast with a @code{COND_EXPR}, all operands are
> +always evaluated.
>  @end table
>
>
>  @c ---------------------------------------------------------------------
>  @c Statements
>  @c ---------------------------------------------------------------------
>
>  @node Statements
>  @section Statements
>  @cindex Statements
> Index: doc/extend.texi
> ===================================================================
> --- doc/extend.texi     (revision 192348)
> +++ doc/extend.texi     (working copy)
> @@ -6857,21 +6857,21 @@ operate in a similar manner.  Likewise,
>  minus or complement operators on a vector type is a vector whose
>  elements are the negative or complemented values of the corresponding
>  elements in the operand.
>
>  It is possible to use shifting operators @code{<<}, @code{>>} on
>  integer-type vectors. The operation is defined as following: @code{@{a0,
>  a1, @dots{}, an@} >> @{b0, b1, @dots{}, bn@} == @{a0 >> b0, a1 >> b1,
>  @dots{}, an >> bn@}}@. Vector operands must have the same number of
>  elements.
>
> -For the convenience in C it is allowed to use a binary vector operation
> +For convenience, it is allowed to use a binary vector operation
>  where one operand is a scalar. In that case the compiler will transform
>  the scalar operand into a vector where each element is the scalar from
>  the operation. The transformation will happen only if the scalar could be
>  safely converted to the vector-element type.
>  Consider the following code.
>
>  @smallexample
>  typedef int v4si __attribute__ ((vector_size (16)));
>
>  v4si a, b, c;
>

Reply via email to