如何将 __m128i 有符号整数限制为 SSE 中的非负无符号整数
How do I clamp __m128i signed integers into non-negative unsigned integers in SSE
我不知道如何将存储在单个 __m128i 中的 4 x 32 位带符号整数转换为“无符号”整数。转换应该通过值截断来完成,将负数限制为 0 但保持非负数不变。
例如:-100应该变成0,而100应该保持100
#include <stdio.h>
#include <cstdint>
#include <emmintrin.h>
int main()
{
alignas(16) uint32_t out32u[4];
__m128i my = _mm_setr_epi32 (100, -200, 0, -500);
<....missing code....>
_mm_store_si128(reinterpret_cast<__m128i *>(out32u), my);
printf("%u %u %u %u\n", out32u[0], out32u[1], out32u[2], out32u[3]);
}
所以鉴于
<....missing code....>
添加上面代码的结果应该是:
100 0 0 0
使用 SSE4.1 _mm_max_epi32
作为:
my = _mm_max_epi32(my, _mm_setzero_si128());
或者没有它,@chtz 的优雅 a & ~(a >> 31)
可以使用 SSE2 实现如下:
my = _mm_andnot_si128(_mm_srai_epi32(my, 31), my);
用上面的行替换<....missing code....>
。
我不知道如何将存储在单个 __m128i 中的 4 x 32 位带符号整数转换为“无符号”整数。转换应该通过值截断来完成,将负数限制为 0 但保持非负数不变。
例如:-100应该变成0,而100应该保持100
#include <stdio.h>
#include <cstdint>
#include <emmintrin.h>
int main()
{
alignas(16) uint32_t out32u[4];
__m128i my = _mm_setr_epi32 (100, -200, 0, -500);
<....missing code....>
_mm_store_si128(reinterpret_cast<__m128i *>(out32u), my);
printf("%u %u %u %u\n", out32u[0], out32u[1], out32u[2], out32u[3]);
}
所以鉴于
<....missing code....>
添加上面代码的结果应该是:
100 0 0 0
使用 SSE4.1 _mm_max_epi32
作为:
my = _mm_max_epi32(my, _mm_setzero_si128());
或者没有它,@chtz 的优雅 a & ~(a >> 31)
可以使用 SSE2 实现如下:
my = _mm_andnot_si128(_mm_srai_epi32(my, 31), my);
用上面的行替换<....missing code....>
。