考虑以下由 clang 生成的 x64 代码:
mov rax, qword ptr [rsi] ; 1
mov rdx, qword ptr [rip + hash_mult] ; 1
imul rdx, qword ptr [rax - 8] ; 2
movzx ecx, byte ptr [rip + hash_shift] ; 1
shr rdx, cl ; 3
mov rax, qword ptr [rip + vptrs] ; 2 - or 3 ???
mov rax, qword ptr [rax + 8*rdx] ; 4
mov rcx, qword ptr [rip + slots_strides] ; 1
mov rax, qword ptr [rax + 8*rcx] ; 2
jmp rax ; 5
我有两个问题。
我可以假设标有相同序数的行可以并且将会并行执行吗?
byte ptr
指令中使用的是什么movzx
?它是否表示对齐不良?
您的分析几乎是正确的。该指令
mov rax, qword ptr [rip + vptrs]
也可以在组 1 中执行 — 寄存器重命名将指令与其使用的寄存器名称分离。请注意,执行指令的实际顺序取决于所使用的特定微架构。使用 uiCA 之类的工具来分析这一点。(https://uica.uops.info/)该
byte ptr
短语表示操作数是一个指向字节的指针,而不是像其他操作数那样指向四字的指针。