这段代码有什么问题?我正在使用GCC 6.3。
a.cpp:在函数'int main()':`a.cpp:26:24:错误:在{}内将'18446744069414584320ull'从'long long unsigned int'转换为'int'的转换变窄{} [-缩小]
#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;
}
答案 0 :(得分:1)
类型__m64
和__m128
非常特殊,代表向量寄存器,这意味着您不能以通常的方式为它们分配值(就像您似乎在尝试在代码中进行操作) 。您需要使用特殊的加载函数将数据放入寄存器,并使用特殊的存储函数从那里获取数据。
以下是如何将数据(四个浮点数)加载到__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/
答案 1 :(得分:1)
#define const_epi32( i3,i2,i1,i0 ) \
{ _m_from_int64( (static_cast<unsigned long long>(i1) << 32), \
_m_from_int64( (static_cast<unsigned long long>(i3) << 32) }
答案 2 :(得分:0)
部分const_epi32(0, 0,-1, -1)
引起警告,因为您正在将'0xffffFFFFffffFFFFFF'分配给正在缩小的32位'int'。
我认为其他情况不会引起警告,因为分配的值是一个不变的0,不会变窄。
另一个问题是,为什么__m64
是int
。我假设__m64
无法直接分配给(即MM寄存器),并且缩小检查(至少对于常量分配而言)在编译器中是虚假的。