4

拡張アセンブラの「=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レジスタを推測しますが、間違っている可能性があります)。

4

1 に答える 1

3

マニュアルによると、はい -cc破壊されています。RDRANDまた、OF、SF、ZF、AF、PF <- 0 を設定します。

__asm__実際には、gcc は、ブロックが常に[E|R]FLAGSx86 の条件コード レジスタを上書きすると想定しています。リファレンスはありませんが、longlong.hさまざまな GNU パッケージで使用されるヘッダーなどの場所でこの仮定を見ることができます。

おっしゃる通り、使わなければ無害です。そのため、セマンティックな意図、または最悪の場合でもコメントを提供するため、これを含めることもできます。また、Clang と ICC が GCC asm 構文を実装していることを考慮してください。また、Clang と ICC が"cc"clobber を仮定するのではなく、それを尊重する場合、ドキュメントに準拠していると考えてください。これはありそうもないことですが。

于 2014-02-04T12:06:42.667 に答える