У меня проблема с __sync_fetch_and_and
, неправильно выполняющим.Я написал следующий код, чтобы проиллюстрировать это:
bool equal;
int64_t mask = 0x01234567BEEFDEAD;
int64_t orig = 0xDEADBEEF01234567;
int64_t test1, test2;
test1 = test2 = orig;
equal = (test1 == test2);
printf("Before anding\n");
printf("test1:\t0x%016llX\n", test1);
printf("test2:\t0x%016llX\n", test2);
printf("equal:\t%d\n", equal);
// Try anding
test1 &= mask;
__sync_fetch_and_and(&test2, mask);
equal = (test1 == test2);
printf("After anding\n");
printf("test1:\t0x%016llX\n", test1);
printf("test2:\t0x%016llX\n", test2);
printf("equal:\t%d\n", equal);
Вывод этого:
Before anding
test1: 0xDEADBEEF01234567
test2: 0xDEADBEEF01234567
equal: 1
After anding
test1: 0x0021046700234425
test2: 0xDFAFFFEFBFEFDFEF
equal: 0
... что, очевидно, не правильно.Я пытался заменить __sync_and_and_fetch
, но это не исправляет.Работа с `` __sync_fetch_and_or` работает правильно.Я использую Xcode 4.2.1 и компиляцию с компилятором по умолчанию Apple LLVM Compiler 3.0 (Clang).Когда я переключаюсь на использование GCC 4.2, он работает правильно.
Это, конечно, похоже на ошибку компилятора, но я не уверен, что я что-то не так делаю на Clang.Есть ли какие-то различия в Clang, которые я не учел, или это действительно ошибка?
РЕДАКТИРОВАТЬ: я не пробовал последнюю версию Clang (3.0), потому что я застрял с использованием XcodeТеперь.