文档章节

MMX指令集系列之三

abcijkxyz
 abcijkxyz
发布于 2016/11/22 16:46
字数 1046
阅读 8
收藏 0

6. 数据压缩指令

    packuswb MM,MM/m64

   把目的寄存器按字有符号数压缩为饱和字节无符号数放入目的寄存器低32位,
   把源寄存器字有符号数压缩为饱和字节无符号数放入目的寄存器高32位。

   简单的说,就是16位有符号压缩为饱和8位无符号数

                     高32位  | 低32位
  目的寄存器:                  a0 | a1 | a2 | a3
  源寄存器:                     b0 | b1 | b2 | b3
  目的寄存器压缩结果:    b0|b1| b2|b3| a0|a1|a2|a3
  例:
  当MM0 == 0x  7fff 8000 1234 00ae,

         MM1== 0x 00ad 0123 80ff 0100,

  执行packuswb MM0,MM1,则MM0 = 0x ad ff 00 ff ff 00 ff ae.

 

  packsswb MM,MM/m64
  把目的寄存器按字有符号数压缩为字节有符号数放入目的寄存器低32位
  把源寄存器按字有符号数压缩为字节有符号数放入目的寄存器高32位
  压缩时小于-128负数变为80h,大于127的正数变为7fh.

      简单的说,就是16位有符号压缩为饱和8位有符号数
                   高32位 | 低32位
  目的寄存器:        a0 | a1 | a2 | a3
  源寄存器:           b0 | b1 | b2 | b3
  目的寄存器压缩结果:        b0|b1| b2|b3| a0|a1|a2|a3
  例:
  当MM0 == 0x 0fff   ff06 0080 0012,

        MM1 == 0x 0001 8000 ffff  7fff ,

   执行packsswb MM0,MM1,则 MM0 = 0x 01 80 ff 7f 7f 80 7f 12

  packssdw MM,MM/m64
  把目的寄存器按双字有符号数压缩为单字有符号数放入目的寄存器低32位
  把源寄存器按双字有符号数压缩为单字有符号数放入目的寄存器高32位
  压缩时小于-32768负数变为8000h,大于32767的正数变为7fffh.
          高32位 | 低32位
  目的寄存器:      a0 | a1
  源寄存器 :      b0 | b1
  目的寄存器压缩结果:  b0 | b1 | a0 | a1

 

7.  数据重排指令

   punpcklbw MM,MM/m64

  把目的寄存器与源寄存器的低32位按字节交错排列放入目的寄存器
                  高32位 | 低32位
  目的寄存器: a0 | a1| a2  | a3 | a4 | a5 | a6 |a7
  源寄存器:    b0 | b1| b2 | b3 | b4 | b5 | b6 |b7
  目的寄存器结果: b4|a4|b5|a5|b6|a6|b7|a7
  例:
  当MM0 == 0x 01 02 03 04 05 06 07 08,

        MM1 == 0x 09 0a 0b 0c 0d 0e 0f 00
  执行punpcklbw MM0,MM1,

        则MM0 = 0x 0d 05 0e 06 0f 07 00 08

  punpcklwd MM,MM/m64
  把目的寄存器与源寄存器的低32位按交错排列放入目的寄存器
         高32位 | 低32位
  目的寄存器:  a0  | a1  | a2 | a3
  源寄存器:     b0  | b1 | b2 | b3
  目的寄存器结果: b2 | a2 | b3 | a3

 

  punpckldq MM,MM/m64
  把目的寄存器与源寄存器的低32位按双字交错排列放入目的寄存器
          高32位 | 低32位
  目的寄存器:      a0 | a1
  源寄存器:       b0 | b1
  目的寄存器结果:       b1 | a1

 

  punpckhbw MM,MM/m64
  把目的寄存器与源寄存器的高32位按字节交错排列放入目的寄存器
                       高32位 | 低32位
  目的寄存器:      a0 |a1|a2|a3|a4|a5|a6|a7
  源寄存器:         b0|b1|b2|b3|b4|b5|b6|b7
  目的寄存器结果:    b0|a0|b1|a1|b2|a2|b3|a3
  例:
  当  MM0 == 0x 01 02 03 04 05 06 07 08,

              MM1 == 0x 09 0a 0b 0c 0d 0e 0f  00
  执行punpcklbw MM0,MM1,

           则MM0 = 0x 09 01 0a 02 0b 03 0c 04

  punpckhwd MM,MM/m64
  把目的寄存器与源寄存器的高32位交错排列放入目的寄存器
             高32位 | 低32位
  目的寄存器:      a0 | a1 | a2 | a3
  源寄存器:     b0 | b1 | b2 | b3
  目的寄存器结果:   b0 | a0 | b1 | a1

  punpckhdq MM,MM/m64
  把目的寄存器与源寄存器的高32位按双字交错排列放入目的寄存器
        高32位 | 低32位
  目的寄存器:    a0 | a1
  源寄存器:     b0 | b1
  目的寄存器结果:  b0 | a0

 

