作者: zyl910

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


R:寄存器。M:64位MM寄存器;X:128位XMM寄存器;Y:256位YMM寄存器。
Name:函数名。
Name2:另一种函数名。
功能:功能描述。
Asm:汇编指令。
PCode:伪代码。

转换.符32位至单精度.低位2个 CVTPI2PS for(i=0;i<2;++i){ r.fS[i]=(float)m2.iD[i]; } for(i=2;i<4;++i){ r.fS[i]=m1.fS[i]; } _mm_cvtss_f32 转换.提取低32位的单精度浮点数 r=m1.fS[0] _mm_cvtss_si64 转换.单精度至符64位.标量 CVTSS2SI r=(int64)m1.fS[0] _mm_cvttss_si64 截尾法转换.单精度至符32位.标量 CVTTSS2SI r=(int64)TRUNC(m1.fS[0]) _mm_cvtsi64_ss 转换.符64位至单精度.标量 CVTSI2SS r.fS[0]=(float)m2; for(i=1;i<4;++i){ r.fS[i]=m1.fS[i]; } _mm_shuffle_ps 混洗.单精.2源 SHUFPS for(i=0;i<2;++i){ r.fS[i]=m1.fS[(_Imm8>>(i*2)) & 3]; } for(i=2;i<4;++i){ r.fS[i]=m2.fS[(_Imm8>>(i*2)) & 3]; } _mm_unpackhi_ps 高位解包.单精 UNPCKHPS for(i=0;i<1;++i){ r.fS[i*2]=m1.fS[2+i]; r.fS[i*2+1]=m2.fS[2+i]; } _mm_unpacklo_ps 低位解包.单精 UNPCKLPS for(i=0;i<1;++i){ r.fS[i*2]=m1.fS[i]; r.fS[i*2+1]=m2.fS[i]; } _mm_loadh_pi 高位传送.加载 64位 MOVHPS reg, mem m1.mQ[1]=*m2; _mm_movehl_ps 高到低传送.高位2组 MOVHLPS r=m1; for(i=0;i<2;++i){ r.fS[i]=m2.fS[2+i]; } _mm_movelh_ps 低到高传送.低位2组 MOVLHPS r=m1; for(i=0;i<2;++i){ r.fS[2+i]=m2.fS[2]; } _mm_storeh_pi 高位传送.存储64位 MOVHPS mem, reg *A=m2.mQ[1]; _mm_loadl_pi 低位传送.加载64位 MOVLPS reg, mem m1.mQ[0]=*m2; _mm_storel_pi 低位传送.存储64位 MOVLPS mem, reg *A=m2.mQ[0]; _mm_movemask_ps 传送符号位生成掩码.单精 MOVMSKPS r=0; for(i=0;i<4;++i){ r<<=1; r|=SBIT(m1.fS[i]); } _m_pextrw _mm_extract_pi16 传送.提取.16位 PEXTRW r = ZX(m1.uW[imm8]) _m_pinsrw _mm_insert_pi16 传送.插入.16位 PINSRW m1.uW[imm8]=(WORD)m2 _m_pmaxsw _mm_max_pi16 最大.带16位.紧缩 PMAXSW for(i=0;i<4;++i){ r.iW[i]=MAX(m1.iW[i],m2.iW[i]); } _m_pmaxub _mm_max_pu8 最大.无8位 .紧缩 PMAXUB for(i=0;i<8;++i){ r.uB[i]=MAX(m1.uB[i],m2.uB[i]); } _m_pminsw _mm_min_pi16 最小.带16位.紧缩 PMINSW for(i=0;i<4;++i){ r.iW[i]=MIN(m1.iW[i],m2.iW[i]); } _m_pminub _mm_min_pu8 最小.无8位.紧缩 PMINUB for(i=0;i<8;++i){ r.uB[i]=MIN(m1.uB[i],m2.uB[i]); } _m_pmovmskb _mm_movemask_pi8 传送符号位生成掩码.字节 PMOVMSKB r=0; for(i=0;i<8;++i){ r<<=1; r|=SBIT(m1.iB[i]); } _m_pmulhuw _mm_mulhi_pu16 乘法高位.无16位 PMULHUW for(i=0;i<4;++i){ r.uW[i]=hi16(m1.uW[i]*m1.uW[i]); } _m_pshufw _mm_shuffle_pi16 混洗.字.1源 PSHUFW for(i=0;i<3;++i){ r.uW[i]=m1.uW[(imm8>>(i*2)) & 3]; } _m_maskmovq _mm_maskmove_si64 选择性传送.8字节 MASKMOVQ for(i=0;i<8;++i){ if(SBIT(m2.iB[i])) P[i]=m1.iB[i]; } _m_pavgb _mm_avg_pu8 平均值.无8位 PAVGB for(i=0;i<8;++i){ r.uB[i]=AVG(m1.uB[i],m2.uB[i]); } _m_pavgw _mm_avg_pu16 平均值.无16位 PAVGW for(i=0;i<4;++i){ r.uW[i]=AVG(m1.uW[i],m2.uW[i]); } _m_psadbw _mm_sad_pu8 绝对差.无8位,再水平 8 求和 PSADBW r=0; for(i=0;i<8;++i){ r.uW[0]+=ABS((WORD)m1.uB[i] - m2.uB[i]); } _mm_set_ss 赋值.单精.标量 r.fS[0]=arg[0]; for(i=1;i<4;++i){ r.fS[i]=0; } _mm_set_ps1 _mm_set1_ps 重复赋值.单精.紧缩 for(i=0;i<4;++i){ r.fS[i]=arg[0]); } _mm_set_ps 赋值.单精.紧缩 for(i=0;i<4;++i){ r.fS[i]=arg[i]); } _mm_setr_ps 逆序赋值.单精.紧缩 for(i=0;i<4;++i){ r.fS[i]=arg[i?]); } _mm_setzero_ps 赋值为零.单精 . 紧缩 _mm_load_ss 加载.单精.标量 MOVSS r.fS[0]=_A[0]; for(i=1;i<4;++i){ r.fS[i]=0; } _mm_load_ps1 _mm_load1_ps 重复加载.单精.紧缩 MOVSS + Shuffling for(i=0;i<4;++i){ r.fS[i]=_A[0]); } _mm_load_ps 加载.单精.紧缩.对齐 MOVAPS for(i=0;i<4;++i){ r.fS[i]=_A[i]); } _mm_loadr_ps 逆序加载.单精.紧缩.对齐 MOVAPS + Shuffling for(i=0;i<4;++i){ r.fS[i]=_A[3-i]); } _mm_loadu_ps 加载.单精.紧缩.非对齐 MOVUPS for(i=0;i<4;++i){ r.fS[i]=_A[i]); } _mm_store_ss 存储.单精.标量 MOVSS _A[0]=m1.fS[0] _mm_store_ps1 _mm_store1_ps 重复存储.单精.紧缩 MOVSS + Shuffling for(i=0;i<4;++i){ _A[i]=m1.fS[0]); } _mm_store_ps 存储.单精.紧缩.对齐 MOVAPS for(i=0;i<4;++i){ _A[i]=m1.fS[i]); } _mm_storer_ps 逆序存储.单精.紧缩.对齐 MOVAPS + Shuffling for(i=0;i<4;++i){ _A[i]=m1.fS[3-i]); } _mm_storeu_ps 存储.单精.紧缩.非对齐 MOVUPS for(i=0;i<4;++i){ _A[i]=m1.fS[i]); } _mm_move_ss 标量传送.单精 MOVSS m1.fS[0]=m2.fS[0] _mm_prefetch 缓存.预取 PREFETCH http://msdn.microsoft.com/en-us/library/84szxsww(v=vs.110).aspx _mm_stream_pi 非时间性存储.mm MOVNTQ *_A=m1 _mm_stream_ps 非时间性存储.单精度 MOVNTPS *_A=m1 _mm_sfence SFENCE http://msdn.microsoft.com/en-us/library/5h2w73d1(v=vs.110).aspx _mm_getcsr 获取MXCSR STMXCSR r=MXCSR _mm_setcsr 设置MXCSR LDMXCSR MXCSR=m1 _mm_malloc mm分配内存(IGL) # IGL 转换.单精度至符16位.紧缩4个 _ inline _mm_packs_pi32(_mm_cvtps_pi32(a), _mm_cvtps_pi32(_mm_movehl_ps(a, a))); _mm_cvtpi8_ps 转换.符8位至单精度.低位4个 _ inline _mm_cvtpi16_ps(_mm_unpacklo_pi8(a, _mm_cmpgt_pi8(_mm_setzero_si64(), a))); _mm_cvtpu8_ps 转换.无8位至单精度.低位4个 _ inline _mm_cvtpu16_ps(_mm_unpacklo_pi8(a, _mm_setzero_si64())); _mm_cvtps_pi8 转换.单精度至符8位.低位4个 _ inline _mm_packs_pi16(_mm_cvtps_pi16(a), _mm_setzero_si64()); _mm_cvtpi32x2_ps 转换.符32位至单精度.2源 _ inline _mm_movelh_ps(_mm_cvt_pi2ps(_mm_setzero_ps(), a), _mm_cvt_pi2ps(_mm_setzero_ps(), b));