考虑以下由 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 组执行——寄存器重命名将指令与它们使用的寄存器名称分开。 因此,下面的指令最早可以在组 2 处执行。请注意,指令执行的实际顺序取决于所使用的特定微体系结构。 使用像 uiCA 这样的工具来分析这个。
byte ptr
短语表示操作数是指向字节的指针,而不是像其他操作数那样指向四字的指针。