Loading AI tools
来自维基百科,自由的百科全书
SSE4 (Streaming SIMD Extensions 4)是Intel Core微架构和AMD K10中所使用的SIMD CPU指令集。它在2006年9月27日在英特尔开发者论坛上被宣布,白皮书上的细节还较为模糊。[1]随后在北京的2007年春季英特尔开发者论坛上的演示文稿中提供了47个指令的更精确细节。[2]SSE4与为前代英特尔64和IA-32架构微处理器编写的软件完全兼容。所有现有软件均可正确运行,无需修改包含SSE4的微处理器,以及现有和新应用程序(包含SSE4)。[3]
英特尔SSE4包含54条指令。由Penryn提供的包含47条指令的子集,在英特尔文档中称为SSE4.1。此外,SSE4.2是由剩余7条指令组成的第二个子集,首次在基于Nehalem的Core i7中提供。英特尔将开发人员的反馈信息称为指令集开发中的重要角色。
从基于Barcelona的处理器开始,AMD推出了SSE4a指令集,其中有原有的4条SSE4指令和4条新的SSE指令。在支持SSE4.1的英特尔处理器中没有发现这些指令并且AMD处理器仅在基于Bulldozer的 FX 处理器上开始支持英特尔的 SSE4.1和SSE4.2 (完整的 SSE4 指令集)。在使用SSE4a时,AMD还引入了未对齐的SSE特性,这意味着未对齐的加载指令在对齐的地址上与对齐版本一样快。它还允许禁止访问内存的非加载SSE操作的对齐检查。[4]英特尔后来在他们的Nehalem处理器中对未对齐的SSE进行了类似的速度改进,但是没有在AVX之前引入非负载SSE指令的未对齐访问。[5]
在Intel Core 2系列中引入的现在称为SSSE3(补充流式SIMD扩展3)的部分在英特尔提出SSSE3名称之前被媒体称为SSE4。而在内部则把新的指令称为Merom。 一些记者批评英特尔最初并没有项目给它们指定一个独有的名称。[6]英特尔最终清除了混淆,并保留了SSE4名称以用于下一个指令集扩展。[7]
英特尔正在使用营销术语HD Boost来指代SSE4。[8]
与之前SSE的所有迭代不同,SSE4包含执行不特定于多媒体应用的操作的指令。它具有许多指令,其操作由一个常量字段和一组将XMM0作为隐式第三操作数的指令决定。
enryn公司的单周期shuffle引擎激活了其中的几条指令。(随机操作重新排序寄存器中的字节被称为shuffle。)
指令 | 描述 |
---|---|
MPSADBW | 計算絕對差的八個偏移和,每次四個(即:|x0−y0|+|x1−y1|+|x2−y2|+|x3−y3|, |x0−y1|+|x1−y2|+|x2−y3|+|x3−y4|, …, |x0−y7|+|x1−y8|+|x2−y9|+|x3−y10|)。這個操作對一些HD 编解码器来说很重要。并且允许在少于七个周期内计算8×8块的差异。[9]三位直接操作数的一个位指示是否应从目标操作数中使用y0 .. y10或 y4 .. y14, 另外两种方法是否应从源中使用x0..x3, x4..x7, x8..x11或x12..x15。 |
PHMINPOSUW | 将目标的底部无符号16位字设置为源中最小的无符号16位字,将底部的下一个字设置为源中该字的索引。 |
PMULDQ | 在两组四个压缩整数中的两组中进行压缩有符号乘法,第一个和第三个压缩4,给出两个打包的64位结果。 |
PMULLD | 打包有符号乘法,四个打包的32位整数组相乘,得到4个打包的32位结果。 |
DPPS;DPPD | AOS(结构数组)数据的点积。这需要一个立即操作数,它由四个(或两个DPPD)位组成,用于选择输入中的哪个条目进行乘法和累加,另外四个(或两个DPPD)选择是将0还是点积输出的相应字段。 |
BLENDPS;BLENDPD;
BLENDVPS;BLENDVPD; PBLENDVB;PBLENDW |
基于(对于非V形式)立即操作数中的位以及(对于V形式)寄存器XMM0中的位的条件复制一个位置中的元素与另一个位置中的元素。 |
PMINSB;PMAXSB;
PMINUW;PMAXUW; PMINUD;PMAXUD; PMINSD;PMAXSD |
不同整型操作数类型的最小/最大值压缩。 |
ROUNDPS;ROUNDSS;
ROUNDPD;ROUNDSD |
使用立即数操作数指定的四种舍入模式中的一种将浮点寄存器中的值整数到整数。 |
INSERTPS;PINSRB;
PINSRD / PINSRQ; EXTRACTPS;PEXTRB; PEXTRD / PEXTRQ |
NSERTPS和PINSR指令从x86寄存器或存储器位置读取8,16或32位,并将其插入由立即数操作数给定的目标寄存器中的字段。EXTRACTPS和PEXTR从源寄存器中读取一个字段,并将其插入x86寄存器或存储器位置。例如,PEXTRD eax,[xmm0],1; EXTRACTPS [addr + 4 * eax],xmm1,1将xmm1的第一个字段存储在由xmm0的第一个字段给出的地址中。 |
PMOVSXBW;PMOVZXBW;
PMOVSXBD;PMOVZXBD; PMOVSXBQ;PMOVZXBQ; PMOVSXWD;PMOVZXWD; PMOVSXWQ ;PMOVZXWQ; PMOVSXDQ;PMOVZXDQ |
打包标志/零扩展到更广泛的类型。 |
PTEST | 这与TEST指令相似,因为它将Z标志设置为其操作数之间的AND结果:如果DEST AND SRC等于0,则设置ZF。另外,如果(NOT DEST)AND SRC等于零。
这相当于如果没有设置SRC掩码的位,则设置Z标志,如果设置了SRC掩码的所有位,则设置C标志。 |
PCMPEQQ | 四字节(64位)相等比较。 |
PACKUSDW | 将带符号的DWORD转换为饱和的无符号WORD。 |
MOVNTDQA | 从写入组合存储区有效读取到SSE寄存器; 这对于从连接到存储器总线的外设检索结果很有用。 |
SSE4.2添加了STTNI(字符串和文本新指令)[10],和每次对16个字节的两个操作数执行字符搜索和比较的几个新指令。这些设计(除其他外)旨在加快解析XML文档。[11]这也增加了一个CRC32指令来计算循环冗余校验,比如可以在某些数据传输协议使用。这些指令首先在基于Nehalem的Intel Core i7产品系列中实现,并完成SSE4指令集。支持通过CPUID.01H:ECX.SSE42 [bit20]标志指示。
指令 | 描述 |
---|---|
CRC32 | 使用多项式0x11EDC6F41(或没有高位,0x1EDC6F41)累加CRC32C值。 |
PCMPESTRI | 打包比较显式长度字符串,返回索引。 |
PCMPESTRM | 打包比较显式长度字符串,返回掩码。 |
PCMPISTRI | 打包比较隐式长度字符串,返回索引。 |
PCMPISTRM | 打包比较隐式长度字符串,返回掩码。 |
PCMPGTQ | 比较已打包签名的64位数据。For Greater Than |
这些指令在整数而不是SSE寄存器上运行,因为它们不是SIMD指令,而是同时出现的指令。虽然它们是由AMD通过SSE4a指令集引入的,但却往往被视为单独的扩展,并且带有自己的专用CPUID位以指示对其的支持。Intel以Nehalem微体系架构和LZCNT开始,实现了从Haswell微架构开始的POPCNT 。AMD从Barcelona微体系架构开始实施。
AMD称这一对高级位操作Advanced Bit Manipulation (ABM)指令。
指令 | 描述 |
---|---|
POPCNT | 汉明权重(计数字数设置为1)。支持通过CPUID.01H:ECX.POPCNT [位23]标志指示。 |
LZCNT | Find First Set。支持通过CPUID.80000001H:ECX.ABM [位5]标志指示。 |
除非输入为0,否则lzcnt的结果等于bsr(位扫描反转)。lzcnt产生32的结果,而bsr产生未定义的结果(并设置零标志)。lzcnt的编码与bsr的编码相似,如果lzcnt在不支持它的CPU上执行,比如Haswell之前的Intel CPU,它将执行bsr操作,而不是产生无效的指令错误。
Trailing zeros可以使用现有的bsf指令进行计数。
AMD公司的Barcelona微体系架构中引入了SSE4a指令组。这些说明在英特尔处理器中不可用。支持通过CPUID.80000001H:ECX.SSE4A [Bit 6]标志指示。
指令 | 描述 |
---|---|
EXTRQ / INSERTQ | 组合掩码移位指令。 |
MOVNTSD / MOVNTSS | 标量流存储指令。 |