2015-11-24 6 views
1

Я пытаюсь скомпилировать программу для Raspberry Pi 2B (ARMv7/Neon), но я получаю сообщение об ошибке с кодом встроенного ассемблера:Gcc жалуется на vstmia - почему?

Error: VFP single precision register expected -- `vstmia.64 r9,{d16-d31}'

Код является:

asm volatile (
     "vstmia.64 %[reg]!, {d0 - d15} @ read all regs\n\t" 
     "vstmia.64 %[reg], {d16 - d31} @ read all regs\n\t" 
     ::[reg] "r" (&vregs): 
); 

Забавный Дело в том, что он не жалуется на первый vstmia. Сначала я попытался с одним {d0 - d32}, и я подумал, что, возможно, слишком много 64-битных регистров, но это, очевидно, не проблема. vregs - это 8-байтовая выровненная память.

Я использую нарукавный Linux-gnueabihf-GCC 4.8.3, с этой командной строкой:

arm-linux-gnueabihf-gcc -mcpu=cortex-a7 -marm -O2 -g -std=gnu11 -MMD -MP -MF"ARM_decode_table.d" -MT"ARM_decode_table.o" -c -o "ARM_decode_table.o" "../ARM_decode_table.c"

+0

Что вы хотите передать? -mfpu = '? – Notlikethat

+0

arm-linux-gnueabihf-gcc -mcpu = cortex-a7 -marm -O2 -g -std = gnu11 -MMD -MP -MF "ARM_decode_table.d" -MT "ARM_decode_table.o" -c -o "ARM_decode_table.o "" ../ARM_decode_table.c " – turboscrew

+0

ОК, если вы не укажете FPU, вы получите все настройки, заданные компилятором по умолчанию (вы можете проверить конфигурацию GCC на' -v'). Я собираюсь выкинуть дикую догадку, что это будет 'vfpv3-d16';) – Notlikethat

ответ

3

не определяя соответствующий -mfpu варианта, вы получите то, что FPU поддержки конфигурация компилятора по умолчанию обеспечивает. Из вашей конфигурации в этом случае это --with-fpu=vfp, что означает жесткий старый VFPv2 с только 16 D-регистрами, наложенными на 32 S-регистра. Таким образом, первый таргетинг на команды d0 - d15 в порядке, но сборщик отказывается собирать вторую инструкцию, которая, как она знает, не будет работать над выбранной мишенью.

Для Cortex-A7 с NEON, -mfpu=neon-vfpv4 позволит связующим инструментам знать, что он может разрешить копирование и использовать все, что у вас есть.

+0

A-ha. Похоже, что eclipse не добавляет этот флаг, даже если я его выбрал. Добавление его вручную сделало трюк. – turboscrew

+0

Вы должны рассмотреть возможность замены vldmia на vld1.64, если вы можете выполнить условия выравнивания. VLD1/VST1 быстрее с хорошим запасом в сочетании с спецификаторами выравнивания. –

 Смежные вопросы

  • Нет связанных вопросов^_^