0

我想要一个 __m128i 变量,并做一些这样的操作:

unsigned char* myArray;
__m128i fourValues;

//Do some strange reference assignment, e.g.:
//int32_t& a = *((int32_t*) &fourValues);
//int32_t& b = *(((int32_t*) &fourValues) + 1);
//int32_t& c = *(((int32_t*) &fourValues) + 2);
//int32_t& d = *(((int32_t*) &fourValues) + 3);

for (int i =0; i < someSize; i+=4) {
  a = d + myArray[i];
  b = a + myArray[i+1];
  c = b + myArray[i+2];
  d = c + myArray[i+3];
  //Do something with fourValues;
  }

其中 a,b,c,d 是(或表现为)int32_t 变量,并且是fourValues 的第一个、第二个、第三个和第四个32 位。那可能吗?

4

1 回答 1

0

您可以使用

int _mm_extract_epi32( 
   __m128i a,
   const int ndx 
);

见 - http://msdn.microsoft.com/en-us/library/bb531460%28v=vs.90%29.aspx

编辑:请注意,这仅适用于 int SSE 向量,我看到这里有很多争论 - Get member of __m128 by index? ,它指的是 __m128,但在您的情况下,应该可以使用它。尽管如此,总是值得提醒一下,这对于浮点数来说还不够通用。

正如您所指出的,对于写作,您可以使用等效的 _mm_insert_epi32。

于 2013-10-16T14:12:24.770 回答