2016-08-21 9 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 
} 

/arch:AVX 또는 /arch:AVX2로이 작품의 공정한 조금 얻을 할 _mm_insert_ps은 그렇지가 가지고있는 SSE4 명령어를 사용할 수 어디뿐만 아니라 XMVectorSetY 경우를보고 유익한 SIMD code-gen 대신 '메모리에 누설'해야합니다. DirectXMath 지금 GitHub에 사용할 수 있음을

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 
} 

참고.