CSEL
Conditional Select returns, in the destination register, the value of the first source register if the condition is TRUE, and otherwise returns the value of the second source register.
如果条件为TRUE,则条件选择在目标寄存器中返回第一个源寄存器的值,否则返回第二个源寄存器。
sf 0 0 11010100 Rm cond 0 0 Rn Rd
31 30 29 28 27 26 25 24 23 22 21 20 16 15 12 11 10 9 5 4 0
32-bit variant
Applies when sf == 0.
CSEL <Wd>, <Wn>, <Wm>, <cond>
64-bit variant
Applies when sf == 1.
CSEL <Xd>, <Xn>, <Xm>, <cond>
Operation
bits(datasize) result;
bits(datasize) operand1 = X[n];
bits(datasize) operand2 = X[m];
if ConditionHolds(cond) then
result = operand1;
else
result = operand2;
X[d] = result;
CSEL <Xd>, <Xn>, <Xm>, <cond>
# 如果条件(cond)满足,就选择(sel) Xn 作为 Xd,否则选择 Xm 作为 Xd。
CSEL X0, X0, X1, ge
# 如果 cond (ge : greater or equal)成立,那么X0 = X0(保持不变),否则X0 = X1。
# 虽然比IT指令块的语法看起来要直观一些,但比起IT指令块能表达的层级关系,还是稍微弱了一点。
403400: 121d1003 and w3, w0, #0xf8
403404: 52800062 mov w2, #0x3 // #3
403408: 7103c07f cmp w3, #0xf0
40340c: 1a8213e2 csel w2, wzr, w2, ne // if w3!=0, w2=0; else w2=w2
403410: 17ffffef b 4033cc <ferror@plt+0x14ec>