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
也请注意writemov dl, 3
mov rdx, 3mov edx, 3rdx.MOV r32, imm32
TA贡献1770条经验 获得超3个赞
gccclang
void foo(short s) {
...}srdiicc):
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
fooSPX
foo_unsigned(unsigned short u)0
iccgccclanggccclangclangiccint.
TA贡献1825条经验 获得超4个赞
添加回答
举报
