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的索引超出范围。
答案 0 :(得分:2)
更快的循环将移动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
变量,以便它有足够的空间来填充填充所需的额外零。