Как указать верхнюю / нижнюю часть двойного слова операнда с помощью встроенной сборки llvm-gcc?

В GCC4.2(Xcode3) я использую%R0/%Q0, чтобы указать верхнюю / нижнюю часть операнда двойного слова во встроенной сборке. Но следующий код генерирует ошибку в llvm-gcc (Xcode4): ошибка: недопустимый операнд во встроенном asm: 'mov ${0:D}, $1

Может кто-нибудь указать мне решение?

    long long v1 = 0;
    long v2 = 1;
    __asm__(
        "mov %R0, %1\n\t"
        : "=&r" (v1)
        : "r" (v2)
    );

1 ответ

Это не поддерживается в текущих версиях llvm-gcc или clang (компилятор Apple LLVM). В качестве обходного пути вы можете разделить 64-битное значение на две 32-битные переменные и повторно собрать 64-битное значение с помощью сдвигов и т. Д. Сгенерированный код должен выглядеть так же.

Другие вопросы по тегам