可変シフトは、で部分的なレジスタストール(またはレジスタ再結合µ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倍遅くなりました)。cl
bl
試験結果:
- メロム:ストールは観察されません
- ペンリン:ストールは観察されません
- ネハレム:失速は観察されなかった
更新:shrx
ハスウェルのシフトの新しいグループは、そのストールを示しています。shift-count引数は8ビットレジスタとして記述されていないため、予想されていたかもしれませんが、テキスト表現は実際にはそのようなマイクロアーキテクチャの詳細については何も述べていません。