文档章节

MMX指令集系列之三

abcijkxyz
 abcijkxyz
发布于 2016/11/22 16:46
字数 1046
阅读 4
收藏 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
粉丝 60
博文 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.5K
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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

(一)软件测试专题——之Linux常用命令篇01

本文永久更新地址:https://my.oschina.net/bysu/blog/1931063 【若要到岸,请摇船:开源中国 不最醉不龟归】 Linux的历史之类的很多书籍都习惯把它的今生来世,祖宗十八代都扒出来,美其名曰...

不最醉不龟归
26分钟前
6
0
蚂蚁金服Java开发三面

8月20号晚上8点进行了蚂蚁金服Java开发岗的第三面,下面开始: 自我介绍(要求从实践过程以及技术背景角度着重介绍) 实习经历,说说你在公司实习所做的事情,学到了什么 关于你们的交易平台...

edwardGe
33分钟前
7
0
TypeScript基础入门 - 函数 - this(三)

转载 TypeScript基础入门 - 函数 - this(三) 项目实践仓库 https://github.com/durban89/typescript_demo.gittag: 1.2.4 为了保证后面的学习演示需要安装下ts-node,这样后面的每个操作都能...

durban
42分钟前
0
0
Spark core基础

Spark RDD的五大特性 RDD是由一系列的Partition组成的,如果Spark计算的数据是在HDFS上那么partition个数是与block数一致(大多数情况) RDD是有一系列的依赖关系,有利于Spark计算的容错 RDD中每...

张泽立
50分钟前
0
0
如何搭建Keepalived+Nginx+Tomcat高可用负载均衡架构

一.概述 初期的互联网企业由于业务量较小,所以一般单机部署,实现单点访问即可满足业务的需求,这也是最简单的部署方式,但是随着业务的不断扩大,系统的访问量逐渐的上升,单机部署的模式已...

Java大蜗牛
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部