我正在写一些SSE/AVX代码,有一个任务是用一个压缩的有符号32位整数除以2的补码当值为正时,此移位工作正常,但由于移位符号位,它会对负值产生错误的结果。
是否有任何SIMD操作允许我移位以保留符号位的位置?谢谢

最佳答案

SSE2/AVX2可以选择16位和32位元素大小的算术右移与逻辑右移(对于64位元素,只有逻辑元素在AVX512之前可用)。
使用_mm_srai_epi32psrad)而不是_mm_srli_epi32psrld)。
请参见SSE tag wiki中的Intel's intrinsics guide和其他链接。(如果需要,请过滤它以排除AVX512,因为这几天所有3种大小的屏蔽版本都很混乱…)
或者只看一下asm指令集引用,它包含有它们的指令的内部函数在https://stackoverflow.com/tags/sse/info中搜索“算术”可找到所需的移位。
注意a=算术与l=逻辑,而不是通常的无符号的epu32内在命名方案asm助记符简单且一致(例如,压缩右移算术Dword=psrad)。
算术右移位也可用于AVX2变量移位(vpsravd),以及用于立即移位的所有元素版本的一个变量。
脚注1:
算术右移在符号位的副本中移位,而不是零。
这正确地实现了2的补码有符号除法,除法是2的幂,向负无穷取整,这与从C有符号除法中向零截断不同。查看int foo(int a){return a/4;}的asm输出,了解编译器如何根据移位实现带符号的除法语义。

关于c - 使用SIMD右移32位压缩负数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51853561/

10-11 16:34