Al usar instrucciones SSE2 como PADDD
(es decir, el _mm_add_epi32
intrínseco), ¿hay alguna forma de comprobar si alguna de las operaciones se desbordó?Comprobación de desbordamiento de entero SSE2
Pensé que tal vez una bandera en el registro de control MXCSR podría establecerse después de un desbordamiento, pero no veo que eso suceda. Por ejemplo, _mm_getcsr()
imprime el mismo valor en ambos casos por debajo (8064):
#include <iostream>
#include <emmintrin.h>
using namespace std;
void main()
{
__m128i a = _mm_set_epi32(1, 0, 0, 0);
__m128i b = _mm_add_epi32(a, a);
cout << "MXCSR: " << _mm_getcsr() << endl;
cout << "Result: " << b.m128i_i32[3] << endl;
__m128i c = _mm_set_epi32((1<<31)-1, 3, 2, 1);
__m128i d = _mm_add_epi32(c, c);
cout << "MXCSR: " << _mm_getcsr() << endl;
cout << "Result: " << d.m128i_i32[3] << endl;
}
¿Hay alguna otra manera de comprobar si hay desbordamiento con SSE2?
puede repetir el cálculo en modo de saturación (PADDS) y comparar los resultados. –
¿Está interesado en el desbordamiento firmado o sin firmar? –
@Dmitri: no hay un agregado de saturación de 32 bits en SSE2 (solo 8 bit y 16 bit) –