2017-08-19 10 views
1
uint8_t* dataPtr; 
uint8x8x4_t dataVec; 
__asm__ __volatile__("vldmia %1, %h0" : "=w"(dataVec) : "r"(dataPtr)); 

code assembleur en ligne Au-dessus ARM fonctionne très bien lorsqu'il est compilé avec Android NDK en utilisant GCC pour armeabi-v7a ABI toolchain. Cependant, je reçois l'erreur suivante du compilateur lorsque je passe à ClangARM Clang: ne peut pas allouer registre de sortie pour la contrainte 'w'

error: couldn't allocate output register for constraint 'w'

Selon LLVM docs, la contrainte « w » peut être utilisé pour enregistrer SIMD sur la cible ARM.

Ai-je raté quelque chose? Quelqu'un at-il rencontré ce problème? Est-ce un bug dans LLVM?

Merci

+0

Sons comme vous ne l'avez pas dit gcc pour permettre SIMD extensions. En outre, vous pouvez envisager d'utiliser des builtins au lieu d'asm. –

+0

@DavidWohlferd: Je passe le drapeau du compilateur LOCAL_CFLAGS + = -mfpu = neon. J'ai plus de code NEON intrinsèque et d'assemblage qui compile bien. C'est comme ça que je sais que l'optimisation NEON est activée. –

Répondre

0

Comme mentionné dans le LLVM Docs:

The constraint codes are, in general, expected to behave the same way they do in GCC. LLVM’s support is often implemented on an ‘as-needed’ basis, to support C inline asm code which was supported by GCC. A mismatch in behavior between LLVM and GCC likely indicates a bug in LLVM.

Peut-être que c'est une bonne idée pour vous de le signaler sur https://bugs.llvm.org/