提问者:小点点

如何在 SSE 中将__m128i有符号整数夹紧为非负无符号整数


我不知道如何将存储在单个__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]);
}

所以鉴于

100 0 0 0


共1个答案

匿名用户

将 SSE4.1 _mm_max_epi32用作:

my = _mm_max_epi32(my, _mm_setzero_si128());

或者没有这个,@chtz优雅

my = _mm_andnot_si128(_mm_srai_epi32(my, 31), my);

取代

为这两种方法生成的程序集。