簡體   English   中英

如何在 SSE 中將 __m128i 有符號整數鉗制為非負無符號整數

[英]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....>替換為上面的行。

為這兩種方法生成的程序集

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM