【问题标题】:Bitwise cast from __m128 to __m128i on MSVC在 MSVC 上按位转换从 __m128 到 __m128i
【发布时间】:2012-11-17 21:22:38
【问题描述】:

在 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,它会进行数值上有意义的转换。

【问题讨论】:

    标签: visual-studio sse


    【解决方案1】:

    使用 MSVC,您需要使用:

    _mm_castsi128_ps 用于从__m128i__m128 的按位转换

    _mm_castps_si128 用于从__m128__m128i 的按位转换

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

    【讨论】:

    • 如果你使用-flax-vector-conversions (gcc, icc),你实际上可以不用任何演员就可以逃脱
    • 现在的问题是,如果一个canmust 在其他编译器上使用正常类型转换,即这些类型类型转换是否存在于 gcc icc 和所有其他方法,从而提供一个独立于平台的解决方案(这完全是内在函数的要点之一)?我自己总是走reinterpret_cast(或其C指针转换版本)的丑陋方式,编译器当然也将其制成noop,但它看起来不太好,内在将是一个更清晰的选择.
    • @Christian:不幸的是,在 SSE 内在函数等方面,MS 与文明世界之间存在各种细微差异 - 我有一个通用头文件,用于实现包装器和各种宏的可移植 SSE 代码为不同的平台有条件地编译。
    • @PaulR 所以 gccicc、...不支持这些类型转换?
    • @ChristianRau:我迟到了,但从 GCC 4 开始支持这些(根据bug tracker;我已经在 4.9 中验证了它)。
    猜你喜欢
    • 2015-08-03
    • 2011-05-24
    • 2015-03-29
    • 2020-07-22
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多