Podczas korzystania z instrukcji SSE2, takich jak PADDD
(tj. Wewnętrznie _mm_add_epi32
), istnieje sposób sprawdzenia, czy któraś z operacji została przepełniona?Kontrola przekroczenia liczby całkowitej SSE2
Pomyślałem, że być może flaga w rejestrze kontrolnym MXCSR może zostać ustawiona po przepełnieniu, ale nie widzę, żeby to się stało. Na przykład, _mm_getcsr()
drukuje taką samą wartość w obu przypadkach wymienionych poniżej (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;
}
Czy jest jakiś inny sposób na sprawdzenie przepełnienia z SSE2?
można powtórzyć obliczenia w trybie nasycenia (PADDS) i porównać wyniki. –
Czy jesteś zainteresowany podpisanym lub niepodpisanym przepełnieniem? –
@Dmitri: nie ma nasycenia 32-bitowego w SSE2 (tylko 8-bitowe i 16-bitowe). –