这是对扩展汇编程序中的"=qm“是什么的跟进。
当使用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"的使用是虚假的?
我知道在没有必要的情况下使用它是无害的。来自扩展ASM
如果您的汇编程序指令可以更改条件代码寄存器,请将‘cc’添加到失败寄存器列表中。某些机器上的GCC将条件代码表示为特定的硬件寄存器;“cc”用于命名此寄存器。在其他机器上,条件代码的处理方式不同,指定‘cc’没有任何效果。但不管机器是什么,它都是有效的。
如果它是假的,那么它适用于什么体系结构?(我猜想ARM和CPSR寄存器,但我可能弄错了)。
发布于 2014-02-04 12:06:42
根据手册,是的- cc被击倒了.RDRAND还设置了SF、ZF、AF、PF <- 0.
在实践中,gcc假设__asm__块总是破坏x86的[E|R]FLAGS条件代码寄存器。我没有引用,但是您可以在各种GNU包中使用的longlong.h头之类的地方看到这种假设。
正如你所说,如果不使用,它是无害的。由于这个原因,您最好将其包括在内,因为它仍然提供语义意图,或者最坏的情况下提供评论。还请考虑一下,Clang和ICC实施GCC asm语法,如果他们遵守"cc" clobber,而不是假设它--尽管这是不太可能的--他们就会遵守文档。
https://stackoverflow.com/questions/21541968
复制相似问题