根据ARMv8 ISA:
CSET Wd, cond条件集:Wd = if cond then 1 else 0。
这意味着指令执行条件设置指令。什么是条件设置指令?
条件集:有条件地在 0 和 1 或 -1 之间进行选择,例如将条件标志具体化为通用寄存器中的布尔值或掩码。
您可以将其转换为简单的三元运算:Wd = cond ? 1 : 0. 所以,如果cond是true,Wd = 1。否则,Wd = 0。
什么是条件?
cond - 标准 ARM 条件 EQ、NE、CS|HS、CC|LO、MI、PL、VS、VC、HI、LS、GE、LT、GT、LE、AL 或 NV,与 AArch32 中的含义相同。请注意,尽管 AL 和 NV 表示不同的编码,但在 AArch32 中,它们都被解释为“始终为真”的条件。除非声明,否则 AArch64 指令不设置或使用条件标志,但会设置所有条件标志的指令。如果在伪代码表达式中使用,此符号表示一个布尔值,其值为指定条件测试的真值。
int yesOrNo(int value) {
return value != 0;
}
Run Code Online (Sandbox Code Playgroud)
英特尔:
0: 31 c0 xor %eax,%eax
2: 85 ff test %edi,%edi
4: 0f 95 c0 setne %al
7: c3 retq
Run Code Online (Sandbox Code Playgroud)
拇指模式下的手臂:
0: 1e43 subs r3, r0, #1
2: 4198 sbcs r0, r3
4: 4770 bx lr
Run Code Online (Sandbox Code Playgroud)
手臂模式:
0: e2900000 adds r0, r0, #0
4: 13a00001 movne r0, #1
8: e12fff1e bx lr
Run Code Online (Sandbox Code Playgroud)
aarch64:
0: 6b1f001f cmp w0, wzr
4: 1a9f07e0 cset w0, ne
8: d65f03c0 ret
Run Code Online (Sandbox Code Playgroud)
这要透明得多,而且在任何情况下都比上述任何一个都好