FLAGS / EFLAGS是clobber列表的“CC”(条件控制)的一部分吗?

时间:2014-02-04 02:33:56

标签: assembly syntax x86 inline-assembly rdrand

这是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
    ...
}

FLAGSEFLAGS寄存器是否被视为条件控制的一部分,以便将正确的信息传达给编译器?以上是否应写为:

__asm__ volatile(
    "rdrand %0 ; setc %1"
    : "=r" (val), "=qm" (rc)
    :
    : "cc"
);

或者使用"cc"虚假?

我知道如果不需要它可以使用它是无害的。来自Extended ASM

  

如果汇编指令可以改变条件代码寄存器,   将'cc'添加到被破坏的寄存器列表中。 GCC在某些机器上   表示条件代码作为特定的硬件寄存器; “抄送”   用来命名这个寄存器。在其他机器上,条件代码是   处理方式不同,指定'cc'无效。但它是   无论什么机器都有效。

如果它是虚假的,它适用于哪些架构? (我假设ARM和CPSR寄存器,但我可能会弄错。)

1 个答案:

答案 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而不是假设它们,它们将符合文档,即使这不太可能。