sse - 使用 AVX/AVX2/SSE __m128i 将所有负字节设置为 -128 (0x80) 并保留所有其他字节

标签 sse simd avx avx2

基本上我想做的是获取一个 __m128i 寄存器并将每个负字节的值设置为 -128 (0x80) 并且不更改任何正值。

确切的是:

signed char __m128_as_char_arr[16] = {some data};
for(int i = 0; i < 16; i++) {
     if (__m128_as_char_arr[i] < 0) { //alternative __m128_as_char_arr[i] & 0x80
           __m128_as_char_arr[i] = 0x80;
     }

}

我认为最好的方法是:

__m128i v = some data;
int mask = _mm_movemask_epi8(_mm_cmpgt_epi8(_mm_set1_epi8(0xff), v));

// use mask in some way to only set chars with 1s bit set

但我不知道 (1) 使用什么指令来仅设置与 mask 相关的字节以及 (2) 是否有更好的方法来做到这一点(要么没有掩码全部或更好的方法来生成掩码)。

最佳答案

您可以将值视为无符号并使用最小运算(_mm_min_epu8 ),例如

v = _mm_min_epu8(v, _mm_set1_epi8(128));

这不仅是一条廉价指令,而且适用于 SSE2 及更高版本。

关于sse - 使用 AVX/AVX2/SSE __m128i 将所有负字节设置为 -128 (0x80) 并保留所有其他字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62587929/

相关文章:

C++ AVX2 内在函数非标准大小

c - 奇怪的/fp 浮点模型标志行为

c++ - 为什么在使用快速数学时 GCC 或 Clang 不优化 1 条指令的倒数

c++ - 使用SSE指令的图像最大值

c++ - 在 Visual Studio 中检测 SSE/SSE2 指令集的可用性

c++ - 加速收集

optimization - 将 3D 数学转换为 SSE 或其他 SIMD 的速度有多少?

c - 这种悲伤教导的奇怪行为的原因是什么?

intrinsics - 如何使用 AVX-512 实现 16 位和 32 位整数插入和提取操作?

c - 等同于 AVX 中的 SSE unpacklo_ps/unpackhi_ps(对于 double )