28. 指令速度列表(PPlain和PMMX)
28.1 整型指令
注释:
操作数:
r = 寄存器(register), m =
内存(memory), i = 立即数(immediate data), sr = 段寄存器(segment register)
m32 = 32位内存操作数(32 bit memory operand), 等等。
时钟周期:
表上列出的是最小值。 cache失效,未对齐和异常都可能会大幅增加时钟周期。
配对:
u =
可在u管道配对, v = 可在v管道配对, uv = 可在任何管道配对, np = 无法配对(not pairable)。
指令 | 操作数 | 时钟周期 | 配对情况 |
NOP | 1 | uv | |
MOV | r/m, r/m/i | 1 | uv |
MOV | r/m, sr | 1 | np |
MOV | sr , r/m | >= 2 b) | np |
MOV | m , 累加器 | 1 | uv h) |
XCHG | (E)AX, r | 2 | np |
XCHG | r , r | 3 | np |
XCHG | r , m | >15 | np |
XLAT | 4 | np | |
PUSH | r/i | 1 | uv |
POP | r | 1 | uv |
PUSH | m | 2 | np |
POP | m | 3 | np |
PUSH | sr | 1 b) | np |
POP | sr | >= 3 b) | np |
PUSHF | 3-5 | np | |
POPF | 4-6 | np | |
PUSHA POPA | 5-9 i) | np | |
PUSHAD POPAD | 5 | np | |
LAHF SAHF | 2 | np | |
MOVSX MOVZX | r , r/m | 3 a) | np |
LEA | r , m | 1 | uv |
LDS LES LFS LGS LSS | m | 4 c) | np |
ADD SUB AND OR XOR | r , r/i | 1 | uv |
ADD SUB AND OR XOR | r , m | 2 | uv |
ADD SUB AND OR XOR | m , r/i | 3 | uv |
ADC SBB | r , r/i | 1 | u |
ADC SBB | r , m | 2 | u |
ADC SBB | m , r/i | 3 | u |
CMP | r , r/i | 1 | uv |
CMP | m , r/i | 2 | uv |
TEST | r , r | 1 | uv |
TEST | m , r | 2 | uv |
TEST | r , i | 1 | f) |
TEST | m , i | 2 | np |
INC DEC | r | 1 | uv |
INC DEC | m | 3 | uv |
NEG NOT | r/m | 1/3 | np |
MUL IMUL | r8/r16/m8/m16 | 11 | np |
MUL IMUL | 所有其它版本 | 9 d) | np |
DIV | r8/m8 | 17 | np |
DIV | r16/m16 | 25 | np |
DIV | r32/m32 | 41 | np |
IDIV | r8/m8 | 22 | np |
IDIV | r16/m16 | 30 | np |
IDIV | r32/m32 | 46 | np |
CBW CWDE | 3 | np | |
CWD CDQ | 2 | np | |
SHR SHL SAR SAL | r , i | 1 | u |
SHR SHL SAR SAL | m , i | 3 | u |
SHR SHL SAR SAL | r/m, CL | 4/5 | np |
ROR ROL RCR RCL | r/m, 1 | 1/3 | u |
ROR ROL | r/m, i(><1) | 1/3 | np |
ROR ROL | r/m, CL | 4/5 | np |
RCR RCL | r/m, i(><1) | 8/10 | np |
RCR RCL | r/m, CL | 7/9 | np |
SHLD SHRD | r, i/CL | 4 a) | np |
SHLD SHRD | m, i/CL | 5 a) | np |
BT | r, r/i | 4 a) | np |
BT | m, i | 4 a) | np |
BT | m, i | 9 a) | np |
BTR BTS BTC | r, r/i | 7 a) | np |
BTR BTS BTC | m, i | 8 a) | np |
BTR BTS BTC | m, r | 14 a) | np |
BSF BSR | r , r/m | 7-73 a) | np |
SETcc | r/m | 1/2 a) | np |
JMP CALL | short/near | 1 e) | v |
JMP CALL | far | >= 3 e) | np |
conditional jump | short/near | 1/4/5/6 e) | v |
CALL JMP | r/m | 2/5 e | np |
RETN | 2/5 e | np | |
RETN | i | 3/6 e) | np |
RETF | 4/7 e) | np | |
RETF | i | 5/8 e) | np |
J(E)CXZ | short | 4-11 e) | np |
LOOP | short | 5-10 e) | np |
BOUND | r , m | 8 | np |
CLC STC CMC CLD STD | 2 | np | |
CLI STI | 6-9 | np | |
LODS | 2 | np | |
REP LODS | 7+3*n g) | np | |
STOS | 3 | np | |
REP STOS | 10+n g) | np | |
MOVS | 4 | np | |
REP MOVS | 12+n g) | np | |
SCAS | 4 | np | |
REP(N)E SCAS | 9+4*n g) | np | |
CMPS | 5 | np | |
REP(N)E CMPS | 8+4*n g) | np | |
BSWAP | 1 a) | np | |
CPUID | 13-16 a) | np | |
RDTSC | 6-13 a) j) | np |
注:
a)在PPlain上,这条带0FH前缀的指令花一个额外的时钟周期解码,除非前面是一条多时钟指令(见第12章)。
b)带FS和GS的版本有一个0FH前缀。见注a。
c)带SS,FS和GS的版本有一个0FH前缀。见注a。
d)带两个操作数且没有立即数的版本有一个0FH前缀。见注a。
e)见第22章
f)只有寄存器是累加器时才能配对。见26.14节。
g)对于重复前缀的解码需要一个额外的时钟周期,除非前面是一条多时钟指令(比如CLD。见第12章)。
h)仿佛像是对累加器的写操作那样配对。见26.14节。
i) 如果SP能被4整除,那么是9。见10.2节
j)在PPlain上,权限值是6或者实模式,非权限值是11?,在虚拟模式?下发生错误。在PMMX上:分别是8和13个时钟。
28.2 浮点指令
注释:
r =
寄存器(register), m = 内存(memory), m32 = 32位内存操作数(32 bit memory operand), 等等。
时钟周期:
表上列出的是最小值。 cache失效,非规格化的操作数,未对齐和异常都可能会大幅增加时钟周期。
配对:
+ =
可以和FXCH配对, np = 不能和FXCH配对。
i-ov:
可以和整形指令重叠。i-ov = 4,意味着最后的4个时钟可以与后续并发的整形指令重叠。
fp-ov:
可以和浮点指令重叠。 fp-ov = 2
意味着最后的2个时钟可以与后续并发的浮点指令重叠(这里,WAIT也看作是一条浮点指令)。
指令 | 操作数 | 时钟周期 | 配对情况 | i-ov | fp-ov |
FLD | r/m32/m64 | 1 | + | 0 | 0 |
FLD | m80 | 3 | np | 0 | 0 |
FBLD | m80 | 48-58 | np | 0 | 0 |
FST(P) | r | 1 | np | 0 | 0 |
FST(P) | m32/m64 | 2 m) | np | 0 | 0 |
FST(P) | m80 | 3 m) | np | 0 | 0 |
FBSTP | m80 | 148-154 | np | 0 | 0 |
FILD | m | 3 | np | 2 | 2 |
FIST(P) | m | 6 | np | 0 | 0 |
FLDZ FLD1 | 2 | np | 0 | 0 | |
FLDPI FLDL2E etc. | 5 s) | np | 2 | 2 | |
FNSTSW | AX/m16 | 6 q) | np | 0 | 0 |
FLDCW | m16 | 8 | np | 0 | 0 |
FNSTCW | m16 | 2 | np | 0 | 0 |
FADD(P) | r/m | 3 | + | 2 | 2 |
FSUB(R)(P) | r/m | 3 | + | 2 | 2 |
FMUL(P) | r/m | 3 | + | 2 | 2 n) |
FDIV(R)(P) | r/m | 19/33/39 p) | + | 38 o) | 2 |
FCHS FABS | 1 | + | 0 | 0 | |
FCOM(P)(P) FUCOM | r/m | 1 | + | 0 | 0 |
FIADD FISUB(R) | m | 6 | np | 2 | 2 |
FIMUL | m | 6 | np | 2 | 2 |
FIDIV(R) | m | 22/36/42 p) | np | 38 o) | 2 |
FICOM | m | 4 | np | 0 | 0 |
FTST | 1 | np | 0 | 0 | |
FXAM | 17-21 | np | 4 | 0 | |
FPREM | 16-64 | np | 2 | 2 | |
FPREM1 | 20-70 | np | 2 | 2 | |
FRNDINT | 9-20 | np | 0 | 0 | |
FSCALE | 20-32 | np | 5 | 0 | |
FXTRACT | 12-66 | np | 0 | 0 | |
FSQRT | 70 | np | 69 o) | 2 | |
FSIN FCOS | 65-100 r) | np | 2 | 2 | |
FSINCOS | 89-112 r) | np | 2 | 2 | |
F2XM1 | 53-59 r) | np | 2 | 2 | |
FYL2X | 103 r) | np | 2 | 2 | |
FYL2XP1 | 105 r) | np | 2 | 2 | |
FPTAN | 120-147 r) | np | 36 o) | 0 | |
FPATAN | 112-134 r) | np | 2 | 2 | |
FNOP | 1 | np | 0 | 0 | |
FXCH | r | 1 | np | 0 | 0 |
FINCSTP FDECSTP | 2 | np | 0 | 0 | |
FFREE | r | 2 | np | 0 | 0 |
FNCLEX | 6-9 | np | 0 | 0 | |
FNINIT | 12-22 | np | 0 | 0 | |
FNSAVE | m | 124-300 | np | 0 | 0 |
FRSTOR | m | 70-95 | np | 0 | 0 |
WAIT | 1 | np | 0 | 0 |
注:
m)
待存的值需要提前一个时钟准备好
n) 如果重叠的指令也是FMUL指令,那么是1
o) 不能和整型指令重叠。
p)
对于24位,53位,64位精度,FDIV分别需要19,33,39个时钟周期。FIDIV还要多花3个周期。精度由浮点控制字的8-9位指定。
q) 前4个周期可以与前面的整型指令重叠。见26.7节。
r) 给出的时钟数是对典型情况而言。罕见情况下可能更快,极端情况下可能更慢。
s) 如果输出结果为FST,FCHS或FABS所用,那么可能要多用3个周期以上。
28.3 MMX指令(PMMX)
MMX指令的速度列表就不需要了。 因为除了MMX乘法指令需要3个周期外,其它指令都是1个时钟周期。
MMX乘法指令可以被重叠并流水化,从而获得每个时钟1个乘法的吞吐率。
EMMS指令本身只花1个时钟。
但在EMMS之后的第一条浮点指令要额外花去大约58个时钟,在浮点指令后的第一条MMX指令要额外花去大约38个时钟。
在PMMX上,在EMMS之后的MMX指令没有惩罚(但在PII和PIII上有小的惩罚)。
在MMX指令中用内存操作数没有惩罚,因为在流水线中,MMX运算单元比读取单元慢一步。
但当你把一个MMX寄存器的数据存入内存或32位寄存器时可能会有惩罚:数据必须提前一个时钟准备好。这与浮点存数指令类似。
除了EMMS外,所有MMX指令都是在任何管道可配对的。
MMX指令的配对规则在第10章中描述。