Instructions函數對照表:02 xmmintrin.h與SSE指令集

原文地址:http://www.cnblogs.com/zyl910/archive/2012/07/31/intrin02_sse.html
R:寄存器。M:64位MM寄存器;X:128位XMM寄存器;Y:256位YMM寄存器。
Name:函數名。
Name2:另一種函數名。
功能:功能描述。
Asm:彙編指令。
PCode:僞代碼。

R Name Name2 功能 Asm PCode
X _MM_SHUFFLE   混洗的掩碼.4 # http://msdn.microsoft.com/en-us/library/4d3eabky(vs.71).aspx
X _MM_TRANSPOSE4_PS   矩陣轉置.4x4 # http://msdn.microsoft.com/en-us/library/5hah127h(v=vs.71).aspx
X _MM_SET_EXCEPTION_STATE 狀態.設置異常狀態 # http://msdn.microsoft.com/en-us/library/s61ysx0a(v=vs.71).aspx
X _MM_GET_EXCEPTION_STATE 狀態.取得異常狀態 # http://msdn.microsoft.com/en-us/library/7kzfa3h8(v=vs.71).aspx
X _MM_SET_EXCEPTION_MASK 狀態.設置異常掩碼 # http://msdn.microsoft.com/en-us/library/7ad8d8fy(v=vs.71).aspx
X _MM_GET_EXCEPTION_MASK 狀態.取得異常掩碼 # http://msdn.microsoft.com/en-us/library/f13f3eaz(v=vs.71).aspx
X _MM_SET_ROUNDING_MODE 狀態.設置舍入模式 # http://msdn.microsoft.com/en-us/library/y70z2105(v=vs.71).aspx
X _MM_GET_ROUNDING_MODE 狀態.取得舍入模式 # http://msdn.microsoft.com/en-us/library/wc7hx623(v=vs.71).aspx
X _MM_SET_FLUSH_ZERO_MODE 狀態.設置下溢清零模式 # http://msdn.microsoft.com/en-us/library/a8b5ts9s(v=vs.71).aspx
X _MM_GET_FLUSH_ZERO_MODE 狀態.取得下溢清零模式 # http://msdn.microsoft.com/en-us/library/5207b86e(v=vs.71).aspx
X _mm_add_ss   加法.單精.標量 ADDSS r.fS[0]=m1.fS[0]+m2.fS[0]; for(i=1;i<4;++i){ r.fS[i]=m1.fS[i]; }
X _mm_add_ps   加法.單精.緊縮 ADDPS for(i=0;i<4;++i){ r.fS[i]=m1.fS[i]+m2.fS[i]; }
X _mm_sub_ss   減法.單精.標量 SUBSS r.fS[0]=m1.fS[0]-m2.fS[0]; for(i=1;i<4;++i){ r.fS[i]=m1.fS[i]; }
X _mm_sub_ps   減法.單精.緊縮 SUBPS for(i=0;i<4;++i){ r.fS[i]=m1.fS[i]-m2.fS[i]; }
X _mm_mul_ss   乘法.單精.標量 MULSS r.fS[0]=m1.fS[0]*m2.fS[0]; for(i=1;i<4;++i){ r.fS[i]=m1.fS[i]; }
X _mm_mul_ps   乘法.單精.緊縮 MULPS for(i=0;i<4;++i){ r.fS[i]=m1.fS[i]*m2.fS[i]; }
X _mm_div_ss   除法.單精.標量 DIVSS r.fS[0]=m1.fS[0]/m2.fS[0]; for(i=1;i<4;++i){ r.fS[i]=m1.fS[i]; }
X _mm_div_ps   除法.單精.緊縮 DIVPS for(i=0;i<4;++i){ r.fS[i]=m1.fS[i]/m2.fS[i]; }
X _mm_sqrt_ss   平方根.單精.標量 SQRTSS r.fS[0]=sqrt(m1.fS[0]); for(i=1;i<4;++i){ r.fS[i]=m1.fS[i]; }
X _mm_sqrt_ps   平方根.單精.緊縮 SQRTPS for(i=0;i<4;++i){ r.fS[i]=sqrt(m1.fS[i]); }
X _mm_rcp_ss   倒數.單精.標量 RCPSS r.fS[0]=1/m1.fS[0]; for(i=1;i<4;++i){ r.fS[i]=m1.fS[i]; }
X _mm_rcp_ps   倒數.單精.緊縮 RCPPS for(i=0;i<4;++i){ r.fS[i]=1/m1.fS[i]; }
X _mm_rsqrt_ss   平方根的倒數.單精.標量 RSQRTSS r.fS[0]=1/sqrt(m1.fS[0]); for(i=1;i<4;++i){ r.fS[i]=m1.fS[i]; }
X _mm_rsqrt_ps   平方根的倒數.單精.緊縮 RSQRTPS for(i=0;i<4;++i){ r.fS[i]=1/sqrt(m1.fS[i]); }
X _mm_min_ss   最小值.單精.標量 MINSS r.fS[0]=min(m1.fS[0], m2.fS[0]); for(i=1;i<4;++i){ r.fS[i]=m1.fS[i]; }
X _mm_min_ps   最小值.單精.緊縮 MINPS for(i=0;i<4;++i){ r.fS[i]=min(m1.fS[i], m2.fS[i]); }
X _mm_max_ss   最大值.單精.標量 MAXSS r.fS[0]=max(m1.fS[0], m2.fS[0]); for(i=1;i<4;++i){ r.fS[i]=m1.fS[i]; }
X _mm_max_ps   最大值.單精.緊縮 MAXPS for(i=0;i<4;++i){ r.fS[i]=max(m1.fS[i], m2.fS[i]); }
X _mm_and_ps   邏輯位與.單精 ANDPS for(i=0;i<4;++i){ r.fS[i]=m1.fS[i]&m2.fS[i]; }
X _mm_andnot_ps   邏輯位與非.單精 ANDNPS for(i=0;i<4;++i){ r.fS[i]=(!m1.fS[i])&m2.fS[i]; }
X _mm_or_ps   邏輯位或.單精 ORPS for(i=0;i<4;++i){ r.fS[i]=m1.fS[i]|m2.fS[i]; }
X _mm_xor_ps   邏輯位異或.單精 XORPS for(i=0;i<4;++i){ r.fS[i]=m1.fS[i]^m2.fS[i]; }
X _mm_cmpeq_ss   比較.等於.單精.標量 CMPEQSS r = BM(m1.fS[0] @ m2.fS[0])
X _mm_cmpeq_ps   比較.等於.單精.緊縮 CMPEQPS for(i=0;i<4;++i){ r.fS[i]=BM(m1.fS[i] @ m2.fS[i]); }
X _mm_cmplt_ss   比較.小於.單精.標量 CMPLTSS r = BM(m1.fS[0] @ m2.fS[0])
X _mm_cmplt_ps   比較.小於.單精.緊縮 CMPLTPS for(i=0;i<4;++i){ r.fS[i]=BM(m1.fS[i] @ m2.fS[i]); }
X _mm_cmple_ss   比較.小於等於.單精.標量 CMPLESS r = BM(m1.fS[0] @ m2.fS[0])
X _mm_cmple_ps   比較.小於等於.單精.緊縮 CMPLEPS for(i=0;i<4;++i){ r.fS[i]=BM(m1.fS[i] @ m2.fS[i]); }
X _mm_cmpgt_ss   比較.大於.單精.標量 CMPGTSS r = BM(m1.fS[0] @ m2.fS[0])
X _mm_cmpgt_ps   比較.大於.單精.緊縮 CMPGTPS for(i=0;i<4;++i){ r.fS[i]=BM(m1.fS[i] @ m2.fS[i]); }
X _mm_cmpge_ss   比較.大於等於.單精.標量 CMPLESS r = BM(m1.fS[0] @ m2.fS[0])
X _mm_cmpge_ps   比較.大於等於.單精.緊縮 CMPLEPS for(i=0;i<4;++i){ r.fS[i]=BM(m1.fS[i] @ m2.fS[i]); }
X _mm_cmpneq_ss   比較.不等於.單精.標量 CMPNEQSS r = BM(m1.fS[0] @ m2.fS[0])
X _mm_cmpneq_ps   比較.不等於.單精.緊縮 CMPNEQPS for(i=0;i<4;++i){ r.fS[i]=BM(m1.fS[i] @ m2.fS[i]); }
X _mm_cmpnlt_ss   比較.不小於.單精.標量 CMPNLTSS r = BM(m1.fS[0] @ m2.fS[0])
X _mm_cmpnlt_ps   比較.不小於.單精.緊縮 CMPNLTPS for(i=0;i<4;++i){ r.fS[i]=BM(m1.fS[i] @ m2.fS[i]); }
X _mm_cmpnle_ss   比較.不小於等於.單精.標量 CMPNLESS r = BM(m1.fS[0] @ m2.fS[0])
X _mm_cmpnle_ps   比較.不小於等於.單精.緊縮 CMPNLEPS for(i=0;i<4;++i){ r.fS[i]=BM(m1.fS[i] @ m2.fS[i]); }
X _mm_cmpngt_ss   比較.不大於.單精.標量 CMPNLTSS r = BM(m1.fS[0] @ m2.fS[0])
X _mm_cmpngt_ps   比較.不大於.單精.緊縮 CMPNLTPS for(i=0;i<4;++i){ r.fS[i]=BM(m1.fS[i] @ m2.fS[i]); }
X _mm_cmpnge_ss   比較.不大於等於.單精.標量 CMPNLESS r = BM(m1.fS[0] @ m2.fS[0])
X _mm_cmpnge_ps   比較.不大於等於.單精 CMPNLEPS for(i=0;i<4;++i){ r.fS[i]=BM(m1.fS[i] @ m2.fS[i]); }
X _mm_cmpord_ss   比較.有序.單精.標量 CMPORDSS r = BM(m1.fS[0] @ m2.fS[0])
X _mm_cmpord_ps   比較.有序.單精.緊縮 CMPORDPS for(i=0;i<4;++i){ r.fS[i]=BM(m1.fS[i] @ m2.fS[i]); }
X _mm_cmpunord_ss   比較.無序.單精.標量 CMPUNORDSS r = BM(m1.fS[0] @ m2.fS[0])
X _mm_cmpunord_ps   比較.無序.單精.緊縮 CMPUNORDPS for(i=0;i<4;++i){ r.fS[i]=BM(m1.fS[i] @ m2.fS[i]); }
X _mm_comieq_ss   有序比較並設標誌.相等.單精 COMISS r = EFLAGS(m1.fS[0] @ m2.fS[0])
X _mm_comilt_ss   有序比較並設標誌.小於.單精 COMISS r = EFLAGS(m1.fS[0] @ m2.fS[0])
X _mm_comile_ss   有序比較並設標誌.小於等於.單精 COMISS r = EFLAGS(m1.fS[0] @ m2.fS[0])
X _mm_comigt_ss   有序比較並設標誌.大於.單精 COMISS r = EFLAGS(m1.fS[0] @ m2.fS[0])
X _mm_comige_ss   有序比較並設標誌.大於等於.單精 COMISS r = EFLAGS(m1.fS[0] @ m2.fS[0])
X _mm_comineq_ss   有序比較並設標誌.不等於.單精 COMISS r = EFLAGS(m1.fS[0] @ m2.fS[0])
X _mm_ucomieq_ss   無序比較並設標誌.相等.單精 UCOMISS r = EFLAGS(m1.fS[0] @ m2.fS[0])
X _mm_ucomilt_ss   無序比較並設標誌.小於.單精 UCOMISS r = EFLAGS(m1.fS[0] @ m2.fS[0])
X _mm_ucomile_ss   無序比較並設標誌.小於等於.單精 UCOMISS r = EFLAGS(m1.fS[0] @ m2.fS[0])
X _mm_ucomigt_ss   無序比較並設標誌.大於.單精 UCOMISS r = EFLAGS(m1.fS[0] @ m2.fS[0])
X _mm_ucomige_ss   無序比較並設標誌.大於等於.單精 UCOMISS r = EFLAGS(m1.fS[0] @ m2.fS[0])
X _mm_ucomineq_ss   無序比較並設標誌.不等於.單精 UCOMISS r = EFLAGS(m1.fS[0] @ m2.fS[0])
X _mm_cvt_ss2si _mm_cvtss_si32 轉換.單精度至符32位.標量 CVTSS2SI r=(int32)m1.fS[0]
X _mm_cvt_ps2pi _mm_cvtps_pi32 轉換.單精度至符32位.低位2個 CVTPS2PI for(i=0;i<2;++i){ r.iD[i]=(int32)m1.fS[i]; }
X _mm_cvtt_ss2si _mm_cvttss_si32 截尾法轉換.單精度至符32位.標量 CVTTSS2SI r=(int32)TRUNC(m1.fS[0])
X _mm_cvtt_ps2pi _mm_cvttps_pi32 截尾法轉換.單精度至符32位.低位2個 CVTTPS2PI for(i=0;i<2;++i){ r.iD[i]=(int32)TRUNC(m1.fS[i]); }
X _mm_cvt_si2ss _mm_cvtsi32_ss 轉換.符32位至單精度.標量 CVTSI2SS r.fS[0]=(float)m2; for(i=1;i<4;++i){ r.fS[i]=m1.fS[i]; }
X _mm_cvt_pi2ps _mm_cvtpi32_ps 轉換.符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]; }
X _mm_cvtss_f32   轉換.提取低32位的單精度浮點數   r=m1.fS[0]
X _mm_cvtss_si64   轉換.單精度至符64位.標量 CVTSS2SI r=(int64)m1.fS[0]
X _mm_cvttss_si64   截尾法轉換.單精度至符32位.標量 CVTTSS2SI r=(int64)TRUNC(m1.fS[0])
X _mm_cvtsi64_ss   轉換.符64位至單精度.標量 CVTSI2SS r.fS[0]=(float)m2; for(i=1;i<4;++i){ r.fS[i]=m1.fS[i]; }
X _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]; }
X _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]; }
X _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]; }
X _mm_loadh_pi   高位傳送.加載64位 MOVHPS reg, mem m1.mQ[1]=*m2;
X _mm_movehl_ps   高到低傳送.高位2組 MOVHLPS r=m1; for(i=0;i<2;++i){ r.fS[i]=m2.fS[2+i]; }
X _mm_movelh_ps   低到高傳送.低位2組 MOVLHPS r=m1; for(i=0;i<2;++i){ r.fS[2+i]=m2.fS[2]; }
X _mm_storeh_pi   高位傳送.存儲64位 MOVHPS mem, reg *A=m2.mQ[1];
X _mm_loadl_pi   低位傳送.加載64位 MOVLPS reg, mem m1.mQ[0]=*m2;
X _mm_storel_pi   低位傳送.存儲64位 MOVLPS mem, reg *A=m2.mQ[0];
X _mm_movemask_ps   傳送符號位生成掩碼.單精 MOVMSKPS r=0; for(i=0;i<4;++i){ r<<=1; r|=SBIT(m1.fS[i]); }
M _m_pextrw _mm_extract_pi16 傳送.提取.16位 PEXTRW r = ZX(m1.uW[imm8])
M _m_pinsrw _mm_insert_pi16 傳送.插入.16位 PINSRW m1.uW[imm8]=(WORD)m2
M _m_pmaxsw _mm_max_pi16 最大.帶16位.緊縮 PMAXSW for(i=0;i<4;++i){ r.iW[i]=MAX(m1.iW[i],m2.iW[i]); }
M _m_pmaxub _mm_max_pu8 最大.無8位.緊縮 PMAXUB for(i=0;i<8;++i){ r.uB[i]=MAX(m1.uB[i],m2.uB[i]); }
M _m_pminsw _mm_min_pi16 最小.帶16位.緊縮 PMINSW for(i=0;i<4;++i){ r.iW[i]=MIN(m1.iW[i],m2.iW[i]); }
M _m_pminub _mm_min_pu8 最小.無8位.緊縮 PMINUB for(i=0;i<8;++i){ r.uB[i]=MIN(m1.uB[i],m2.uB[i]); }
M _m_pmovmskb _mm_movemask_pi8 傳送符號位生成掩碼.字節 PMOVMSKB r=0; for(i=0;i<8;++i){ r<<=1; r|=SBIT(m1.iB[i]); }
M _m_pmulhuw _mm_mulhi_pu16 乘法高位.無16位 PMULHUW for(i=0;i<4;++i){ r.uW[i]=hi16(m1.uW[i]*m1.uW[i]); }
M _m_pshufw _mm_shuffle_pi16 混洗.字.1源 PSHUFW for(i=0;i<3;++i){ r.uW[i]=m1.uW[(imm8>>(i*2)) & 3]; }
M _m_maskmovq _mm_maskmove_si64 選擇性傳送.8字節 MASKMOVQ for(i=0;i<8;++i){ if(SBIT(m2.iB[i])) P[i]=m1.iB[i]; }
M _m_pavgb _mm_avg_pu8 平均值.無8位 PAVGB for(i=0;i<8;++i){ r.uB[i]=AVG(m1.uB[i],m2.uB[i]); }
M _m_pavgw _mm_avg_pu16 平均值.無16位 PAVGW for(i=0;i<4;++i){ r.uW[i]=AVG(m1.uW[i],m2.uW[i]); }
M _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]); }
X _mm_set_ss   賦值.單精.標量   r.fS[0]=arg[0]; for(i=1;i<4;++i){ r.fS[i]=0; }
X _mm_set_ps1 _mm_set1_ps 重複賦值.單精.緊縮   for(i=0;i<4;++i){ r.fS[i]=arg[0]); }
X _mm_set_ps   賦值.單精.緊縮   for(i=0;i<4;++i){ r.fS[i]=arg[i]); }
X _mm_setr_ps   逆序賦值.單精.緊縮   for(i=0;i<4;++i){ r.fS[i]=arg[i?]); }
X _mm_setzero_ps   賦值爲零.單精.緊縮   r=0
X _mm_load_ss   加載.單精.標量 MOVSS r.fS[0]=_A[0]; for(i=1;i<4;++i){ r.fS[i]=0; }
X _mm_load_ps1 _mm_load1_ps 重複加載.單精.緊縮 MOVSS + Shuffling for(i=0;i<4;++i){ r.fS[i]=_A[0]); }
X _mm_load_ps   加載.單精.緊縮.對齊 MOVAPS for(i=0;i<4;++i){ r.fS[i]=_A[i]); }
X _mm_loadr_ps   逆序加載.單精.緊縮.對齊 MOVAPS + Shuffling for(i=0;i<4;++i){ r.fS[i]=_A[3-i]); }
X _mm_loadu_ps   加載.單精.緊縮.非對齊 MOVUPS for(i=0;i<4;++i){ r.fS[i]=_A[i]); }
X _mm_store_ss   存儲.單精.標量 MOVSS _A[0]=m1.fS[0]
X _mm_store_ps1 _mm_store1_ps 重複存儲.單精.緊縮 MOVSS + Shuffling for(i=0;i<4;++i){ _A[i]=m1.fS[0]); }
X _mm_store_ps   存儲.單精.緊縮.對齊 MOVAPS for(i=0;i<4;++i){ _A[i]=m1.fS[i]); }
X _mm_storer_ps   逆序存儲.單精.緊縮.對齊 MOVAPS + Shuffling for(i=0;i<4;++i){ _A[i]=m1.fS[3-i]); }
X _mm_storeu_ps   存儲.單精.緊縮.非對齊 MOVUPS for(i=0;i<4;++i){ _A[i]=m1.fS[i]); }
X _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
M _mm_stream_pi   非時間性存儲.mm MOVNTQ *_A=m1
X _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  
  _mm_free   mm釋放內存(IGL) #IGL  
