从类型'int'分配类型'__m128i'时不兼容的类型

时间:2013-09-11 12:42:14

标签: c linux

我最近一直在研究分组密码模式(加密)。 我对OCB(Offset codebook)非常感兴趣并试图实现它。 我使用了算法作者提供的实现。 我现在收到错误。这些错误的深度对我来说有点太深了。

下面列出的错误很多。我试着读一下_m128i的用途, 但我从未真正触及任何与之相关的事情。 (不是Linux经验) 我觉得它可能与OS /编译器/设置有关吗?

错误:

从类型'int'分配类型'__m128i'时

不兼容的类型

*(使用gcc运行:gcc -march = native -O3 ocb.c timing_x86-1.c)*

任何见解都会非常感激。

修改

以下是错误发生位置的示例。 (__m128i转换)

static void AES_128_Key_Expansion(const unsigned char *userkey, void *key)
{
__m128i x0,x1,x2;
__m128i *kp = (__m128i *)key;
kp[0] = x0 = _mm_loadu_si128((__m128i*)userkey);
x2 = _mm_setzero_si128();
EXPAND_ASSIST(x0,x1,x2,x0,255,1);   kp[1]  = x0;
EXPAND_ASSIST(x0,x1,x2,x0,255,2);   kp[2]  = x0;
EXPAND_ASSIST(x0,x1,x2,x0,255,4);   kp[3]  = x0;
EXPAND_ASSIST(x0,x1,x2,x0,255,8);   kp[4]  = x0;
EXPAND_ASSIST(x0,x1,x2,x0,255,16);  kp[5]  = x0;
EXPAND_ASSIST(x0,x1,x2,x0,255,32);  kp[6]  = x0;
EXPAND_ASSIST(x0,x1,x2,x0,255,64);  kp[7]  = x0;
EXPAND_ASSIST(x0,x1,x2,x0,255,128); kp[8]  = x0;
EXPAND_ASSIST(x0,x1,x2,x0,255,27);  kp[9]  = x0;
EXPAND_ASSIST(x0,x1,x2,x0,255,54);  kp[10] = x0;
}

#define EXPAND_ASSIST(v1,v2,v3,v4,shuff_const,aes_const)                    \
v2 = _mm_aeskeygenassist_si128(v4,aes_const);                           \
v3 = _mm_castps_si128(_mm_shuffle_ps(_mm_castsi128_ps(v3),              \
                                     _mm_castsi128_ps(v1), 16));        \
v1 = _mm_xor_si128(v1,v3);                                              \
v3 = _mm_castps_si128(_mm_shuffle_ps(_mm_castsi128_ps(v3),              \
                                     _mm_castsi128_ps(v1), 140));       \
v1 = _mm_xor_si128(v1,v3);                                              \
v2 = _mm_shuffle_epi32(v2,shuff_const);                                 \
v1 = _mm_xor_si128(v1,v2)

#define EXPAND192_STEP(idx,aes_const)                                       \
EXPAND_ASSIST(x0,x1,x2,x3,85,aes_const);                                \
x3 = _mm_xor_si128(x3,_mm_slli_si128 (x3, 4));                          \
x3 = _mm_xor_si128(x3,_mm_shuffle_epi32(x0, 255));                      \
kp[idx] = _mm_castps_si128(_mm_shuffle_ps(_mm_castsi128_ps(tmp),        \
                                          _mm_castsi128_ps(x0), 68));   \
kp[idx+1] = _mm_castps_si128(_mm_shuffle_ps(_mm_castsi128_ps(x0),       \
                                            _mm_castsi128_ps(x3), 78)); \
EXPAND_ASSIST(x0,x1,x2,x3,85,(aes_const*2));                            \
x3 = _mm_xor_si128(x3,_mm_slli_si128 (x3, 4));                          \
x3 = _mm_xor_si128(x3,_mm_shuffle_epi32(x0, 255));                      \
kp[idx+2] = x0; tmp = x3

1 个答案:

答案 0 :(得分:1)

您无法将其转换为机器寄存器。这就是load命令正在为你做的事情。

您只需直接提供指向加载命令的指针而无需强制转换。它将从ram复制到向量寄存器。演员不能那样做。