作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
基本上我想做的是获取一个 __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/
我是一名优秀的程序员,十分优秀!