Directx 什么';当索引=0时,XMVectorSetByIndex和XMVectorSetX之间的差异是多少?

Directx 什么';当索引=0时,XMVectorSetByIndex和XMVectorSetX之间的差异是多少?,directx,directx-11,directxmath,Directx,Directx 11,Directxmath,我阅读了DirectXMath库的源代码,发现xmvectorstebyindex和XMVectorSetX的实现完全不同。为什么不XMVectorSetX简单地返回xmvectorsetbyndex(index=0)?XMVectorSetX实际上能够使用SSE或ARM-NEON内部函数,而xmvectorsetbyndex必须“溢出到内存”(即它根本不是SIMD) 查看XMVectorSetY案例,以及使用/arch:AVX或/arch:AVX2它能够使用SSE4指令\u mm\u inse

我阅读了DirectXMath库的源代码,发现
xmvectorstebyindex
XMVectorSetX
的实现完全不同。为什么不
XMVectorSetX
简单地返回
xmvectorsetbyndex
(index=0)?

XMVectorSetX
实际上能够使用SSE或ARM-NEON内部函数,而
xmvectorsetbyndex
必须“溢出到内存”(即它根本不是SIMD)

查看
XMVectorSetY
案例,以及使用
/arch:AVX
/arch:AVX2
它能够使用SSE4指令
\u mm\u insert\u 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现在在上可用

// 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
}
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
}