Проверка целочисленного переполнения SSE2

При использовании инструкций SSE2, таких как PADDD(т. е. встроенный _mm_add_epi32), есть ли способ проверить, какая-либо из операций переполнена?

Я думал, что после переполнения может быть установлен флаг в управляющем регистре MXCSR, но я не вижу, чтобы это происходило. Например, _mm_getcsr()выводит одно и то же значение в обоих приведенных ниже случаях (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;
}

Есть ли другой способ проверить переполнение с помощью SSE2?

19
задан Mysticial 9 May 2012 в 06:46
поделиться