Встроенная компиляция ELLCC LLVM завершается с некоторыми инструкциями asm против Thumb2 Cortex-M0

Инструкции, которые, как известно, действительны и успешно используются в Gnu G++, вызывают здесь некоторые ошибки в отношении Freescale MKL16Z Cortex-M0+ Thumb2.

Код:

/* setup the stack before we attempt anything else
   skip stack setup if __SP_INIT is 0
   assume sp is already setup. */
__asm (
"mov r0,%0\n\t"
"cmp r0,#0\n\t"
"beq skip_sp\n\t"
"mov sp,r0\n\t"
"sub sp,#4\n\t"
"mov r0,#0\n\t"
"mvn r0,r0\n\t"
"str r0,[sp,#0]\n\t"
"add sp,#4\n\t"
"skip_sp:\n\t"
::"r"(addr));

команда компиляции:

ecc -target thumb-linux-engeabi -mtune=cortex-m0plus -mcpu=cortex-m0plus -mthumb -O2 -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -Wall -Wconversion -Wpointer-arith -Wshadow -Wfloat-equal  -g3 -I"[redacted]" -I"[redacted]" -I"[redacted]" -I"[redacted]" -std=c99 -MMD -MP -MF"Project_Settings/Startup_Code/startup.d" -MT"Project_Settings/Startup_Code/startup.o" -c -o "Project_Settings/Startup_Code/startup.o" "../Project_Settings/Startup_Code/startup.c"
../Project_Settings/Startup_Code/startup.c:209:17: error: instruction requires: arm-mode
    "sub sp,#4\n\t"
                ^
<inline asm>:6:2: note: instantiated into assembly here
        mov r0,#0
        ^
../Project_Settings/Startup_Code/startup.c:210:17: error: invalid instruction
    "mov r0,#0\n\t"
                ^
<inline asm>:7:2: note: instantiated into assembly here
        mvn r0,r0
        ^~~
2 errors generated.
make: *** [Project_Settings/Startup_Code/startup.o] Error 1

Советы приветствуются! Интересно, смогу ли я переписать asm во что-то, используя более простые инструкции... это не похоже на непосредственное кодирование значений? Я не разбираюсь в сборке.

2 ответа

Решение

Я думаю, что компилятор говорит, что инструкция не существует в Thumb, а существует только в ARM.

В Thumb почти все инструкции по обработке данных обновляют флаги. Это означает, что:

MOV r0, #0

Не существует, но вместо этого:

MOVS r0, #0 ; Update NZCV flags

Заменив mov на movs, а mvn на mvns, мы получили компиляцию. Бинарный файл был в 6 раз больше, чем g++ по неизвестной причине. Кажется, что LLVM еще не имеет точного представления доступных инструкций на устройствах Cortex-M0+.

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