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位選擇目的操作數,將其拷貝到目的操作數的相應位。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM