Visual studio MSVC上从_m128到_m128i的逐位强制转换

Visual studio MSVC上从_m128到_m128i的逐位强制转换,visual-studio,sse,Visual Studio,Sse,在Linux和Mac上,可以这样做 __m128 x; __m128i n = (__m128i)x; 此操作将x的位表示形式复制到n,对于在SSE浮点寄存器上实现各种无分支条件操作非常有用。在MSVC 11上,它给出 eikonal-generated.h(1228) : error C2440: 'type cast' : cannot convert from '__m128' to '__m128i'; No constructor could take the source type

在Linux和Mac上,可以这样做

__m128 x;
__m128i n = (__m128i)x;
此操作将x的位表示形式复制到n,对于在SSE浮点寄存器上实现各种无分支条件操作非常有用。在MSVC 11上,它给出

eikonal-generated.h(1228) : error C2440: 'type cast' : cannot convert from '__m128' to '__m128i'; No constructor could take the source type, or constructor overload resolution was ambiguous
在Microsoft Visual Studio中,什么是等效的


请注意,我没有要求使用标准的浮点到整数转换函数_mm_cvtepi32_ps,它可以进行有数值意义的转换。

对于MSVC,您需要使用:

对于从
\uuum128i
\uuum128

用于从
\uuum128
\uuuum128i


对于其他编译器(gcc、ICC等),您可以只使用普通类型转换。

如果您使用
-flash向量转换(gcc、ICC),您实际上可以不使用任何类型转换。现在的问题是,您是否可以或必须在其他编译器上使用普通类型转换,即gcc、ICC和所有其他编译器中是否也存在这些类型转换属性,从而提供一个独立于平台的解决方案(这是intrinsics的主要特点之一)?就我自己而言,我总是用一种丑陋的方式来重新解释cast(或者它的C指针cast版本),当然编译器也会把它变成noop,然而,它看起来并不太好,而内在函数将是一个更清晰的选择。@Christian:不幸的是,在SSE内在函数等方面,MS和文明世界之间存在着各种细微的差异——我有一个通用的头文件,用于可移植的SSE代码,在那里我实现了包装器和各种宏,这些宏会被有条件地编译不同的平台。@PaulR所以gcc、icc上不支持这些类型转换?@ChristianRau:我迟到了,但这些都是从gcc 4开始支持的(根据;我已经在4.9中验证过)。