For each component of a vector type, result[`i`] = if MSB of `c`[`i`] is set ? `b`[`i`] : `a`[`i`]. For scalar type, result = `c` ? `b` : `a`.

``````gentype select(gentype a,
gentype b,
igentype c)

gentype select(gentype a,
gentype b,
ugentype c)``````
```halfn select (halfn a, halfn b,
shortn c)      // if half extension enabled

halfn select (halfn a, halfn b,
ushortn c)      // if half extension enabled```

## Description

For each component of a vector type, result[`i`] = if MSB of `c`[`i`] is set ? `b`[`i`] : `a`[`i`].

For scalar type, result = `c` ? `b` : `a`.

`igentype` and `ugentype` must have the same number of elements and bits as `gentype`.

 Note The above definition means that the behavior of select and the ternary operator for vector and scalar types is dependent on different interpretations of the bit pattern of `c`.

General information about relational functions:

The argment type `gentype` can be `char`, `charn`, `uchar`, `ucharn`, `short`, `shortn`, `ushort`, `ushortn`, `int`, `intn`, `uint`, `uintn`, `long`, `longn`, `ulong`, `ulongn`, `float`, `floatn`, `double`, and `doublen`.

The argument type `igentype` refers to the built-in signed integer types, i.e. `char`, `charn`, `short`, `shortn`, `int`, `intn`, `long`, and `longn`. n is 2, 3, 4, 8, or 16.

The argument type `ugentype` refers to the built-in unsigned integer types, i.e. `uchar`, `ucharn`, `ushort`, `ushortn`, `uint`, `uintn`, `ulong`, and `ulongn`. n is 2, 3, 4, 8, or 16.

If an implementation extends this specification to support IEEE-754 flags or exceptions, then all built-in relational functions shall proceed without raising the `invalid` floating-point exception when one or more of the operands are NaNs.

The built-in relational functions are extended with `cl_khr_fp16` to include versions that take `half`, and `half{2|3|4|8|16}` as arguments.