1、引言
Intel SSE 4指令集是当前使用广泛的汇编指令集,最初在45nm的Intel 64位处理器和AMD的K10处理器中提供。SSE4的含义是Streaming SIMD Extension 4,SIMD即单指令多数据技术(Single Instruction Multiple Data)。SSE4指令集共包含了54条指令,其中子集SSE 4.1包含了47条指令,另一个子集SSE 4.2包含剩余7条指令。
2、SSE 4概览
SSE4旨在提升Intel处理器在多媒体、图像处理、3D处理应用中的性能。SSE4.1添加了增强编译器矢量化的指令,·极大地提升了对打包双字型数据的计算能力。SSE4.2利用SIMD技术提升了字符串和文本处理方面的性能,增加了针对应用加速器(ATA)的指令,以及比SSE4.1中的128位整数SIMD指令更强的SIMD整数指令。
SSE4不需要新的操作系统的支持,以保存和恢复超出了SIMD流指令扩展(SSE)要求的寄存器状态。SSE4.1中存在6个指令可能产生多种SIMD浮点型异常值,因此要求操作系统提供兼容IEEE-745的事件处理器来进行计算后处理(与SSE~SSE3指令集类似)。而SSE4.2的指令将不会产生SIMD浮点异常。
SSE4与基于前几代处理器开发的程序完全兼容,旧的程序可以不经任何改动直接在支持SSE4的新处理器上运行。
3、SSE4指令集
重点学习整数计算指令。
(1)、SSE 4.1指令集
- MPSADBW指令:计算8个4字节宽整数的绝对差值和(SAD)。
- PHMINPOSUW指令:在源操作数(即第二个操作数)中按照无符号word型数据查找最小值,并将该值保存到目标操作数(即第一个操作数)中最低的word位置,并在前面的3个bit保存该值的索引值,其他位置为0。
- PMULDQ指令:有符号乘法指令,针对目标操作数和源操作数中第一个和第三个打包有符号双字型整数。64位的乘积保存于目标操作数中。
- PMULLD指令:有符号乘法指令,计算源操作数和目标操作数对应的打包有符号双字型整数的乘积,并把得到的64位乘积的低32位诸葛保存到目标操作数中。
- PMINSB指令和PMAXSB指令:比较源操作数和目标操作数中有符号字节型(signed byte)整数的大小,前者将较小的字节保存到目标操作数中,后者将较大的字节保存到目标操作数中。
- PMINUW指令和PMAXUW指令:比较源操作数和目标操作数中无符号字型(unsigned word)整数的大小,前者将较小的字节保存到目标操作数中,后者将较大的字节保存到目标操作数中。
- PMINUD指令和PMAXUD指令:比较源操作数和目标操作数中无符号双字型(unsigned dword)整数的大小,前者将较小的字节保存到目标操作数中,后者将较大的字节保存到目标操作数中。
- PMINSD指令和PMAXSD指令:比较源操作数和目标操作数中有符号双字型(signed dword)整数的大小,前者将较小的字节保存到目标操作数中,后者将较大的字节保存到目标操作数中。
- PMOVSX指令和PMOVZX指令:数据扩展指令集,分别按照有符号扩展和0扩展。两个指令集合都包含多个指令,用于字节型、字形和双字型到更大的数据类型的扩展。
- PTEST指令:实现逻辑比较。当源操作数和目标操作数按位与的结果为0时,标识位ZF设为1否则设为0;当源操作数和目标操作数按位取反的结果再进行按位与得到0时,CF设为1,否则CF设为0。该指令不改变目标操作数的值,AF/OF/PF/SF四个标识位都将设为0。
- PCMPEQQ指令:实现QWORD型数据的相等比较。源操作数和目标操作数的两个64位QWORD数据分别进行比较,目标操作数等同的部分全部置1,否则置0。
- PACKUSDW指令:依据无符号饱和模式,将有符号双字型整数转换为无符号的字形整数。
- MOVNTDQA指令:从write-combining内存区高效率地将数据读入SSE寄存器。
(2)、SSE 4.2指令集
SSE 4.2增加了如下指令:
- CRC32用于计算循环冗余校验码;
- PCMPESTRI、PCMPESTRM、PCMPISTRI、PCMPISTRM用于字符串处理;
- PCMPGTQ用于比较QWORD型数据,如果目标操作数大于源操作数则目标操作数的对应部分置0,否则源操作数的部分置0。