Assembly 是否可以使用SSE和SSE2生成128位宽的整数?
我希望更多地了解SSE2的功能,并想知道是否可以生成一个支持加法、减法、异或和乘法的128位宽整数?SIMD旨在同时处理多个小值,因此不会有任何结转到更高的单元,您必须手动执行。在SSE2中没有进位标志,但您可以轻松地计算进位,如Assembly 是否可以使用SSE和SSE2生成128位宽的整数?,assembly,sse,sse2,Assembly,Sse,Sse2,我希望更多地了解SSE2的功能,并想知道是否可以生成一个支持加法、减法、异或和乘法的128位宽整数?SIMD旨在同时处理多个小值,因此不会有任何结转到更高的单元,您必须手动执行。在SSE2中没有进位标志,但您可以轻松地计算进位,如carry=sum
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将有所帮助。但是,您需要正确地安排值的高部分和低部分,以便我们可以一次添加所有低部分,同时添加所有高部分 另见