假设有一个包含4个sp值的__m128
变量,并且您想要最小的一个,是否有任何可用的内部函数,或者除了这些值之间的简单线性比较之外的任何其他函数?
我的解决方案如下(假设输入__m128
变量为x
):
x = _mm_min_ps(x, (__m128)_mm_srli_si128((__m128i)x, 4));
min = _mm_min_ss(x, (__m128)_mm_srli_si128((__m128i)x, 8))[0];
这是相当可怕,但它的工作(顺便问一句,有什么像
_mm_srli_si128
除了__m128
类型?) 最佳答案
没有单一指令/内在指令,但您可以用两次洗牌和两分钟来完成:
__m128 _mm_hmin_ps(__m128 v)
{
v = _mm_min_ps(v, _mm_shuffle_ps(v, v, _MM_SHUFFLE(2, 1, 0, 3)));
v = _mm_min_ps(v, _mm_shuffle_ps(v, v, _MM_SHUFFLE(1, 0, 3, 2)));
return v;
}
输出向量将包含输入向量中所有元素的最小值,复制到整个输出向量中。