2016-08-21 78 views

回答

2

XMVectorSetX實際上能夠使用SSE或ARM-NEON內在函數,而XMVectorSetByIndex必須「溢出到內存」(即根本不是SIMD)。

// Set a single indexed floating point component 
inline XMVECTOR XM_CALLCONV XMVectorSetByIndex(FXMVECTOR V, float f, size_t i) 
{ 
    assert(i < 4); 
    _Analysis_assume_(i < 4); 
#if defined(_XM_NO_INTRINSICS_) 
    XMVECTOR U; 
    U = V; 
    U.vector4_f32[i] = f; 
    return U; 
#elif defined(_XM_ARM_NEON_INTRINSICS_) 
    XMVECTOR U = V; 
    U.n128_f32[i] = f; 
    return U; 
#elif defined(_XM_SSE_INTRINSICS_) 
    XMVECTOR U = V; 
    U.m128_f32[i] = f; 
    return U; 
#endif 
}  

// Sets the X component of a vector to a passed floating point value 
inline XMVECTOR XM_CALLCONV XMVectorSetX(FXMVECTOR V, float x) 
{ 
#if defined(_XM_NO_INTRINSICS_) 
    XMVECTOR U; 
    U.vector4_f32[0] = x; 
    U.vector4_f32[1] = V.vector4_f32[1]; 
    U.vector4_f32[2] = V.vector4_f32[2]; 
    U.vector4_f32[3] = V.vector4_f32[3]; 
    return U; 
#elif defined(_XM_ARM_NEON_INTRINSICS_) 
    return vsetq_lane_f32(x,V,0); 
#elif defined(_XM_SSE_INTRINSICS_) 
    XMVECTOR vResult = _mm_set_ss(x); 
    vResult = _mm_move_ss(V,vResult); 
    return vResult; 
#endif 
} 

這是信息在XMVectorSetY情況看,以及在那裏與/arch:AVX/arch:AVX2它能夠使用SSE4指令_mm_insert_ps否則它必須做的工作的公平位獲得SIMD代碼生成,而不必「泄漏到內存」。

inline XMVECTOR XM_CALLCONV XMVectorSetY(FXMVECTOR V, float y) 
{ 
#if defined(_XM_NO_INTRINSICS_) 
    XMVECTOR U; 
    U.vector4_f32[0] = V.vector4_f32[0]; 
    U.vector4_f32[1] = y; 
    U.vector4_f32[2] = V.vector4_f32[2]; 
    U.vector4_f32[3] = V.vector4_f32[3]; 
    return U; 
#elif defined(_XM_ARM_NEON_INTRINSICS_) 
    return vsetq_lane_f32(y,V,1); 
#elif defined(_XM_SSE4_INTRINSICS_) 
    XMVECTOR vResult = _mm_set_ss(y); 
    vResult = _mm_insert_ps(V, vResult, 0x10); 
    return vResult; 
#elif defined(_XM_SSE_INTRINSICS_) 
    // Swap y and x 
    XMVECTOR vResult = XM_PERMUTE_PS(V,_MM_SHUFFLE(3,2,0,1)); 
    // Convert input to vector 
    XMVECTOR vTemp = _mm_set_ss(y); 
    // Replace the x component 
    vResult = _mm_move_ss(vResult,vTemp); 
    // Swap y and x again 
    vResult = XM_PERMUTE_PS(vResult,_MM_SHUFFLE(3,2,0,1)); 
    return vResult; 
#endif 
} 

注意DirectXMath現已有GitHub

相關問題