Ошибка SSE в моем процессоре? - PullRequest
2 голосов
/ 07 ноября 2011

Я очень тупой.

Когда я запускаю этот код в Visual C ++ 2008:

__m128i a, b;
a.m128i_u64[0] = 1;
b.m128i_u64[0] = 0;
a.m128i_u64[1] = 0;
b.m128i_u64[1] = 0;
printf("%d\n", _mm_testc_si128(a, b));

печатает 1. Что противоречит тому, что я ожидаю, потому что это должно быть 1, только если a и b одинаковы.

Как это возможно? Есть ли ошибка в моем процессоре или в Visual C ++ 2008 или что-то еще?

1 Ответ

5 голосов
/ 07 ноября 2011

Я точно знаю, что многие встроенные функции SSE4.1 не работают в VS2008.Они исправили их для VS2010.В VS2010 (без SP) некоторые свойства AVX нарушены.Они исправили их в VS2010 SP1.

Я никогда не использовал встроенную функцию _mm_testc_si128, поэтому я не знаю, является ли это другой встроенной функцией, которая нарушена в VS2008.Но я видел множество случаев, когда внутренние / вставные извлечения были нарушены.

РЕДАКТИРОВАТЬ: Я только что проверил это в VS2010 SP1, он также дает 1.

Теперь, когдаЯ смотрю на документацию , похоже, что она "должна" возвращать 1.

Возвращаемое значение

1, если установлены все биты, установленные в bв;в противном случае 0.

Так что я не думаю, что это ошибка в этом случае.

...