armcc жалуется, что `q0` не определено при компиляции неоновых сборок
int main(){
__asm volatile
{
// load data
vld1.16 {q0, q1}, [r0]!
...
используя команду
armcc --cpu=Cortex-A9 -O2 -Otime --vectorize --remarks -g --md --depend_format=unix_escaped --no_depend_system_headers -c -o test.o test.c
Это ошибка показывает, что
"test.c", line 7: Error: #20: identifier "q0" is undefined
vld1.16 {q0, q1}, [r0]!
^
"test.c", line 8: Error: #20: identifier "q2" is undefined
vld1.16 {q2, q3}, [r0]!
^
Я пропустил какие-либо флаги в armcc
команда?
armcc
версия
Product: ARM Compiler 5.05
Component: ARM Compiler 5.05 (build 41)
Tool: armcc [4d0eb9]
For support see http://www.arm.com/support/
Software supplied by: ARM Limited
1 ответ
Хотя я не использую armcc, я не верю, что ваш компилятор поддерживает встроенную сборку для NEON.
https://static.docs.arm.com/dui0472/k/DUI0472K_armcc_user_guide.pdf
Взгляните на раздел 7.3, в котором говорится:
7.3 Ограничения поддержки встроенного ассемблера в компиляторе
Встроенный ассемблер в компиляторе не поддерживает ряд инструкций. В частности, встроенный ассемблер не поддерживает:
• Язык сборки большого пальца в процессорах без технологии Thumb-2. • Инструкции VFP, которые были добавлены в VFPv3 или выше. • НЕОН инструкции. • Инструкция ARMv6 SETEND и некоторые системные расширения. • Инструкции ARMv5 BX, BLX и BXJ.
Причина, по которой он, вероятно, почти работает, заключается в том, что vld является частью VFPv2, который поддерживается, и только когда он доходит до "q", он запутывается.
Если бы вы использовали варианты gcc/clang, то да, я бы посоветовал вам неявно скомпилировать таргетинг NEON с -march=armv7-a -mfpu=neon
с указанием базовых ISA и расширений модуля с плавающей запятой, но только для использования встроенных функций компилятора, а не встроенной сборки. (Как указано в комментарии).