Intel汇编指令集SSE4

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。
时间: 2024-07-28 13:58:29

Intel汇编指令集SSE4的相关文章

使用MMX/SSE汇编指令集优化视频开发

1.汇编指令集 目前大部分的PC机采用的都是Intel或者AMD的CPU,其支持的多媒体汇编指令有: MMX:多媒体扩展指令(MultiMedia eXtention),该指令由Intel在1996年为Pentium处理器开发,包括了57条多媒体指令,可以i一次处理多个数据.但是MMX指令不能与X86浮点运算指令同时执行,在某些场合使用受到一定限制. SSE:SIMD扩展指令集(Streaming SIMD Extension),也称作单指令多数据流扩展.其中的SIMD的含义为Single In

C语言调用汇编及使用指令集对代码进行优化实例教程

搭建环境 x264使用汇编优化的思想是将汇编代码编译到一个静态库里,供C代码调用,所以首先需要构建一个汇编函数得静态库.因为手动配置使用yasm来编译汇编文件,并生成一个lib相当麻烦,我选择的是使用cmake来构建. 在demo里有一个sum.asm的汇编文件,文件里是所有的汇编函数,通过yasm编译后生成sum.obj,然后通过sum.obj来创建一个sum.lib库供C代码使用.还有一个main.c的C文件,用来生成可执行文件main,CMakeLists.txt文件如下: cmake_m

自己动手构造编译系统:编译、汇编与链接

"自己动手系列" 自己动手构造编译系统 编译.汇编与链接 范志东  张琼声  著 图书在版编目(CIP)数据 自己动手构造编译系统:编译.汇编与链接 / 范志东,张琼声著. -北京:机械工业出版社,2016.7 (自己动手系列) ISBN 978-7-111-54355-8 I. 自- II. ①范- ②张- III. 编译器 IV. TP314 中国版本图书馆CIP数据核字(2016)第163077号 自己动手构造编译系统:编译.汇编与链接 出版发行:机械工业出版社(北京市西城区百万

基于SSE指令集的程序设计简介

Intel公司的单指令多数据流式扩展(SSE,Streaming SIMD Extensions)技术能够有效增强CPU浮点运算的能力.Visual Studio .NET 2003提供了对SSE指令集的编程支持,从而允许用户在C++代码中不用编写汇编代码就可直接使用SSE指令的功能.MSDN中有关SSE技术的主题[1]有可能会使不熟悉使用SSE汇编指令编程的初学者感到困惑,但是在阅读MSDN有关文档的同时,参考一下Intel软件说明书(Intel Software manuals)[2]会使你

最牛X的 GCC 内联汇编

正如大家知道的,在C语言中插入汇编语言,其是Linux中使用的基本汇编程序语法.本文将讲解 GCC 提供的内联汇编特性的用途和用法.对于阅读这篇文章,这里只有两个前提要求,很明显,就是 x86 汇编语言和 C 语言的基本认识. 1. 简介 1.1 版权许可 Copyright (C) 2003 Sandeep S. 本文档自由共享;你可以重新发布它,并且/或者在遵循自由软件基金会发布的 GNU 通用公共许可证下修改它;也可以是该许可证的版本 2 或者(按照你的需求)更晚的版本. 发布这篇文档是希

GCC 内联汇编 HOWTO

v0.1, 01 March 2003. 本 HOWTO 文档将讲解 GCC 提供的内联汇编特性的用途和用法.对于阅读这篇文章,这里只有两个前提要求,很明显,就是 x86 汇编语言和 C 语言的基本认识. 1. 简介 1.1 版权许可 Copyright (C) 2003 Sandeep S. 本文档自由共享:你可以重新发布它,并且/或者在遵循自由软件基金会发布的 GNU 通用公共许可证下修改它:也可以是该许可证的版本 2 或者(按照你的需求)更晚的版本. 发布这篇文档是希望它能够帮助别人,但是

自己动手构造编译系统:编译、汇编与链接导读

Preface前 言 本书适合谁读 本书是一本描述编译系统实现的书籍.这里使用"编译系统"一词,主要是为了与市面上描述编译器实现的书籍进行区分.本书描述的编译系统不仅包含编译器的实现,还包括汇编器.链接器的实现,以及机器指令与可执行文件格式的知识.因此,本书使用"编译系统"一词作为编译器.汇编器和链接器的统称. 本书的目的是希望读者能通过阅读本书清晰地认识编译系统的工作流程,并能自己尝试构造一个完整的编译系统.为了使读者更容易理解和学习编译系统的构造方法,本书将描述

NESASM教程——第一天——开始NES汇编

[关于NES汇编] 我的天,你正准备学习用汇编写NES程序?那么,如果你真想这么做,本文应该有所帮助.也许你已经读过我的正在进行中的GameBoy高级汇编系列文章.在我的GBA汇编教程中,指出你在进行汇编编程前应该先了解GBA C语言编程.我对于NES汇编也这样说,但是针对NES CPU没有好的C编译器.所以我只想说,写NES代码前要了解点GBA汇编或Intel 汇编,因为NES相比前面两者有点难. 我们将使用NESASM.exe作为我们的汇编器.可以从这里下载(http://patater.c

自己动手构造编译系统:编译、汇编与链接1.3.2 编译

1.3.2  编译      接下来GCC对hello.i进行编译,命令如下: $gcc –S hello.i –o hello.s 编译后产生的汇编文件hello.s内容如下:      .file                "hello.c"      .section           .rodata .LC0:      .string  "Hello World!"      .text .globl main      .type        m