文档章节

MMX指令集系列之三

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

没有更多内容

加载失败,请刷新页面

加载更多

android -------- MVP+DataBinding 的使用

天来说说MVP+DataBinding 的使用 以一个登录案例来讲解 布局:(ConstraintLayout 作为根布局) <layout> <data> <variable name="onClick" ......

切切歆语
23分钟前
0
0
阿里十年Java架构经验总结,这几点尤为重要!

你有没有静下心来思考过:同样是做了x年Java开发,为什么你的技术比别人差很多?为什么别人每月28K你却只有10K? 其实技术水平的高低和个人智商关系不大(毕竟能做Java编程开发大家都不会差)...

别打我会飞
27分钟前
0
0
Ubuntu 中安装和配置 Caddy 服务

首先访问:https://caddyserver.com/download 选择操作系统、插件和授权类型,点击 Download 下载编译好的文件包,或者执行页面最下面的一键安装脚本,完成 caddy 的安装。 安装完成后,/us...

八风不动
42分钟前
2
0
java代码效率优化

1、 尽量指定类的final修饰符 带有final修饰符的类是不可派生的。 2、 尽量重用对象。 3、 尽量使用局部变量,调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较...

踏破铁鞋无觅处
52分钟前
1
0
程序员的几款利器

1. 作为程序员,最希望的就是自己的代码能够在一个云平台上保留下来,gitlab等等这些很多。但是我这里推荐“码云平台”码云平台和开源中国可以直接关联起来。开源中国可以记录博客,当然也是...

ChinaHYF
52分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部