作者: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?]); } |