for (int i = 0; i < someValue; i += 4) {
  __m64 mmxValue;

  if (i + 3 < someValue) {
      mmxValue = _mm_set_pi16(_buffer[i], _buffer[i + 1], _buffer[i + 2], _buffer[i + 3]);
      // add and use result
  } else if (i + 2 < someValue) {
      mmxValue = _mm_set_pi16(_buffer[i], _buffer[i + 1], _buffer[i + 2], 0);
      // add and use result
  } else if (i + 1 < someValue) {
      mmxValue = _mm_set_pi16(_buffer[i], _buffer[i + 1], 0, 0);
      // add and use result
  } else {
      mmxValue = _mm_set_pi16(_buffer[i], 0, 0, 0);
      // add and use result
  }
}


我正在尝试使用最多4个16位带符号的值设置mmxValue,然后在每种情况下将其用于加法运算。

我想知道是否有可能以一种更好的方式重写使用较少条件(或根本不使用)的方式。

之所以存在这些条件,是因为对于i> = someValue的值,_buffer的索引超出范围。

最佳答案

更快的循环将移动4,直到您到达最后一个块

int i = 0;
while (i <= somevalue-4) {
    mmxValue = _mm_set_pi16(_buffer[i],
                            _buffer[i+1],
                            _buffer[i+2],
                            _buffer[i+3]);
    ... use the the result ...
    i += 4;
}
... handle only last block with conditionals ...


当然,更好的办法是尽可能扩大_buffer变量,以便为填充所需的额外零空间。

10-04 15:04