日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SIMD——MMX指令集介绍

發布時間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SIMD——MMX指令集介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MMX指令集共47個指令,分為以下幾類:
? Data transfer
? Arithmetic
? Comparison
? Conversion
? Unpacking
? Logical
? Shift
? Empty MMX state instruction (EMMS)

1. Data Transfer(數據轉移)

從內存到MMX寄存器/ 從MMX寄存器到內存/ 從通用寄存器到MMX寄存器/ 從MMX寄存器到通用寄存器

  • MOVD 指令(32位)——4個
指令函數指令描述
movd__m64 _mm_cvtsi32_si64(int a)
__m64 _m_from_int(int a)
變量a的32位拷貝到MMX寄存器的低32位,高32位置零
movdint _mm_cvtsi64_si32 (__m64 a)
int _m_to_int(__m64 a)
MMX變量的低32位拷貝到int類型中

根據 https://msdn.microsoft.com/zh-cn/8w48hs3e(v=vs.80) 所屬 _mm_cvtsi32_si64 與 _m_from_int 應相同。(請指點)

+MOVQ指令(64位)——4個

指令函數指令描述
movq__int64 _mm_cvtm64_si64(__m64 a)
__int64 _m_to_int64(__m64 a)
拷貝64位整型a到結果
movq__m64 _mm_cvtsi64_m64 (__int64 a)
__m64 _m_from_int64(__int64 a)
拷貝64位整型a到結果

2.Arithmetic(數值計算)

進行壓縮整數的加減乘以及multiply/add計算。

加法(7個指令,14個函數):

指令函數指令描述
paddw__m64 _mm_add_pi16(__m64 a, __m64 b)
__m64 _m_paddw(__m64 a, __m64 b)
Add packed word integers(16位) with wraparound
使用wraparound截斷溢出方式進行壓縮字整數的加運算
paddd__m64 _mm_add_pi32(__m64 a, __m64 b)
__m64 _m_paddd (__m64a, __m64 b)
Add packed doubleword integers(32位) with wraparound
使用wraparound截斷溢出方式進行壓縮雙字整數的加運算
paddb__m64 _mm_add_pi8(__m64 a, __m64 b)
__m64 _m_paddb (__m64a, __m64 b)
Add packed byte integers(8位) with wraparound
使用wraparound截斷溢出方式進行壓縮字節整數的加運算
paddsw__m64 _mm_adds_pi16(__m64 a, __m64 b)
__m64 _m_paddsw(__m64 a, __m64 b)
Add packed word integers with signed saturation
壓縮字整數的有符號飽和加運算
paddsb__m64 _mm_adds_pi8(__m64 a, __m64 b)
__m64 _m_paddsb(__m64 a, __m64 b)
Add packed byte integers with signed saturation
壓縮字節整數的有符號飽和加運算
paddusw__m64 _mm_adds_pu16(__m64 a, __m64 b)
__m64 _m_paddusw(__m64 a, __m64 b)
Add packed word integers with unsigned saturation
壓縮字整數的無符號飽和加運算
paddusb__m64 _mm_adds_pu8(__m64 a, __m64 b)
__m64 _m_paddusb(__m64 a, __m64 b)
Add packed byte integers with unsigned saturation
壓縮字節整數的無符號飽和加運算

減法(7個指令,14個函數):

