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個贊
添加回答
舉報