1. ホーム
  2. assembly

[解決済み] ARMv8でリテラル0ではなく、xzrレジスタを使用するのはなぜですか?

2022-03-04 14:55:11

質問

を読んでいたのですが SVEホワイトペーパー ARMから、(SVEでない例で)奇妙なことに気がつきました。

mov x8, xzr

この xzr というレジスタがあったので調べてみると ARMの一部コンテンツ は、多くの文脈でゼロと同義であると述べています。

ということで、以下のようになります。 x8 がゼロに初期化されるのは、ループの直前で実行されるからです。 x8 はループカウンタとして使用されます。

私が理解できないのは、なぜリテラルな 0 の代わりに使用される xzr ? 例えば

mov x8, 0

要約すると、私の疑問は、なぜ人は xzr レジスタの代わりに、リテラルな 0 ここで?

解決方法は?

私は mov x8, xzrmov x8, #0 という比較は、何だか赤信号のような気がします。

old_timerさんの回答が示すように、エンコーディングの利得はありませんし、パイプラインの性能もほとんど、あるいは全く向上しない可能性が高いです(確かに私は確認したことはありませんが)。

xzr しかし、@InfinitelyManic さんの回答のようにダミーレジスタに加えて、0 値のオペランドにアクセスすることができます。 実レジスタをロードして占有することなく . これにより、命令が1つ減り、「実際の」データを保持するためのレジスタが1つ増えるという2つの利点があります。

が持つ重要な特性だと思います。 OPで紹介した「ARMのいくつかのコンテンツ」。 が指摘を怠っている。

ということなのです。 mov x8, xzrmov x8, #0 は赤信号である。 もし、ゼロにするのなら x8 を使用することは、その後にそれを変更することを意図しています。 xzr または #0 はかなり恣意的です(私なら #0 の方がわかりやすいと思います)。 しかし、もしゼロにするのであれば x8 純粋に、後続の命令にゼロのオペランドを与えるためであれば、許可されている限りは xzr の代わりに x8 のオペランドとして使用します。 その 命令で、ゼロにならない x8 を全く使用しない。