ARM Clang: не удалось выделить выходной регистр для ограничения 'w'

uint8_t* dataPtr;
uint8x8x4_t dataVec;
__asm__ __volatile__( "vldmia %1, %h0" : "=w"( dataVec ) : "r"( dataPtr ) );

Вышеупомянутый встроенный ассемблерный код ARM отлично работает при компиляции с Android NDK с использованием GCC инструментальной цепочки для armeabi-v7a ABI. Однако при переключении на Clang я получаю следующую ошибку компилятора

ошибка: не удалось выделить выходной регистр для ограничения 'w'

Согласно документам LLVM, можно использовать ограничение 'w' для регистрации SIMD на цели ARM.

Я что-то упускаю? Кто-нибудь сталкивался с этой проблемой? Это ошибка в LLVM?

Спасибо


person VP.    schedule 19.08.2017    source источник
comment
Похоже, вы не сказали gcc включить расширения simd. Кроме того, вы можете рассмотреть возможность использования встроенных функций вместо asm.   -  person David Wohlferd    schedule 19.08.2017
comment
@DavidWohlferd: я передаю флаг компилятора LOCAL_CFLAGS + = -mfpu = neon. У меня больше внутреннего и ассемблерного кода NEON, который компилируется нормально. Вот откуда я знаю, что оптимизация NEON включена.   -  person VP.    schedule 21.08.2017


Ответы (1)


Как упоминалось в документации LLVM:

Коды ограничений, как правило, должны вести себя так же, как и в GCC. Поддержка LLVM часто реализуется «по мере необходимости» для поддержки встроенного asm-кода C, который поддерживался GCC. Несоответствие в поведении LLVM и GCC, вероятно, указывает на ошибку в LLVM.

Возможно, вам стоит сообщить об этом на https://bugs.llvm.org/

person Bruno Alexandre Rosa    schedule 14.09.2017