**GNU Compiler Collection (GCC) Internals**

## 8.11 Vector Operations

All normal RTL expressions can be used with vector modes; they are
interpreted as operating on each part of the vector independently.
Additionally, there are a few new expressions to describe specific vector
operations.

`(vec_merge:``m` `vec1` `vec2` `items`)

- This describes a merge operation between two vectors. The result is a vector
of mode
`m`; its elements are selected from either `vec1` or
`vec2`. Which elements are selected is described by `items`, which
is a bit mask represented by a `const_int`

; a zero bit indicates the
corresponding element in the result vector is taken from `vec2` while
a set bit indicates it is taken from `vec1`.

`(vec_select:``m` `vec1` `selection`)

- This describes an operation that selects parts of a vector.
`vec1` is
the source vector, `selection` is a `parallel`

that contains a
`const_int`

for each of the subparts of the result vector, giving the
number of the source subpart that should be stored into it.

`(vec_concat:``m` `vec1` `vec2`)

- Describes a vector concat operation. The result is a concatenation of the
vectors
`vec1` and `vec2`; its length is the sum of the lengths of
the two inputs.

`(vec_const:``m` `subparts`)

- This describes a constant vector.
`subparts` is a `parallel`

that
contains a constant for each of the subparts of the vector.

`(vec_duplicate:``m` `vec`)

- This operation converts a small vector into a larger one by duplicating the
input values. The output vector mode must have the same submodes as the
input vector mode, and the number of output parts must be an integer multiple
of the number of input parts.