我需要知道具有存储在 __m128 中的最大绝对值的值的符号。这是我现在的解决方案:
int getMaxSign(__m128 const& vec) {
static const __m128 SIGN_BIT_MASK =
_mm_castsi128_ps(_mm_set1_epi32(0x80000000));
// This creates an int, where sign(a) is 1 if a is negative, 0 o.w.:
// sign(a3)<<3 | sign(a2)<<2 | sign(a1)<<1 | sign(a0)
const int signMask = _mm_movemask_ps(vec);
// Get the absolute value of the vector;
__m128 absValsMMX = _mm_andnot_ps(SIGN_BIT_MASK, vec);
// Figure out the horizontal max
__declspec(align(16)) float absVals[4];
_mm_store_ps(absVals, absValsMMX);
const float maxVal = std::max(std::max(absVals[0], absVals[1]), absVals[2]);
return (maxVal == absVals[0] ? signMask & 0x1 :
(maxVal == absVals[1] ? signMask & 0x2 : signMask & 0x4));
}
在这种情况下,如果具有最大绝对值的值为负数,则符号将为 1,否则为 0,但我实际上并不关心约定是什么。另一件事是我使用这些 __m128s 表示同质向量,所以我知道最后一个值将始终为 0。
对于一个相对简单的任务,这似乎需要做很多工作。我怎样才能更快地做到这一点?
谢谢!