可変シフトは、で部分的なレジスタストール(またはレジスタ再結合µops)を生成できますecxか?もしそうなら、どのマイクロアーキテクチャに?
私はこれをCore2(65nm)でテストしましたが、これは読み取り専用のようclです。
_shiftbench:
push rbx
mov edx, -10000000
mov ecx, 5
_shiftloop:
mov bl, 5 ; replace by cl to see possible recombining
shl eax, cl
add edx, 1
jnz _shiftloop
pop rbx
ret
で置き換えmov bl, 5てmov cl, 5も違いはありませんでした。これは、レジスタの再結合が行われている場合に発生します。これは、で置き換えることで実証できますshl eax, cl(add eax, ecx私のテストでは、の代わりaddに書き込みを行うと、バージョンが2.8倍遅くなりました)。clbl
試験結果:
- メロム:ストールは観察されません
- ペンリン:ストールは観察されません
- ネハレム:失速は観察されなかった
更新:shrxハスウェルのシフトの新しいグループは、そのストールを示しています。shift-count引数は8ビットレジスタとして記述されていないため、予想されていたかもしれませんが、テキスト表現は実際にはそのようなマイクロアーキテクチャの詳細については何も述べていません。