4

这是对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"spurious?

我知道在不需要时使用它是无害的。从扩展 ASM

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

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

4

1 回答 1

3

根据手册,是的 -cc被破坏了。RDRAND还设置 OF、SF、ZF、AF、PF <- 0。

实际上,gcc 假定一个__asm__总是破坏 x86的[E|R]FLAGS条件代码寄存器。我没有参考资料,但您可以longlong.h在各种 GNU 软件包中使用的标头等地方看到这种假设。

正如你所说,如果不使用它是无害的。出于这个原因,您不妨将其包括在内,因为它仍然提供语义意图,或者最坏的情况下提供评论。还要考虑 Clang 和 ICC 实现 GCC asm 语法,如果他们尊重 clobber,他们将符合文档"cc",而不是假设它 - 即使这不太可能。

于 2014-02-04T12:06:42.667 回答