2016-08-21 3 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 code-gen вместо того, чтобы «проливать память».

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.

Смежные вопросы