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
变量,以便为填充所需的额外零空间。