指令函數指令描述
psubw__m64 _mm_sub_pi16(__m64 a, __m64 b)
__m64 _m_psubw(__m64 a, __m64 b)
sub packed word integers(16位) with wraparound
使用wraparound截斷溢出方式進行壓縮字整數的減運算
psubd__m64 _mm_sub_pi32(__m64 a, __m64 b)
__m64 _m_psubd (__m64a, __m64 b)
sub packed doubleword integers(32位) with wraparound
使用wraparound截斷溢出方式進行壓縮雙字整數的減運算
psubb__m64 _mm_sub_pi8(__m64 a, __m64 b)
__m64 _m_psubb (__m64a, __m64 b)
sub packed byte integers(8位) with wraparound
使用wraparound截斷溢出方式進行壓縮字節整數的減運算
psubsw__m64 _mm_subs_pi16(__m64 a, __m64 b)
__m64 _m_psubsw(__m64 a, __m64 b)
sub packed word integers with signed saturation
壓縮字整數的有符號飽和減運算
psubsb__m64 _mm_subs_pi8(__m64 a, __m64 b)
__m64 _m_psubsb(__m64 a, __m64 b)
sub packed byte integers with signed saturation
壓縮字節整數的有符號飽和減運算
psubusw__m64 _mm_subs_pu16(__m64 a, __m64 b)
__m64 _m_psubusw(__m64 a, __m64 b)
sub packed word integers with unsigned saturation
壓縮字整數的無符號飽和減運算
psubusb__m64 _mm_subs_pu8(__m64 a, __m64 b)
__m64 _m_psubusb(__m64 a, __m64 b)
sub packed byte integers with unsigned saturation
壓縮字節整數的無符號飽和減運算

乘法(2個指令,4個函數)

指令函數指令描述
pmulhw__m64 _mulhi_pi16(__m64 a, __m64 b)
__m64 _m_pmulhw (__m64 a,__m64 b)
壓縮16位字整數a和b相乘會產生32位雙字整數,將32位整數的高16位存儲在結果中
pmullw__m64_mullo_pi16(__m64 a, __m64 b)
__m64 _m_pmullw(__m64 a,__m64 b)
壓縮16位字整數a和b相乘會產生32位雙字整數,將32位整數的低16位存儲在結果中

具體的執行方式請參考下圖,若使用pmulhw則乘法結果中的高16位存儲在C中,若使用pmullw則乘法結果中的低16位存儲在C中。

multiply/add(乘法加和,1個指令,2個函數)

指令函數指令描述
pmaddwd__m64 _madd_pi16(__m64 a, __m64 b)
__m64 _m_pmaddwd (__m64 a,__m64 b)
壓縮16位字整數a和b相乘會產生32位雙字整數,a和b中后2個8位的相乘結果的和保存在結果的低32位,前2個16位相乘結果的和保存在結果的高32位中

具體的執行情況參考下圖:

3. Comparision(比較操作)

指令函數指令描述
pcmpeqb__m64 _mm_cmpeq_pi8 (__m64 a, __m64 b)
__m64 _m_pcmpeqb (__m64 a, __m64 b)
比較a和b里的8位字節整數值進行比較,判斷它們是否相等,相等返回OxFFFF,否則返回0
pcmpeqw__m64 _mm_cmpeq_pi16 (__m64 a, __m64 b)
__m64 _m_pcmpeqw (__m64 a, __m64 b)
比較a和b里的16位字整數值進行比較,判斷它們是否相等,相等返回OxFFFF,否則返回0
pcmpeqd__m64 _mm_cmpeq_pi32 (__m64 a, __m64 b)
__m64 _m_pcmpeqd (__m64 a, __m64 b)
比較a和b里的32位雙字整數值進行比較,判斷它們是否相等,相等返回OxFFFF,否則返回0
pcmpgtb__m64 _mm_cmpgt_pi8 (__m64 a, __m64 b)
__m64 _m_pcmpgtb (__m64 a, __m64 b)
比較a和b里的8位字節整數值,如果a中>b中,放回OxFFFF,否則返回0
pcmpgtw__m64 _mm_cmpgt_pi16 (__m64 a, __m64 b)
__m64 _m_pcmpgtw (__m64 a, __m64 b)
比較a和b里的16位字整數值,如果a中>b中,放回OxFFFF,否則返回0
pcmpgtd__m64 _mm_cmpgt_pi32 (__m64 a, __m64 b)
__m64 _m_pcmpgtd (__m64 a, __m64 b)
比較a和b里的32位雙字整數值,如果a中>b中,放回OxFFFF,否則返回0

4. Conversion(打包指令)

