Assembly 是否可以使用SSE和SSE2生成128位宽的整数?

Assembly 是否可以使用SSE和SSE2生成128位宽的整数?,assembly,sse,sse2,Assembly,Sse,Sse2,我希望更多地了解SSE2的功能,并想知道是否可以生成一个支持加法、减法、异或和乘法的128位宽整数?SIMD旨在同时处理多个小值,因此不会有任何结转到更高的单元,您必须手动执行。在SSE2中没有进位标志,但您可以轻松地计算进位,如carry=sum

我希望更多地了解SSE2的功能,并想知道是否可以生成一个支持加法、减法、异或和乘法的128位宽整数?

SIMD旨在同时处理多个小值,因此不会有任何结转到更高的单元,您必须手动执行。在SSE2中没有进位标志,但您可以轻松地计算进位,如
carry=sum
carry=sum
等。更糟糕的是,SSE2也没有64位比较,所以您必须使用一些类似的解决方法

这是一个基于上述思想的未经测试、未优化的C代码:

inline bool lessthan(_m128i a,_m128i b){
a=_mm_xor_si128(a,_mm_set1_epi32(0x8000000));
b=_mm_xor_si128(b,_mm_set1_epi32(0x8000000));
__m128i t=_mm_cmplt_epi32(a,b);
__m128i u=_mm_cmpgt_epi32(a,b);
__m128iz=_-mm_或_-si128(t,_-mm_-shuffle_-epi32(t,177));
z=_mm_和not_si128(_mm_shuffle_epi32(u,245),z);
返回_mm_cvtsi128_si32(z)&1;
}
直列m128i addi128(uuuuM128I a,_uuuM128IB)
{
__m128i总和=_mm_add_epi64(a,b);
__m128i掩码=_mm_set1_epi64(0x80000000000000);
if(小于(_mm_xor_si128(掩码,求和),_mm_xor_si128(掩码,a)))
{
__m128i-ONE=_-mm_-setr_-epi64(0,1);
总和=_mm_add_epi64(总和,一);
}
回报金额;
}
如您所见,该代码需要更多的指令,即使经过优化,它也可能比x86_64中的简单2 ADD/ADC对(或x86中的4条指令)长得多


不过,如果要并行添加多个128位整数,SSE2将有所帮助。但是,您需要正确地安排值的高部分和低部分,以便我们可以一次添加所有低部分,同时添加所有高部分

另见


仅有的128位操作是OR、XOR和shift。加法和减法的上限为64位,较新的乘法最多允许32位。为了实现128位加法,您需要手动处理进位标志,并首先失去执行进位标志的所有性能优势。@BitBank:有和,也有和,但您的观点仍然有效-SSE2中没有128位算术运算。从技术上讲,您可以。但是没有非位指令可以这样做。所以你必须模仿所有东西——在这一点上,它不会比在x64上使用进位标志更好……感谢你的回答(好吧,评论!)非常遗憾,有一秒钟我以为我们手中已经有了128位处理器。但是,任何SSE的更高版本都有128位的函数吗?您可以与SSE4.1进行64位相等比较,但我仍然认为它不会比简单的标量代码快。我想您是指SSE4.2而不是SSE4.1中的PCMPGTQ(比较大于的压缩有符号64位数据)。