3 回答
TA贡献2003条经验 获得超2个赞
6.8部分登记册档位
(PPRO/PII/PIII和Pentium-M)
部分寄存器失速是一个问题,当我们写到32位寄存器的一部分,然后从整个寄存器或更大的一部分读取。 例子: ; Example 6.10a. Partial register stall mov al, byte ptr [mem8]mov ebx, eax ; Partial register stall这样可以延迟5-6个时钟。
..原因是临时登记册已分配给 AL
使它独立于 AH
..执行单元必须等到写到 AL
的值可以合并之前就已经退休了。 AL
的其他价值 EAX
.
不同CPU中的行为:
英特尔早期P6家族:见上文:暂停5-6时钟,直到部分写入退休。 英特尔奔腾-M(模型D)/核心2/Nehalem:暂停2-3个周期,同时插入一个合并uop。(见 英特尔沙梁桥:插入合并uop为低8/低16(AL/AX),没有拖延,或为AH/BH/CH/DH,同时停滞一个周期。 Intel Ivybridge(可能),但肯定是Haswell/Skylake:al/ax没有被重命名,但是AH仍然是: 所有其他x86 CPU
:Intel Pentium 4,Atom/Silvermont/Knight‘s Landing。所有AMD(以及VIA等): 不重命名部分寄存器。写入部分寄存器合并到完整寄存器中,使写入依赖于完整寄存器的旧值作为输入。
movzx
/ movsx
也请注意write
mov dl, 3
mov rdx, 3
mov edx, 3
rdx
.MOV r32, imm32
TA贡献1770条经验 获得超3个赞
gcc
clang
void foo(short s) { ...}
s
rdi
icc
):
bits 0-31: SSSSSSSS SSSSSSSS SPPPPPPP PPPPPPPP bits 32-63: XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX where: P: the bottom 15 bits of the value of `s` S: the sign bit of `s` (extended into bits 16-31) X: arbitrary garbage
foo
S
P
X
foo_unsigned(unsigned short u)
0
icc
gcc
clang
gcc
clang
clang
icc
int
.
TA贡献1825条经验 获得超4个赞
添加回答
举报