指令函數指令描述
packsswb__m64 _mm_packs_pi16 (__m64 a, __m64 b)
__m64 _m_packsswb (__m64 a, __m64 b)
將壓縮16位字整數a和bpack成8位字節整數使用有符號飽和運算,保存到結果中
packssdw__m64 _mm_packs_pi32 (__m64 a, __m64 b)
__m64 _m_packssdw (__m64 a, __m64 b)
將壓縮32位雙字整數a和b pack成16位字整數使用有符號飽和運算,保存到結果中
packuswb__m64 _mm_packs_pu16 (__m64 a, __m64 b)
__m64 _m_packuswb (__m64 a, __m64 b)
將壓縮16位字整數a和b pack成8位字節整數使用無符號飽和運算,保存到結果中

packsswb:

dst[7:0] := Saturate_Int16_To_Int8 (a[15:0]) dst[15:8] := Saturate_Int16_To_Int8 (a[31:16]) dst[23:16] := Saturate_Int16_To_Int8 (a[47:32]) dst[31:24] := Saturate_Int16_To_Int8 (a[63:48]) dst[39:32] := Saturate_Int16_To_Int8 (b[15:0]) dst[47:40] := Saturate_Int16_To_Int8 (b[31:16]) dst[55:48] := Saturate_Int16_To_Int8 (b[47:32]) dst[63:56] := Saturate_Int16_To_Int8 (b[63:48])

packssdw:

dst[15:0] := Saturate_Int32_To_Int16 (a[31:0]) dst[31:16] := Saturate_Int32_To_Int16 (a[63:32]) dst[47:32] := Saturate_Int32_To_Int16 (b[31:0]) dst[63:48] := Saturate_Int32_To_Int16 (b[63:32])

packuswb:

dst[7:0] := Saturate_Int16_To_UnsignedInt8 (a[15:0]) dst[15:8] := Saturate_Int16_To_UnsignedInt8 (a[31:16]) dst[23:16] := Saturate_Int16_To_UnsignedInt8 (a[47:32]) dst[31:24] := Saturate_Int16_To_UnsignedInt8 (a[63:48]) dst[39:32] := Saturate_Int16_To_UnsignedInt8 (b[15:0]) dst[47:40] := Saturate_Int16_To_UnsignedInt8 (b[31:16]) dst[55:48] := Saturate_Int16_To_UnsignedInt8 (b[47:32]) dst[63:56] := Saturate_Int16_To_UnsignedInt8 (b[63:48])

5.Unpack(解包指令)

指令函數指令描述
punpckhbw__m64 _m_punpckhbw (__m64 a, __m64 b)
__m64 _mm_unpackhi_pi8 (__m64 a, __m64 b)
64位a和b數據的高一半位數數據(32位)保存到結果中,具體保存方式參考如下描述
punpckhwd
punpckhdq
punpcklbw
punpcklwd
punpckldq

packsswb:

INTERLEAVE_HIGH_BYTES(src1[63:0], src2[63:0]){dst[7:0] := src1[39:32]dst[15:8] := src2[39:32] dst[23:16] := src1[47:40]dst[31:24] := src2[47:40]dst[39:32] := src1[55:48]dst[47:40] := src2[55:48]dst[55:48] := src1[63:56]dst[63:56] := src2[63:56]RETURN dst[63:0] } dst[63:0] := INTERLEAVE_HIGH_BYTES(a[63:0], b[63:0])

6. Logical(邏輯運算)

指令函數指令描述
pand
pandn
por
pxor

7. Shift(移位)

指令函數指令描述
psllw
pslld
psllq
psrlw
psrld
psrlq
psraw
psrad

8. EMMS

指令函數指令描述
emmsvoid _m_empty (void)void _mm_empty (void)使用 EMMS 命令與空容器以容納新目錄

EMMS使用方法:
1. 如果下一條命令是浮點命令,請在MMX指令后使用_mm_empty(例如在進行float,double和long double 類型的計算前)
2. 當寄存器中不存在MMX寄存時,不要使用EMMS指令。如果下一個命令使用MMX寄存器,使用EMMS沒有好處(不會進行優化)
3.

總結

以上是生活随笔為你收集整理的SIMD——MMX指令集介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。