2015-11-24 4 views
1

Je suis en train de compiler un programme pour Raspberry Pi 2B (ARMv7/Neon), mais je reçois une erreur d'un code assembleur en ligne:Gcc se plaint de vstmia - pourquoi?

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

Le code est:

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): 
); 

drôle chose est qu'il ne se plaint pas de la première vstmia. J'ai essayé avec le {d0 - d32} d'abord et je pensais qu'il y avait peut-être trop de registres 64 bits, mais ce n'est évidemment pas le problème. vregs est un stockage aligné de 8 octets.

J'utilise bras-linux-gnueabihf-gcc 4.8.3, avec cette ligne de commande:

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

Quelle option '-mfpu =' passez-vous? – Notlikethat

+0

bras-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

OK, si vous ne spécifiez pas de FPU, vous obtiendrez la configuration par défaut du compilateur (vous pouvez vérifier la configuration de GCC avec' -v'). Je vais jeter une conjecture sauvage que cela se trouve être 'vfpv3-d16';) – Notlikethat

Répondre

3

En ne spécifiant pas une option -mfpu appropriée, vous obtenez tout le soutien FPU la configuration par défaut du compilateur fournit. De votre configuration dans ce cas, c'est --with-fpu=vfp, ce qui signifie VFPv2 vieux croustillant avec seulement 16 registres D recouvrant les 32 registres S. Ainsi, la première instruction ciblant d0 - d15 est correcte, mais l'assembleur refuse d'assembler la seconde instruction dont il sait qu'elle ne fonctionnera pas sur la cible choisie. Pour le Cortex-A7 avec NEON, Pour le Cortex-A7 avec NEON, le -mfpu=neon-vfpv4 informera la chaîne d'outils qu'elle peut déchirer et utiliser tout ce dont vous disposez.

+0

A-ha. On dirait que l'éclipse n'a pas ajouté ce drapeau même si je l'ai sélectionné. L'ajouter manuellement a fait l'affaire. – turboscrew

+0

Vous devriez envisager de remplacer vldmia par vld1.64 si vous pouvez répondre aux conditions d'alignement. Les VLD1/VST1 sont plus rapides lorsqu'elles sont combinées avec les spécificateurs d'alignement. –