多媒体指令的详细说明

原创 2007年10月08日 16:25:00
近期很荣幸为公司做了一次关于多媒体指令的培训,现把主要的培训内容写出来。 

基于MMX指令集的程序设计

MMX技术简介
为了满足多媒体技术(包括图形图像,声频,动画,视频等)对大量数据快速处理的需要,intel公司在其第5intel80x86微处理器奔腾中,加入了多媒体扩展指令,数据流SIMD扩展SSE指令和SSE2指令。
Intel
公司的MMX(多媒体增强指令集)技术可以大大提高应用程序对二维三维图形和图象的处理能力。Intel MMX技术可用于对大量数据和复杂数组进行的复杂处理,使用MMX技术可处理的数据基本单位可以是字节(byte)、字(word),或者是双字(double-word)。

1 MMX的指令寄存器

1.          MMX的数据处理特点

一条MMX指令可以同时计算8/4/2个数据

紧缩字节:88位字节被紧缩成一个64位数据

紧缩字:416位字被紧缩成一个64位数据

紧缩双字:232位双字被紧缩成164位数据

紧缩4字:164位数据

2MMX的指令集

算术运算指令:

PADD[B,W,D]环绕加【字节,字,双字】

PSUB[B,W,D]环绕减【字节,字,双字】

环绕运算是指:无符号数据的运算结果超出其数据类型界限的时候,它进行正常的进位借位运算。但是MMX技术没有新增任何标志,MMX指令也不影响状态标志,所以每个进位或错位并不能反映出来。例如:

16位字的数据类型界限是0000FFFFH,则环绕运算

7FFEH+0003H=8001H(无进位)

0003H+FFFEH=0001H(有进位)

7FFEH-0003H=7FFBH(无借位)

0003H-FFFEH=0005H(有借位)

PADDS[B,W]有符号饱和加【字节,字】

PADDUS[B,W]无符号饱和加【字节,字】

PSUBS[B,W]有符号饱和减【字节,字】

PSUBUS[D,W]无符号饱和减【字节,字】

饱和运算是指:当运算结果超过其数据界限时候,其结果被最大/最小所代替。饱和运算有带符号数和无符号数之分,因为带符号和无符号数据的界限是不同的,如下表所示:

数据类型

符号数据

有符号数据

字节

00H-FFH(256)

80H(-128)-7FH(127)

0000H-FFFFH(65535)

8000H(-32768)-7FFFH(32767)

双字

00000000H-FFFFFFFFH(65535)

80000000(-2147483648)-7FFFFFFFH(2147483647)

 

PMULHW紧缩字乘后取高位

将源操作数的4个有符号字与目的操作数的4个有符号字相乘,然后将432位的积的高16位存入目的寄存器中对应的字;积的低16位被丢弃

PMULLW紧缩字后取低位

PMADDWD紧缩字乘,积相加

将源操作数的4个有符号字与目的操作数的4个有符号字分别相乘,结果产生了4个有符号双字;然后,低位的2个双字相加并存入目的寄存器的低位双字,高位的2个双字相加并存入目的操作数的高位双字。

比较指令:

比较两个操作数的各个数据元素(字节,字或者双字)。如果比较结果为真,目的寄存器中对应的数据元素被置为1;否则,被置为全零。比较指令并不设置标志位。

PCMPEQB,W,D】紧缩比较是否相等

PCMPGTB,W,D】紧缩比较是否大于

例子:

MM0=0051 0030 0087 0023, MM1=0073 0002 0087 0009H

执行 pcmpeqw MM0,MM1;MM0=0000 0000 FFFF 0000H

而如果MM0MM1不变,执行

PCMPEQB MM0 MM1;MM0= FF 00 FF 00 FF FF FF 00H

类型转换:

PACKUSWB:按无符号饱和压缩【字或字节】

8个有符号紧缩字压缩成8个无符号字节。如果有符号紧缩字大于FFH255),被饱和处理为FFH,如果有符号字为负,将饱和处理为00H.源操作数的4个字压缩后存入目的寄存器低32位,目的操作数的4个字压缩后存入目的寄存器高32位。

PACKSSWB,DW】按有符号饱和压缩【字/双字成字节/字】

PUNPCKHBW,WD,DQ】扩展高位【字节,字,双字成字,双字,4字】

