28. 指令速度列表(PPlain和PMMX)

优质
小牛编辑
123浏览
2023-12-01

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)。

指令操作数时钟周期配对情况
NOP1uv
MOVr/m, r/m/i1uv
MOVr/m, sr1np
MOVsr , r/m>= 2 b)np
MOVm , 累加器1uv h)
XCHG(E)AX, r2np
XCHGr , r3np
XCHGr , m>15np
XLAT4np
PUSHr/i1uv
POPr1uv
PUSHm2np
POPm3np
PUSHsr1 b)np
POPsr>= 3 b)np
PUSHF3-5np
POPF4-6np
PUSHA POPA5-9 i)np
PUSHAD POPAD5np
LAHF SAHF2np
MOVSX MOVZXr , r/m3 a)np
LEAr , m1uv
LDS LES LFS LGS LSSm4 c)np
ADD SUB AND OR XORr , r/i1uv
ADD SUB AND OR XORr , m2uv
ADD SUB AND OR XORm , r/i3uv
ADC SBBr , r/i1u
ADC SBBr , m2u
ADC SBBm , r/i3u
CMPr , r/i1uv
CMPm , r/i2uv
TESTr , r1uv
TESTm , r2uv
TESTr , i1f)
TESTm , i2np
INC DECr1uv
INC DECm3uv
NEG NOTr/m1/3np
MUL IMULr8/r16/m8/m1611np
MUL IMUL所有其它版本9 d)np
DIVr8/m817np
DIVr16/m1625np
DIVr32/m3241np
IDIVr8/m822np
IDIVr16/m1630np
IDIVr32/m3246np
CBW CWDE3np
CWD CDQ2np
SHR SHL SAR SALr , i1u
SHR SHL SAR SALm , i3u
SHR SHL SAR SALr/m, CL4/5np
ROR ROL RCR RCLr/m, 11/3u
ROR ROLr/m, i(><1)1/3np
ROR ROLr/m, CL4/5np
RCR RCLr/m, i(><1)8/10np
RCR RCLr/m, CL7/9np
SHLD SHRDr, i/CL4 a)np
SHLD SHRDm, i/CL5 a)np
BTr, r/i4 a)np
BTm, i4 a)np
BTm, i9 a)np
BTR BTS BTCr, r/i7 a)np
BTR BTS BTCm, i8 a)np
BTR BTS BTCm, r14 a)np
BSF BSRr , r/m7-73 a)np
SETccr/m1/2 a)np
JMP CALLshort/near1 e)v
JMP CALLfar>= 3 e)np
conditional jumpshort/near1/4/5/6 e)v
CALL JMPr/m2/5 enp
RETN2/5 enp
RETNi3/6 e)np
RETF4/7 e)np
RETFi5/8 e)np
J(E)CXZshort4-11 e)np
LOOPshort5-10 e)np
BOUNDr , m8np
CLC STC CMC CLD STD2np
CLI STI6-9np
LODS2np
REP LODS7+3*n g)np
STOS3np
REP STOS10+n g)np
MOVS4np
REP MOVS12+n g)np
SCAS4np
REP(N)E SCAS9+4*n g)np
CMPS5np
REP(N)E CMPS8+4*n g)np
BSWAP1 a)np
CPUID13-16 a)np
RDTSC6-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-ovfp-ov
FLDr/m32/m641+00
FLDm803np00
FBLDm8048-58np00
FST(P)r1np00
FST(P)m32/m642 m)np00
FST(P)m803 m)np00
FBSTPm80148-154np00
FILDm3np22
FIST(P)m6np00
FLDZ FLD12np00
FLDPI FLDL2E etc.5 s)np22
FNSTSWAX/m166 q)np00
FLDCWm168np00
FNSTCWm162np00
FADD(P)r/m3+22
FSUB(R)(P)r/m3+22
FMUL(P)r/m3+22 n)
FDIV(R)(P)r/m19/33/39 p)+38 o)2
FCHS FABS1+00
FCOM(P)(P) FUCOMr/m1+00
FIADD FISUB(R)m6np22
FIMULm6np22
FIDIV(R)m22/36/42 p)np38 o)2
FICOMm4np00
FTST1np00
FXAM17-21np40
FPREM16-64np22
FPREM120-70np22
FRNDINT9-20np00
FSCALE20-32np50
FXTRACT12-66np00
FSQRT70np69 o)2
FSIN FCOS65-100 r)np22
FSINCOS89-112 r)np22
F2XM153-59 r)np22
FYL2X103 r)np22
FYL2XP1105 r)np22
FPTAN120-147 r)np36 o)0
FPATAN112-134 r)np22
FNOP1np00
FXCHr1np00
FINCSTP FDECSTP2np00
FFREEr2np00
FNCLEX6-9np00
FNINIT12-22np00
FNSAVEm124-300np00
FRSTORm70-95np00
WAIT1np00

注:

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章中描述。