小结:

   1. 数据压缩指令和NEON窄指令相类似,所生成的元素是源操作数位宽的一半。

   2. 数据重排指令与NEON指令VZIP有类似之处,具体请参考NOEN相关指令集说明。

 

8.  位运算和比较指令

       这些比较简单,从略!

 

 

 

本文转载自:http://www.cnblogs.com/celerychen/archive/2013/03/26/2982827.html

共有 人打赏支持
abcijkxyz
粉丝 63
博文 6196
码字总数 1876
作品 0
深圳
项目经理
私信 提问
C/C++ 编译器--AsmJit

AsmJit 是一个完整的 JIT(Just-In-Time,运行时刻)的针对 C++ 语言的汇编器,可以生成兼容 x86 和 x64 架构的原生代码,不仅支持整个 x86/x64 的指令集(包括传统的 MMX 和最新的 AVX2 指令集...

匿名
2009/06/27
2.5K
1
cpu指令集包括哪些?

如题!我知道有mmx,sse等等.可是mmx指令集是在96年才有的, 而之前386,486,586等那些呢,包含哪些指令,相关资料在哪下载? 是不是sse1包含mmx,,,,,,,sse2包含sse1,,,,,,,sse3包含sse2 我知道去英...

音乐&编程
2012/09/14
2.1K
3
(学习心得):进程,线程,超线程,并发,并行 等概念

前言: 此陋文来自最近对阅读《深入理解计算机系统》与《微型计算机体系结构:Intel Core Duo / i 系列微处理器技术应用》两本书的学习体会, 前者从 程序员的视角来探讨计算机系统中各部件的...

shayi
2012/11/26
5.7K
28
Flat Assembler 1.70 发布,汇编工具

Flat Assembler 是一个快速高效的80x86的汇编工具,支持DOS、Windows、Linux操作系统,支持包括 8086-80486/Pentium instructions with MMX, SSE, SSE2, SSE3, and 3DNow! extensions and x......

红薯
2012/04/19
1K
10
i386和x86-64区别通俗易懂版本(转)

x86架构首度出现在1978年推出的Intel 8086中央处理器,它是从Intel 8008处理器中发展而来的,而8008则是发展自Intel 4004的。Intel之后又推出了包括80186、80286、80386以及80486。 在设计上...

easonjim
2017/07/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Cookie 显示用户上次访问的时间

import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.serv......

gwl_
今天
1
0
网络编程

第14天 网络编程 今日内容介绍  网络通信协议  UDP通信  TCP通信 今日学习目标  能够辨别UDP和TCP协议特点  能够说出UDP协议下两个常用类名称  能够说出TCP协议下两个常用类名称...

stars永恒
今天
1
0
二进制相关

二进制 众所周知计算机使用的是二进制,数字的二进制是如何表示的呢? 实际就是逢二进一。比如 2 用二进制就是 10。那么根据此可以推算出 5的二进制等于 10*10+1 即为 101。 在计算机中,负数以...

NotFound403
昨天
3
0
day22:

1、写一个getinterface.sh 脚本可以接受选项[i,I],完成下面任务: 1)使用格式:getinterface.sh [-i interface | -I ip] 2)当用户使用-i选项时,显示指定网卡的IP地址;当用户使用-I选项...

芬野de博客
昨天
2
0
Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现

自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注。虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭借阿里中间件团队的背景,还是得到不少...

程序猿DD
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部