文档章节

SSSE3指令集----水平加法指令饱和字节乘加指令以及字节重排指令

abcijkxyz
 abcijkxyz
发布于 2016/11/22 16:45
字数 753
阅读 47
收藏 0

这里简要描述几个重要的算数运算指令。

1.  水平相加指令

      SSSE3指令集增加的主要是针对整数进行水平方向上相加的指令,与SSE3的浮点指令类似。

  phaddd

  寄存器水平方向上按照无符号32位整数进行加法

 

  phaddw

    寄存器水平方向上按照无符号16位整数进行加法

 

  phaddsw

  寄存器水平方向上按照16位整数进行饱和加法

 

   phsubd

  寄存器水平方向上按照无符号32位整数进行减法

 

  phsubw

  寄存器水平方向上按照无符号16位整数进行减法

 

  phsubsw

 寄存器水平方向上按照16位整数进行饱和减法

     示例:

     phaddw  Dest, SRC

  源数据和目的数据水平相加并打包,适用于MMX和SSE寄存器:
  DEST[15:0] ← DEST[31:16] + DEST[15:0];
  DEST[31:16] ← DEST[63:48] + DEST[47:32];
  DEST[47:32] ← SRC[31:16] + SRC[15:0];
  DEST[63:48] ← SRC[63:48] + SRC[47:32];
  XMM寄存器类似。


    注意: 水平减法是寄存器的低位减去高位


 2. 饱和字节乘加指令

  PMADDUBSW

   按照字节对应位置做乘法,在把相邻两数相加,饱和在16位有符号数。

   示例:PMADDUBSW  DEST, SRC

 

  取源数据和目的数据的乘加的有符号饱和值,适用于MMX和SSE寄存器:
  DEST[15:0] ←saturatetoSWord(SRC[15:8]*DST[15:8] + SRC[7:0]*DST[7:0]);
  DEST[31:16]←saturatetoSWord(SRC[31:24]*DST[31:24] + SRC[23:16]*DST[23:16]);
  DEST[47:32]←saturatetoSWord(SRC[47:40]*DST[47:40] + SRC[39:32]*DST[39:32]);
  DEST[63:48]←saturatetoSWord(SRC[63:56]*DST[63:56] + SRC[55:48]*DST[55:48]);
  XMM寄存器类似。

 

3.  16位乘法取高位

    PMULHRSW

    这条指令专门为定点运算设计

 

    用伪代码描述更为方便:

 signed short a[8]; // input a
  signed short b[8]; // input b
  signed short r[8]; // output r
 
  for (i=0; i < 8; i++)
     r[i] = INT16((a[i]*b[i] + 0x4000) >> 15);


     这是一种Q15定点格式的舍入移位运算,在语音信号处理中颇为常见。

 

4. 取绝对值操作

    PABSB/PABSW/PABSD

 

  示例:PABSW

 

  取源数据的绝对值,适用于MMX和SSE寄存器:
  DEST[15:0] ← ABS(SRC[15:0]);
  DEST[31:16] ← ABS(SRC[31:16]);
  DEST[47:32] ← ABS(SRC[47:32]);
  DEST[63:48] ← ABS(SRC[63:48]);
  XMM寄存器类似。

 5. 字节混选指令

      PSHUFB

      这条指令非常的灵活,用于选取源寄存器的任意字节重新排布到目的寄存器。

 

       用伪代码描述如下:

char a[16]; // input a
  char b[16]; // input b
  char r[16]; // output r
 
  for (i=0; i < 16; i++)
     r[i] = (b[i] < 0) ? 0 : a[b[i] % 16];


 如果源操作数的该字节高位符号位为1,即源字节操作数小于零的时候,把目的寄存器赋值为零。
 否则,根据源操作数的低4位选择目的操作数,将其拷贝到目的操作数的相应位。

本文转载自:http://www.cnblogs.com/celerychen/archive/2013/04/23/3588215.html

上一篇: 常用资源链接
下一篇: 数字音乐均衡器
abcijkxyz
粉丝 64
博文 6421
码字总数 1876
作品 0
深圳
项目经理
私信 提问
实现高性能纠删码引擎 | 纠删码技术详解(下)

作者介绍: 徐祥曦,七牛云工程师,独立开发了多套高性能纠删码/再生码编码引擎。 柳青,华中科技大学博士,研究方向为基于纠删码的分布式存储系统。 前言: 在上篇《如何选择纠删码编码引擎...

七仙女很忙
2017/05/24
0
0
CPU工作原理

CPU从存储器或高速缓冲存储器中取出指令,放入指令寄存器,并对指令译码。它把指令分解成一系列的微操作,然后发出各种控制命令,执行微操作系列,从而完成一条指令的执行。   指令是计算机...

Li_思华年
2017/11/16
0
0
用 Python 编写的 Python 解释器

(点击上方公众号,可快速关注) 翻译: qingyunha 英文:Allison Kaptur http://qingyunha.github.io/taotao/ Allison是Dropbox的工程师,在那里她维护着世界上最大的由Python客户组成的网络...

Python开发者
2018/04/22
0
0
HotSpot中执行引擎技术详解(2)——线索解释与模板解释器

线索解释 一般来说,当提起解释器的时候,大部分人脑海里面浮现出来的模型都是: 其典型特征就是,在一个主循环里面使用switch来做指令的分派。这种解释器模式被称为译码分派(decode-and-di...

flycash
2017/10/26
0
0
什么是指令重排序?

指令重排序指的是JIT编译器、cpu处理器和jmm定义的多级缓存存储,在编译字节码和运行机器指令时,在不影响程序最终执行结果的情况下,会对原语句执行的顺序进行优化。jmm多级缓存会让语句的执...

nj-zhangmq
2016/12/07
74
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
15
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
15
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部