我正在将使用 Intel SSE2 内在函数编写的例程移植到 Microsoft 32 位平台。它在 GCC、Clang 和 64 位 Windows 下运行良好。原始代码有效地执行了以下操作:
typedef unsigned __int64 word64;
// input is aligned on 16-byte boundary
void (const byte* input)
{
const word64 m0 = ((const word64*)input)[ 0];
const word64 m1 = ((const word64*)input)[ 8];
...
__m128 t0 = _mm_set_epi64x(m0, m1);
}
Microsoft 不提供 _mm_set_epi64x
在 32 位平台上,所以我想使用 _mm_set_epi64
.
现在的问题...首先,
__m64 m0, m1;
m0 = *(word64*)(input+0);
结果:
1> error C2679: binary '=' : no operator found which takes a right-hand operand
of type 'word64' (or there is no acceptable conversion)
1> c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\mmintrin.h(42):
could be '__m64 &__m64::operator =(const __m64 &)'
1> while trying to match the argument list '(__m64, word64)'
其次,试图回避 word64
的潜在问题并使用 unsigned __int64*
直接:
m0 = *(unsigned __int64*)(input+0);
结果相同:
1> blake2.cpp(530): error C2679: binary '=' : no operator found which takes a right-hand
operand of type 'unsigned __int64' (or there is no acceptable conversion)
第三,我翻看了<mmintrin.h>
并找到_m_from_int
:
m0 = _m_from_int(*(word64*)(input+0));
结果是:
1> blake2.cpp(529): warning C4244: 'argument' : conversion from 'word64'
to 'int', possible loss of data
目前我不确定还可以尝试什么。
如何加载 __m64
来自 64 位整数类型?
下面是微软对__m64
的声明,但我们应该将其视为不透明的:
typedef union __declspec(intrin_type) _CRT_ALIGN(8) __m64
{
unsigned __int64 m64_u64;
float m64_f32[2];
__int8 m64_i8[8];
__int16 m64_i16[4];
__int32 m64_i32[2];
__int64 m64_i64;
unsigned __int8 m64_u8[8];
unsigned __int16 m64_u16[4];
unsigned __int32 m64_u32[2];
} __m64;
最佳答案
首先我注意到您的输入是一个字节数组。从字节数组转换为多字节二进制(如 int64)时,您可能需要考虑字节顺序。出于这个问题的目的,我将忽略该问题,但如果您得到“看起来不对”的东西,则需要考虑。
在编译器的第一个错误中,编译器在将取消引用的指针转换为 word64 (unsigned __int64) 时遇到问题。我没有准备好访问标题,但我怀疑这可能与“常量”有关。你想要一个复制运算符(operator),但我相信你得到的是分配运算符(operator)。第二个编译器错误的相同问题 (m0 = (unsigned __int64)(input+0);)
您的第三个错误似乎是由 _m_to_int 期望一个带符号的 int64 并得到一个无符号的 int64 引起的。
我想知道是否有类似的东西:
const word64 *m0 = ((const word64*)input)[ 0];
或
const word64 m0 = &((const word64*)input);
可能有用吗?
关于c - 从 64 位整数类型加载 __m64?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36683925/