这是What is "=qm" in extended assembler的后续行动。
使用RDRAND
时,它会设置(或取消设置)进位标记(CF
):
char rc;
unsigned int val;
__asm__ volatile(
"rdrand %0 ; setc %1"
: "=r" (val), "=qm" (rc)
);
// 1 = success, 0 = underflow
if(rc) {
// use val
...
}
FLAGS
和EFLAGS
寄存器是否被视为条件控制的一部分,以便将正确的信息传达给编译器?以上是否应写为:
__asm__ volatile(
"rdrand %0 ; setc %1"
: "=r" (val), "=qm" (rc)
:
: "cc"
);
或者使用"cc"
虚假?
我知道如果不需要它可以使用它是无害的。来自Extended ASM:
如果汇编指令可以改变条件代码寄存器, 将'cc'添加到被破坏的寄存器列表中。 GCC在某些机器上 表示条件代码作为特定的硬件寄存器; “抄送” 用来命名这个寄存器。在其他机器上,条件代码是 处理方式不同,指定'cc'无效。但它是 无论什么机器都有效。
如果它是虚假的,它适用于哪些架构? (我假设ARM和CPSR
寄存器,但我可能会弄错。)
答案 0 :(得分:3)
根据手册,是 - cc
被破坏了。 RDRAND
还设置OF,SF,ZF,AF,PF <-0
实际上,gcc假设__asm__
块总是破坏x86的[E|R]FLAGS
条件代码寄存器。我没有引用,但您可以在各种GNU包中使用的longlong.h
标头等地方看到此假设。
正如你所说,如果不使用,它就是无害的。出于这个原因,您可能也包括它,因为它仍然提供语义意图或最坏的评论。还要考虑Clang和ICC实现GCC asm语法,如果他们尊重"cc"
clobber而不是假设它们,它们将符合文档,即使这不太可能。