代码之家  ›  专栏  ›  技术社区  ›  Antonin GAVREL

从double转换为m128

  •  0
  • Antonin GAVREL  · 技术社区  · 5 年前

    我正在寻找一种方法,将double转换为a_m128,以利用内部指令。

    我试着用:

    double d = 7654321.1234567;
    _m128 ret =  *reinterpret_cast<__m128*>(d);
    

    error: invalid cast from type ‘double’ to type ‘__m128* {aka __vector(4) float*}’
    

    任何帮助将非常感谢,内联装配解决方案是好的~

    1 回复  |  直到 5 年前
        1
  •  2
  •   Peter Cordes    5 年前

    假设你真的想要 double ( __m128d ),你在找 _mm_set_sd(d) 将双精度扩展到零 喜欢 _mm_set_pd(0, d) .

    Intel's intrinsics guide (double 找到需要 (或 double* )阿格。

    __m128 是4的向量 float ;是否要将双->浮点转换为向量的低位元素?就像 _mm_set_ps(0.f, 0.f, 0.f, d);


    __m128d* 因为向量的宽度是 双重的 . 如果有什么能说得通的话 (__m128d)d 或者是一个静态的或者重新解释的版本。

    但不幸的是,没办法对一个 使用未定义的上元素AFAIK,即使标量浮点/双精度和 __m128d型 How to merge a scalar into a vector without the compiler wasting an instruction zeroing upper elements? Design limitation in Intel's intrinsics?

    一些编译器(很可能仍然只是叮当声)可以优化零扩展或广播到 __m128d型 向量,如果只使用标量内部函数,然后提取标量结果。其他编译器实际上是在上层元素上浪费指令。