这段代码有什么问题?我正在使用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/