sel
SVE Select Elements
SEL <Zd>.<T>, <Pg>, <Zn>.<T>, <Zm>.<T>
Selects elements from Zn or Zm based on predicate.
Details
Conditionally selects elements from two source vectors based on a predicate mask, placing results in the destination vector. For each element, if the predicate bit is set, the element from Zn is selected; otherwise, the element from Zm is selected. Operates on elements of type T and no flags are affected. This is an AArch64-only SVE instruction.
Pseudocode Operation
for i = 0 to VL/esize-1
if Pg[i] then
Zd[i] ← Zn[i]
else
Zd[i] ← Zm[i]
Example
SEL z0.s.T, p0/m, z1.s.T, z2.s.T
Encoding
Binary Layout
00000101
size
1
Zm
11
Pv
Zn
Zd
Operands
-
Zd
Destination scalable vector register (SVE) -
Pg
Selector -
Zn
True Src -
Zm
False Src
Reference (Arm A64 ISA)
Instruction Forms
| Encoding | Instruction | ISA | Bit pattern | ||
|---|---|---|---|---|---|
| 0xC1208000 | SEL { <Zd1>.<T>-<Zd2>.<T> }, <PNg>, { <Zn1>.<T>-<Zn2>.<T> }, { <Zm1>.<T>-<Zm2>.<T> } | A64 | 11000001 | size | 1 | Zm | 0100 | PNg | Zn | 0 | Zd | 0 | ||
| 0xC1218000 | SEL { <Zd1>.<T>-<Zd4>.<T> }, <PNg>, { <Zn1>.<T>-<Zn4>.<T> }, { <Zm1>.<T>-<Zm4>.<T> } | A64 | 11000001 | size | 1 | Zm | 01100 | PNg | Zn | 00 | Zd | 00 | ||
| 0x25004210 | SEL <Pd>.B, <Pg>, <Pn>.B, <Pm>.B | A64 | 00100101 | 0 | 0 | 00 | Pm | 01 | Pg | 1 | Pn | 1 | Pd | ||
| 0x0520C000 | SEL <Zd>.<T>, <Pv>, <Zn>.<T>, <Zm>.<T> | A64 | 00000101 | size | 1 | Zm | 11 | Pv | Zn | Zd |
Description
Select elements from the first source vector where the corresponding vector select predicate element is true, and from the second source vector where the predicate element is false, placing them in the corresponding elements of the destination vector.
Operation
CheckSVEEnabled();
constant integer VL = CurrentVL;
constant integer PL = VL DIV 8;
constant integer elements = VL DIV esize;
bits(PL) mask = P[v, PL];
bits(VL) operand1 = if AnyActiveElement(mask, esize) then Z[n, VL] else Zeros(VL);
bits(VL) operand2 = if AnyActiveElement(NOT(mask), esize) then Z[m, VL] else Zeros(VL);
bits(VL) result;
for e = 0 to elements-1
if ActivePredicateElement(mask, e, esize) then
Elem[result, e, esize] = Elem[operand1, e, esize];
else
Elem[result, e, esize] = Elem[operand2, e, esize];
Z[d, VL] = result;