这段代码有什么问题?我正在使用GCC 6.3。

https://ideone.com/ektGEp


#include <iostream>
using namespace std;
#include <smmintrin.h>
#include <emmintrin.h>
#include <tmmintrin.h>

typedef union {
        __m64  mm64[2];
        __m128 mm128i;
} sse2_t;

#define const_epi32( i3,i2,i1,i0 )      \
            { static_cast<unsigned long long> (static_cast<unsigned long long>(i1) << 32), \
              static_cast<unsigned long long> (static_cast<unsigned long long>(i3) << 32) }

int main() {

        sse2_t arr_val[3] = { const_epi32(0,-1,0,-1),
                          const_epi32(0, 0,-1, -1),
                          const_epi32(0, 0,0, 1024)
                        }; //error!

        sse2_t val = const_epi32(0,-1,0,-1); // ok!
        // your code goes here
        return 0;
}

最佳答案

__m64__m128类型非常特殊,代表 vector 寄存器,这意味着您不能以通常的方式为它们分配值(就像您似乎在尝试在代码中这样做)。您需要使用特殊的加载函数将数据放入寄存器,并使用特殊的存储函数从那里取回数据。

这是一个如何将数据(四个浮点数)加载到__m128变量中的示例:

#include <cstring>
#include <smmintrin.h>
int main() {
  float f[4];
  memset(f, 0, 16);
  __m128 a = _mm_load_ps(f);
  return 0;
}

此页面包含有关可用的所有不同类型和内部函数的大量信息:https://software.intel.com/sites/landingpage/IntrinsicsGuide/

关于c++ - 错误:在{}内将 ‘18446744069414584320ull’从 ‘long long unsigned int’转换为 ‘int’ [-Wnarrowing],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55734441/

10-11 18:44