zyl910

优化技巧、硬件体系、图像处理、图形学、游戏编程、国际化与文本信息处理。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

作者:zyl910

更多详情见——
http://www.cnblogs.com/zyl910/archive/2012/04/26/md00.html
SIMD函数整理:00 索引贴


Name:函数名。
Name2:另一种函数名。
功能:功能描述。
Asm:汇编指令。
PCode:伪代码。

Name Name2 功能 Asm PCode
_m_empty _mm_empty MMX状态置空 EMMS  
_m_from_int _mm_cvtsi32_si64 加载32位 MOVD r=ZX(i)
_m_to_int _mm_cvtsi64_si32 返回低32位 MOVD r=(uD)m
_m_packsswb _mm_packs_pi16 饱和打包.符16位至符8位 PACKSSWB for(i=0;i<4;++i){ r.iB[i]=SS(m1.iW[i]); r.iB[4+i]=SS(m2.iW[i]); }
_m_packssdw _mm_packs_pi32 饱和打包.符32位至符16位 PACKSSDW for(i=0;i<2;++i){ r.iW[i]=SS(m1.iD[i]); r.iW[2+i]=SS(m2.iD[i]); }
_m_packuswb _mm_packs_pu16 饱和打包.符16位至无8位 PACKUSWB for(i=0;i<4;++i){ r.uB[i]=SU(m1.iW[i]); r.uB[4+i]=SU(m2.iW[i]); }
_m_punpckhbw _mm_unpackhi_pi8 高位解包.8位 PUNPCKHBW for(i=0;i<4;++i){ r.mB[i*2]=m1.mB[4+i]; r.mB[i*2+1]=m2.mB[4+i]; }
_m_punpckhwd _mm_unpackhi_pi16 高位解包.16位 PUNPCKHWD for(i=0;i<2;++i){ r.mW[i*2]=m1.mW[2+i]; r.mW[i*2+1]=m2.mW[2+i]; }
_m_punpckhdq _mm_unpackhi_pi32 高位解包.32位 PUNPCKHDQ for(i=0;i<1;++i){ r.mD[i*2]=m1.mD[1+i]; r.mD[i*2+1]=m2.mD[1+i]; }
_m_punpcklbw _mm_unpacklo_pi8 低位解包.8位 PUNPCKLBW for(i=0;i<4;++i){ r.mB[i*2]=m1.mB[i]; r.mB[i*2+1]=m2.mB[i]; }
_m_punpcklwd _mm_unpacklo_pi16 低位解包.16位 PUNPCKLWD for(i=0;i<2;++i){ r.mW[i*2]=m1.mW[i]; r.mW[i*2+1]=m2.mW[i]; }
_m_punpckldq _mm_unpacklo_pi32 低位解包.32位 PUNPCKLDQ for(i=0;i<1;++i){ r.mD[i*2]=m1.mD[i]; r.mD[i*2+1]=m2.mD[i]; }
_m_paddb _mm_add_pi8 环绕加法.8位 PADDB for(i=0;i<8;++i){ r.uB[i]=m1.uB[i]+m1.uB[i]; }
_m_paddw _mm_add_pi16 环绕加法.16位 PADDW for(i=0;i<4;++i){ r.uW[i]=m1.uW[i]+m1.uW[i]; }
_m_paddd _mm_add_pi32 环绕加法.32位 PADDD for(i=0;i<2;++i){ r.uD[i]=m1.uD[i]+m1.uD[i]; }
_m_paddsb _mm_adds_pi8 饱和加法.符8位 PADDSB for(i=0;i<8;++i){ r.uB[i]=SS(m1.uB[i]+m1.uB[i]); }
_m_paddsw _mm_adds_pi16 饱和加法.符16位 PADDSW for(i=0;i<4;++i){ r.uW[i]=SS(m1.uW[i]+m1.uW[i]); }
_m_paddusb _mm_adds_pu8 饱和加法.无8位 PADDUSB for(i=0;i<8;++i){ r.uB[i]=SU(m1.uB[i]+m1.uB[i]); }
_m_paddusw _mm_adds_pu16 饱和加法.无16位 PADDUSW for(i=0;i<4;++i){ r.uW[i]=SU(m1.uW[i]+m1.uW[i]); }
_m_psubb _mm_sub_pi8 环绕减法.8位 PSUBB for(i=0;i<8;++i){ r.uB[i]=m1.uB[i]-m1.uB[i]; }
_m_psubw _mm_sub_pi16 环绕减法.16位 PSUBW for(i=0;i<4;++i){ r.uW[i]=m1.uW[i]-m1.uW[i]; }
_m_psubd _mm_sub_pi32 环绕减法.32位 PSUBD for(i=0;i<2;++i){ r.uD[i]=m1.uD[i]-m1.uD[i]; }
_m_psubsb _mm_subs_pi8 饱和减法.符8位 PSUBSB for(i=0;i<8;++i){ r.uB[i]=SS(m1.uB[i]-m1.uB[i]); }
_m_psubsw _mm_subs_pi16 饱和减法.符16位 PSUBSW for(i=0;i<4;++i){ r.uW[i]=SS(m1.uW[i]-m1.uW[i]); }
_m_psubusb _mm_subs_pu8 饱和减法.无8位 PSUBUSB for(i=0;i<8;++i){ r.uB[i]=SU(m1.uB[i]-m1.uB[i]); }
_m_psubusw _mm_subs_pu16 饱和减法.无16位 PSUBUSW for(i=0;i<4;++i){ r.uW[i]=SU(m1.uW[i]-m1.uW[i]); }
_m_pmaddwd _mm_madd_pi16 乘后二加.符16位 PMADDWD for(i=0;i<2;++i){ r.iD[i]=iD(m1.iW[i*2]*m2.iW[i*2]) + iD(m1.iW[i*2+1]*m2.iW[i*2+1]); }
_m_pmulhw _mm_mulhi_pi16 乘法高位.符16位 PMULHW for(i=0;i<4;++i){ r.iW[i]=hi16(m1.iW[i]*m1.iW[i]); }
_m_pmullw _mm_mullo_pi16 乘法低位.符16位 PMULLW for(i=0;i<4;++i){ r.iW[i]=lo16(m1.iW[i]*m1.iW[i]); }
_m_psllw _mm_sll_pi16 逻辑左移.寄存器.16位 PSLLW  
_m_psllwi _mm_slli_pi16 逻辑左移.立即数.16位 PSLLW for(i=0;i<4;++i){ r.uW[i]=m.uW[i]<<count; }
_m_pslld _mm_sll_pi32 逻辑左移.寄存器.32位 PSLLD  
_m_pslldi _mm_slli_pi32 逻辑左移.立即数.32位 PSLLD for(i=0;i<2;++i){ r.uD[i]=m.uW[i]<<count; }
_m_psllq _mm_sll_si64 逻辑左移.寄存器.64位 PSLLQ  
_m_psllqi _mm_slli_si64 逻辑左移.立即数.64位 PSLLQ for(i=0;i<1;++i){ r.uQ[i]=m.uW[i]<<count; }
_m_psraw _mm_sra_pi16 算术右移.寄存器.16位 PSRAW  
_m_psrawi _mm_srai_pi16 算术右移.立即数.16位 PSRAW for(i=0;i<4;++i){ r.uW[i]=SX(m.uW[i]>>count); }
_m_psrad _mm_sra_pi32 算术右移.寄存器.32位 PSRAD  
_m_psradi _mm_srai_pi32 算术右移.立即数.32位 PSRAD for(i=0;i<2;++i){ r.uD[i]=SX(m.uW[i]>>count); }
_m_psrlw _mm_srl_pi16 逻辑右移.寄存器.16位 PSRLW  
_m_psrlwi _mm_srli_pi16 逻辑右移.立即数.16位 PSRLW for(i=0;i<4;++i){ r.uW[i]=ZX(m.uW[i]>>count); }
_m_psrld _mm_srl_pi32 逻辑右移.寄存器.32位 PSRLD  
_m_psrldi _mm_srli_pi32 逻辑右移.立即数.32位 PSRLD for(i=0;i<2;++i){ r.uD[i]=ZX(m.uW[i]>>count); }
_m_psrlq _mm_srl_si64 逻辑右移.寄存器.64位 PSRLQ  
_m_psrlqi _mm_srli_si64 逻辑右移.立即数.64位 PSRLQ for(i=0;i<1;++i){ r.uQ[i]=zX(m.uW[i]>>count); }
_m_pand _mm_and_si64 逻辑位与 PAND r = m1&m2
_m_pandn _mm_andnot_si64 逻辑位与非 PANDN r = (!m1)&m2
_m_por _mm_or_si64 逻辑位或 POR r = m1|m2
_m_pxor _mm_xor_si64 逻辑位异或 PXOR r = m1^m2
_m_pcmpeqb _mm_cmpeq_pi8 比较.相等.符8位 PCMPEQB for(i=0;i<8;++i){ r.iB[i]=BM(m1.iB[i]==m2.iB[i]); }
_m_pcmpeqw _mm_cmpeq_pi16 比较.相等.符16位 PCMPEQW for(i=0;i<4;++i){ r.iW[i]=BM(m1.iW[i]==m2.iW[i]); }
_m_pcmpeqd _mm_cmpeq_pi32 比较.相等.符32位 PCMPEQD for(i=0;i<2;++i){ r.iD[i]=BM(m1.iD[i]==m2.iD[i]); }
_m_pcmpgtb _mm_cmpgt_pi8 比较.大于.符8位 PCMPGTB for(i=0;i<8;++i){ r.iB[i]=BM(m1.iB[i]>m2.iB[i]); }
_m_pcmpgtw _mm_cmpgt_pi16 比较.大于.符16位 PCMPGTW for(i=0;i<4;++i){ r.iW[i]=BM(m1.iW[i]>m2.iW[i]); }
_m_pcmpgtd _mm_cmpgt_pi32 比较.大于.符32位 PCMPGTD for(i=0;i<2;++i){ r.iD[i]=BM(m1.iD[i]>m2.iD[i]); }
_mm_setzero_si64   赋值为零   r = 0
_mm_set_pi32   赋值自32位   for(i=0;i<2;++i){ r.uD[i]=arg[i]); }
_mm_set_pi16   赋值自16位   for(i=0;i<4;++i){ r.uW[i]=arg[i]); }
_mm_set_pi8   赋值自8位   for(i=0;i<8;++i){ r.uB[i]=arg[i]); }
_mm_set1_pi32   重复赋值自32位   for(i=0;i<2;++i){ r.uD[i]=arg[0]); }
_mm_set1_pi16   重复赋值自16位   for(i=0;i<4;++i){ r.uW[i]=arg[0]); }
_mm_set1_pi8   重复赋值自8位   for(i=0;i<8;++i){ r.uB[i]=arg[0]); }
_mm_setr_pi32   逆序赋值自32位   for(i=0;i<2;++i){ r.uD[i]=arg[i?]); }
_mm_setr_pi16   逆序赋值自16位   for(i=0;i<4;++i){ r.uW[i]=arg[i?]); }
_mm_setr_pi8   逆序赋值自8位   for(i=0;i<8;++i){ r.uB[i]=arg[i?]); }
posted on 2012-07-19 22:48  zyl910  阅读(4335)  评论(0编辑  收藏  举报