将 8 位 sse 寄存器转换为 16 位短路

标签 c optimization sse

我有一个 __m128i 寄存器,其中包含 8 位值,内容为:

{-4,10,10,10,10,10,10,-4,-4,10,10,10,10,10,10,-4} 

现在我想将它转换为 _m128i 寄存器中的八个 16 位值。它应该看起来像:

{-4,10,10,10,10,10,10,-4}

如何用尽可能少的指令做到这一点? 我最多想用SSSE3。

最佳答案

假设您只想要 16 个值中的前 8 个值而忽略其他 8 个值(您提供的示例数据有些模糊),那么您可以像这样使用 SSE2:

v = _mm_srai_epi16(_mm_unpacklo_epi8(v, v), 8);

关于将 8 位 sse 寄存器转换为 16 位短路,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13069976/

相关文章:

javascript - 为什么向后迭代数组比向前迭代更快

matlab - 确定峰值的位置和值

c - 如何有效地计算只有几个周期长的函数的执行时间?

c - 天真的梯形逻辑比因式逻辑更好吗?

c - 一种将跟踪和回溯包含到 C 程序中的简单、统一和可移植的方法

c - 使用 c 的缓冲区溢出

java - 多次执行 if(false) 不好吗?

c++ - SSE/优化 - 将数组复制到更大的数组

创建子字符串的 C 错误 - 可能是内存错误?

c - 为什么这个程序最后总是显示U