PUNPCKLBW,WD,DQ】扩展低位【字节,字,双字成字,双字,4字】

逻辑运算(以位方式对64位进行逻辑操作,结果返回MMX目的寄存器):

PAND 紧缩与

PANDN 紧缩逻辑与非:先将目的操作数取反,然后再与源操作数按位逻辑与操作

POR 紧缩逻辑或

PXOR 紧缩逻辑异或

移位运算:

PSLLW,D,Q】紧缩逻辑左移【字,双字,4字】

分别以字,双字,4字为数据元素单位,按源操作数指定的数值左移目的操作数中的每个数据元素,低位用零填充。如果指定的移位个数大于15(双字),31(对双字),63(对4字),则目的寄存器为全零

例子:MM7= 0051 0003 0087 0023H

执行 PSLLW MM7,2  MM7=0144 000C021C 008CH

00230000 0000 0010 0011――0000 0000 1000 1100008C

00510000 0000 0101 0001――0000 0001 0100 0100=0144

PSRLW,D,Q】紧缩逻辑右移

PSRAW,D】紧缩算术右移

高位用该数据元素原来的符号位填充。如果指定的移位个数大于15(对字)或31(对双字),则目的寄存器中各数据元素全为原符号位。

数据传送:

MOV[D,Q]MMX寄存器传入、传出【双字,4字】

状态清除:
EMMS
:清除MMX状态

