¿Es posible usar SSE (v2) para hacer un entero de 128 bits de ancho?

Estoy buscando comprender un poco más las capacidades de SSE2, y me gustaría saber si se podría hacer un entero de 128 bits que admita la sum, la resta, el XOR y la multiplicación. Gracias, Erkling.

SSE2 no tiene indicador de acarreo, pero puede calcular fácilmente el acarreo como carry = sum < a o carry = sum < b como este . Pero, lo que es peor, SSE2 tampoco tiene comparaciones de 64 bits, por lo que debe usar algunas soluciones como la que se encuentra aquí.

Aquí hay un código C no evaluado y no evaluado basado en la idea anterior.

 inline bool lessthan(__m128i a, __m128i b){ a = _mm_xor_si128(a, _mm_set1_epi32(0x80000000)); b = _mm_xor_si128(b, _mm_set1_epi32(0x80000000)); __m128i t = _mm_cmplt_epi32(a, b); __m128i u = _mm_cmpgt_epi32(a, b); __m128i z = _mm_or_si128(t, _mm_shuffle_epi32(t, 177)); z = _mm_andnot_si128(_mm_shuffle_epi32(u, 245),z); return _mm_cvtsi128_si32(z) & 1; } inline __m128i addi128(__m128i a, __m128i b) { __m128i sum = _mm_add_epi64(a, b); __m128i mask = _mm_set1_epi64(0x8000000000000000); if (lessthan(_mm_xor_si128(mask, sum), _mm_xor_si128(mask, a))) { __m128i ONE = _mm_setr_epi64(0, 1); sum = _mm_add_epi64(sum, ONE); } return sum; } 

Como puede ver, el código requiere muchas más instrucciones e, incluso después de optimizado, puede ser mucho más extenso que una simple instrucción add / adc en x86_64 (o 4 en x86)