2011-12-14 10 views
3

64アンダービットのx86 CPUを登録します。は、通常、我々は数をロード-1のように登録すること

mov  rdx, -1 // 48BAFFFFFFFFFFFFFFFF 

...このオペコードは10バイトになります。

もう一つの方法は次のとおりです。

xor  rdx, rdx // 4831D2   
dec  rdx  // 48FFCA 

...このオペコードは、6バイトのみを要します。

EDIT

イェンスBjörnhagerとしてxor edx, edxオペコードが全体RDXレジスタをクリアする必要があります(私がテストしている)と言う:

xor  edx, edx // 31D2   
dec  rdx  // 48FFCA 

...このオペコードは唯一の5バイトを取ります。

EDIT:

アレックスは別の解決策を見つける:

mov  rdx, -1 // 48C7C2FFFFFFFF 

を...このオペコードは7バイトになります。 しかし、(DBを使用せずに)より短いオペコードを使用するようコンパイラに指示する方法はありますか?

...

が速く何ですか、何がより経済的ですか?

+0

xor edx、edx; dec rdx; 5バイトです。 –

+0

@JensBjörnhager:64ビットの結果が必要です。「xor edx、edx」はわずか32ビットです! –

+2

xor edx、edxがrdx全体をクリアしていませんか? –

答えて

3

mov rdx, -1の代替7バイトエンコード:48C7C2FFFFFFFFがあります。

この短いエンコードを使用してコンパイラ/アセンブラを助けるために、コードにmov rdx, dword -1という命令を書き込むことができます。

5

最初の方がはるかに優れています。最初は全く依存関係がありません。 2番目の命令は最悪の依存関係の1つを持ちます。命令は命令の直前の命令の結果を命令してから開始する必要があります。しかし、xordecの間でスリップするような指示があれば、依存関係が解消され、2番目のオプションが勝つ可能性があります。

rdxの値にも第2の値は偽の依存関係を持ちますが、最初のものはそうではありません。いくつかのCPUは、この偽の依存性を認識し、rdxの値がわかるまで(出力はゼロに関係なく)最初の命令をストールしないほどスマートになるかもしれません。いくつかのx86 CPUには、いくつかの偽の依存関係を無視するロジックがあります。

コードバイトの数を比較することはあまり役に立ちません。ほとんどの現実的な条件下では、コードが占めるバイト数が非常に重要になることはほとんどありません。

+1

['xor edx、edx'は、PII/PIIIより新しいすべてのアウト・オブ・オーダーのx86 CPUで破棄されます](https://stackoverflow.com/questions/33666617/what-is-the-bestway- xor-of-x86-assembly-xor-mov-or-and)を使用しているため、問題が発生するとすぐに実行できます。インテルのSnBファミリでは、イニシャライズイディオムは実行ポート(リネーム時に処理される)を必要としないため、同じサイクルでアウトオブオーダーコアにゼロを設定する「xor」と「dec」が発行される可能性があります。あたかも 'rdx'が変更されていないかのように、' dec'は次のサイクルで実行することができます。とにかく、**は1 **の代わりにフロントエンドのために2ユーロです。 –

7

言及したもののすべてのより短い1あります:4883CAFF OR rdx,-1
は、それは私の知っているすべてのアーキテクチャ上の偽の依存関係を持つの厄介な性質を持っていますが、それはIMO unmentioned行くべきではありません。それを使用する正当な理由があります。例えば、後でかなりの時間が必要になるまで結果が必要ない場合、それはループ内にあり、それ以外の場合は4つの16バイトブロックに収まらないでしょう。また、速度が特定のコードで大きな問題にならない場合は、貴重なキャッシュスペースを無駄にすることもありません。アライメント上の理由からも使用することができますが、代わりに次のより高いアライメントにパディングする方がほぼ確実です。

これをコンパイラに伝えることについては、私は手がかりを得ていません。

+0

[主に '-Os'で' or rdx、-1'を発行するコンパイラがあります(https://reverseengineering.stackexchange.com/a/4622/2563) –

関連する問題