2012-01-23 9 views
4

少し好奇心が見つかりました。gccによって生成されたダミームーブ

00000000004019ae: test %si,%si 
00000000004019b1: movups %xmm0,%xmm0 
00000000004019b4: je 0x401f40 <main(int, char**)+1904> 

質問:2番目の命令はどのような目的のために使用されますか?GCCは次のコードを生成しているようです。それは/それ/何かのように見えません。ですから、プログラムを命令キャッシュに揃える最適化はありますか?それとも、アウト・オブ・オーダーで実行されているのでしょうか? (私は-mtune=nativeとNehalemでコンパイルしています。

緊急のことはもちろんありません。

答えて

6

おそらくxmm0には、整数ドメイン(整数SSE命令)で行われた計算結果が含まれている可能性があります。また、xmm0を使用する次の命令は、浮動小数点ドメイン(浮動小数点SSE命令)にあると予想されます。

xmm0movapsまたはmovupsのような命令で浮動小数点ドメインに移行された場合、Nehalemはこの次の命令を高速に実行できます。条件付きジャンプ命令の前にこの移行を実行すると有益です。この場合、移行は1回だけ実行されます。 movups命令が使用されていない場合、移行は2回(このレジスタの最初のFP命令によって自動的に)、最初に投機的に、誤って予測された分岐で、そして2回目は正しい分岐で行われます。

コードのサイズと実行リソースを最適化するよりも、計算の依存関係チェインを最適化する方が良いとコンパイラに気付いたようです。

+1

なぜmovapsの代わりにmovapsを使用するのですか? – PhiS

+0

@PhiS、私は分かりません。これらは両方ともレジスタのみのオペランドと同じです。 –

+0

ああ、完璧な答え!ありがとう(とupvoted)。私はmovaps/movupsが浮動小数点に変換されたことを知らなかった、私はそれがまっすぐなコピーをしたと思ったが、それは完璧な意味があります。そして、gccは-Oを指定しない限り、デフォルトでそれを行います。私は信じています。 – vpostman

2

Evgeny Kluevによって提案された仮説に加えて、(a)コンパイラオプティマイザのバグ、(b)movupsが挿入されて依存関係を壊している、(c)コードアライメントの目的

+0

IIRCは16バイトのコードアライメントでコンパイルしているので、最後のものも意味があります。(なぜ、私が実験目的以外で何をしているのか分かりません。 )。 – vpostman

+0

@vpostman - あなたが整列しているラベルはわかりませんが、動きの後のje命令は16ではなく4に整列しているようです。 – PhiS

+0

これは非常に興味深いです。 – vpostman

関連する問題