饱和算法(Saturation Arithmetic)和封装模式(Wraparound Mode

MMX
技术支持一种叫做saturating arithmetic(饱和算法)的计算模式。在饱和模式下,当计算结果发生溢出(上溢或下溢)时,CPU会自动去掉溢出的部分,使计算结果取该数据类型表示数值的上限值(如果上溢)或下限值(如果下溢)。饱和模式的计算用于对图象的处理。
下面的例子能够让你理解饱和模式和封装模式的区别。如果一个字节(BYTE)类型变量的值为255,然后将其值加一。在封装模式下,相加结果为0(去掉进位);在饱和模式下,结果为255。饱和模式用类似的方法来处理下溢出,比如对于一个字节数据类型的数在饱和模式下,12的结果为0(而不是-1)。每一个MMX算术指令都有这两种模式:饱和模式和封装模式。


Visual Studio .NET 2003
提供了对MMX指令集特性的支持,从而可以不必编写汇编代码,直接使用C 代码就可以实现MMX指令的功能。通过参考Intel软件说明书(Intel Software manuals[1]以及阅读MSDN中有关MMX编程技术的主题会使你更好地把握MMX编程的要点。

MMX
技术实现了单道指令多道数据流(SIMDsingle-instruction, multiple-data)的执行模式。考虑下面一个需要编程完成的任务,在一个字节(BYTE)数组中使其中每一个元素加上一个数,在传统的程序中,实现这个功能的算法如下:

for each
 b in array   //对数组中的每一个元素b
  b = b n      //加上一个数n

下面看看它的实现细节:

for each
 b in array //对数组中的每一个元素b
{
  把b加载到寄存器中
  把此寄存器中的数加上n
  把所得寄存器中的结果放回内存
}


具有MMX指令集支持的处理器有八个64位的寄存器,每一个寄存器可以存放8个字节(byte)、4个字(word)2个双字(double-word)MMX技术同时提供了一个MMX指令集,其中的指令可以可以把一个数值(其类型可以是字节、字或双字)加载到这些MMX寄存器中,在寄存器中进行算术或逻辑运算,然后把寄存器中的结果放回内存存储单元。上面的例子采用MMX技术后的算法是这样的:

for each
 8 members in array //把数组中的8个字节(其中一个字节为数组中的一个单位)作为一组取出
{
  把这8个字节加载到MMX寄存器中
  通过一个CPU指令执行周期把这个寄存器中的8个字节都加上n
  把寄存器中计算的结果写回内存
}


C
编程人员不必直接使用MMX指令集中的指令访问这些MMX寄存器。你可以使用64位的数据类型__m64和一系列C 函数来进行相关的算术和逻辑运算。而决定程序使用哪个MMX寄存器以及代码优化是C 编译器的任务。
MMX
程序设计详细介绍
包含的头文件
所有的MMX指令集函数在emmintrin.h文件中定义:
#include <emmintrin.h>
因为程序中用到的MMX处理器指令是由编译器决定,所以它并没有相关的.lib库文件。
__m64
数据类型
这种类型的变量可用作MMX指令的操作数,它不能被直接访问。_m64类型的变量被自动分配为8个字节的字长。




编程实例
演示项目
C 代码;
使用C MMX功能函数的代码;
使用MMX汇编指令的代码。

为了查询使用C MMX指令函数的方法,需要参考Intel软件说明书(Intel Software manuals)中有关MMX汇编指令的说明,首先我是在第一卷的第八章找到了MMX相关指令的大体介绍,然后在第二卷找到了有关这些MMX指令的详细说明,这些说明有一部分涉及了与其特性相关的C 函数。然后我通过这些MMX指令对应的C 函数查找了MSDN中与其相关的说明。在MMX8示例程序中用到的MMX指令和相关的C 函数见下表:

 

Required Function

Assembly Instruction

MMX Intrinsic

Empty MMX state (prevents collisions with floating-point operations)

emms

_mm_empty

Unsigned subtraction with saturation of each byte in two 64-bits operands

psubusb

_mm_subs_pu8

Unsigned addition with saturation of each byte in two 64-bits operands

paddusb

_mm_adds_pu8

参考文档:

[1] Intel
软件说明书(Intel Software manuals):http://developer.intel.com/design/archives/processors/mmx/index.htm

[2]
 MSDN中有关MMX技术的主题:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/vcrefsupportformmxtechnology.asp

[3] Microsoft Visual C CPUID
项目示例:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcsample/html/vcsamcpuiddeterminecpucapabilities.asp

[4] Microsoft Visual C MMXSwarm
项目示例:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcsample/html/vcsamMMXSwarmSampleDemonstratesCImageVisualCsMMXSupport.asp


[5] Matt Pietrek
Microsoft Systems Journal 19982月刊上的评论文章:
http://www.microsoft.com/msj/0298/hood0298.aspx



 

Intel CPU 的多媒体指令集

自Intel Pentium MMX 处理器开始,处理器新增SIMD(SingleInstruction MultipleData)多媒体指令集,可把多个批次性的指令组变成单一指令,以提升数据处理能力...
  • jiji262
  • jiji262
  • 2007-11-13 11:02:00
  • 1466

多媒体指令集使用

#include "counter.h"   #include   #include   #include /* 标题:我的第一个调用Intrinsics函数的程序 所属项目...
  • cncnlg
  • cncnlg
  • 2015-05-22 16:31:06
  • 468

GCC中SIMD指令的应用方法

X86架构上的多媒体应用开发,如果能够使用SIMD指令进行优化, 性能将大大提高。目前,IA-32的SIMD指令包括MMX,SSE,SSE2等几级。 在GCC的开发环境中,有几种使用SIMD指令的方式...
  • Suprman
  • Suprman
  • 2006-12-01 12:22:00
  • 1176

软考复习专题四---多媒体专题

专题四:多媒体专题 1.1多媒体知识概述  1.基本概念  多媒体信息一般指用文本、图形、图像、动画、音频和视频影像等形式表示的信息。 多媒体计算机技术是指利用计算机交互地综合处理相互之间有联系的文...
  • u011680118
  • u011680118
  • 2015-04-30 11:37:14
  • 597

MCS51指令详细说明

  • 2016年04月15日 13:13
  • 1.41MB
  • 下载

zebra打印指令说明

  • 2010年11月26日 11:30
  • 4KB
  • 下载

利用Windows API函数实现多媒体文件得播放,可以播放MPG、AVI、MDI、WAV等文件以及文件信息(128KB)...

  • 2009年10月07日 11:43
  • 128KB
  • 下载

爱指令(DLL命令)

  • 2016年05月09日 13:38
  • 345KB
  • 下载

stm32+ESP8266AT指令详细说明

最近公司团队的项目用到ESP8266,使用的是stm32c8t6芯片,软件使用MDK,于是写下调试过程中的一些注意点。具体代码和涉及思路不能外泄,这里只给出我们调试过程中的注意的方面。   关于ESP...
  • guanjianhe
  • guanjianhe
  • 2017-08-03 16:35:08
  • 804

POS指令和详细说明

  • 2007年12月29日 10:52
  • 1.93MB
  • 下载
收藏助手
不良信息举报
您举报文章:多媒体指令的详细说明
举报原因:
原因补充:

(最多只允许输入30个字)