這里簡要描述幾個重要的算數運算指令。
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位選擇目的操作數,將其拷貝到目的操作數的相應位。