X _mm_cvtpi16_ps   轉換.符16位至單精度.緊縮4個 _inline for(i=0;i<4;++i){ r.fS[i]=(float)m1.iW[i]); }
X _mm_cvtpu16_ps   轉換.無16位至單精度.緊縮4個 _inline for(i=0;i<4;++i){ r.fS[i]=(float)m1.uW[i]); }
X _mm_cvtps_pi16   轉換.單精度至符16位.緊縮4個 _inline _mm_packs_pi32(_mm_cvtps_pi32(a), _mm_cvtps_pi32(_mm_movehl_ps(a, a)));
X _mm_cvtpi8_ps   轉換.符8位至單精度.低位4個 _inline _mm_cvtpi16_ps(_mm_unpacklo_pi8(a, _mm_cmpgt_pi8(_mm_setzero_si64(), a)));
X _mm_cvtpu8_ps   轉換.無8位至單精度.低位4個 _inline _mm_cvtpu16_ps(_mm_unpacklo_pi8(a, _mm_setzero_si64()));
X _mm_cvtps_pi8   轉換.單精度至符8位.低位4個 _inline _mm_packs_pi16(_mm_cvtps_pi16(a), _mm_setzero_si64());
X _mm_cvtpi32x2_ps   轉換.符32位至單精度.2源 _inline _mm_movelh_ps(_mm_cvt_pi2ps(_mm_setzero_ps(), a), _mm_cvt_pi2ps(_mm_setzero_ps(), b));
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章