• Instructions函数对照表:01 mmintrin.h与MMX指令集


    作者: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?]); }
    作者:zyl910
    版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0.
  • 相关阅读:
    跨页传值另一种方法
    运行nodejs的blog程序遇见问题
    nodejs和mongodb实践
    mongodb数据库实践笔记
    两次分页显示内容——先少后多显示
    Java进阶4表达式中的陷阱
    Java进阶3. 内存回收机制
    Java进阶1. Synchronized 关键字
    Java复习9网路编程
    Java复习8.多线程
  • 原文地址:https://www.cnblogs.com/zyl910/p/intrin01_mmx.html
Copyright © 2020-2023  润新知