在这个小代码示例中:
__m128i twos = _mm_set_epi32(2,3,1,2);
__m128i foo = _mm_set_epi32(128,128,128,128);
__m128i shifted = _mm_srl_epi32(foo,twos);
“移位”充满了零,而我期望它们两个充满四个32位整数,其值分别为32,16,64和32。我使用内在的错误吗?
答案 0 :(得分:4)
是的,您使用不当。 _mm_srl_epi32()
的第二个参数指定了第一个参数移位的位数,但它不是您所期望的向量参数,允许您将每个32位整数移位不同的位数。相反,128位参数被截断为64位,结果计数用于确定要移位的位数;相同的移位量用于第一个参数中的所有4个整数。在您的情况下,低64位是0x0000000100000010
,其评估为非常大的正数。这会导致foo
的所有元素在所有位都被移出时被刷新为零。
找到所有指令的所有细节的好地方是英特尔的AVX Programmer's Reference。虽然标题可能有些用词不当,但该文档包含所有SSE / SSE2 /.../ AVX / AVX2指令的说明以及英特尔C ++编译器中可用的内在函数的说明(通常也可在gcc
中找到和别的)。在文档中搜索_mm_srl_epi32
可以准确地解释指令的作用。