SHLD
命令 ( __shiftleft128 ) を使用してビット ストリームを読み取る単純なビット リーダーがあります。
これはうまくいきます。しかし、私はいくつかのプロファイリングを行っており、命令の後に来るSHLD
命令には時間がかかることに気付きました。
Assembly CPU Time Instructions Retired
add r10b, r9b 19.000ms 92,000,000
cmp r10b, 0x40 58.000ms 180,000,000
jb 0x140016fa6 <Block 24>
Block 23:
and r10b, 0x3f 43.000ms 204,000,000
mov r15, r11 30.000ms 52,000,000
mov qword ptr [rbp+0x20], r11
add rbx, 0x8 16.000ms 78,000,000
mov qword ptr [rbp+0x10], rbx
mov r11, qword ptr [rbx] 6.000ms 44,000,000
bswap r11 2.000ms
mov qword ptr [rbp+0x28], r11 8.000ms 20,000,000
Block 24:
mov rdx, r15 61.000ms 208,000,000
movzx ecx, r10b 1.000ms 6,000,000
**shld** rdx, r11, cl 24.000ms 58,000,000
inc edi **127.000ms** 470,000,000
上の表でわかるように、inc
命令の後のshld
命令には多くの時間がかかります (8% の CPU 時間)。
なぜそうなるのか、どうしたら回避できるのか、もう少し詳しく知りたいです。CPUレベルでsldと並行して実行できる命令はありますか?
shld
AMDの最適化マニュアルを読んだことを覚えていますが、再び見つけることができません。