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