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


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

    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位选择目的操作数,将其拷贝到目的操作数的相应位。

  • 相关阅读:
    VMware给虚拟机绑定物理网卡
    Chrome插件开发教程收集
    Linux文本过滤常用命令(转)
    Linux文本过滤命令grep、awk、sed
    Chromium和Chrome的区别
    MyBatis参数为Integer型并赋值为0时判断失误的问题解决
    Java中使用HttpRequest调用RESTfull的DELETE方法接口提示:How to fix HTTP method DELETE doesn't support output
    Ubuntu 16.04服务器版查看IP、网关、DNS(非DHCP)
    CentOS 6.9设置IP、网关、DNS
    Ubuntu 16.04服务器版查看DHCP自动分配的IP、网关、DNS
  • 原文地址:https://www.cnblogs.com/celerychen/p/3588215.html
Copyright © 2020-2023  润新知