c - 使用 SSE 在 __m128i vector 中获取最大值?

标签 c assembly x86 sse

我刚开始使用 SSE,我很困惑如何获得 __m128i 的最大整数值 (max)。例如:

__m128i t = _mm_setr_ps(0,1,2,3);
// max(t) = 3;

四处搜索使我找到了 MAXPS 指令,但我似乎无法找到如何将其与 "xmmintrin.h" 一起使用。

此外,是否有您推荐的 "xmmintrin.h" 文档,而不是查看头文件本身?

最佳答案

以防万一有人关心,并且由于内在函数似乎是最近的方式,这里是内在函数方面的解决方案。

int horizontal_max_Vec4i(__m128i x) {
    __m128i max1 = _mm_shuffle_epi32(x, _MM_SHUFFLE(0,0,3,2));
    __m128i max2 = _mm_max_epi32(x,max1);
    __m128i max3 = _mm_shuffle_epi32(max2, _MM_SHUFFLE(0,0,0,1));
    __m128i max4 = _mm_max_epi32(max2,max3);
    return _mm_cvtsi128_si32(max4);
}

我不知道这是否比这更好:

int horizontal_max_Vec4i(__m128i x) {
    int result[4] __attribute__((aligned(16))) = {0};
    _mm_store_si128((__m128i *) result, x);
    return max(max(max(result[0], result[1]), result[2]), result[3]); 
}

关于c - 使用 SSE 在 __m128i vector 中获取最大值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9877700/

相关文章:

c - 如何正确比较 C 中的字符串?

linux - ELF标签地址

syntax - 汇编代码解释

c - 枚举和一个以字符串形式返回月份名称的函数

c - 如何在函数内打印指向字符数组的指针?

c - K&R : array of character pointers

c - 修改栈上的返回地址

c - 解码汇编回调

c++ - C++17 中的算术溢出

assembly - x86 中 BND RET 的含义