2013-03-09 25 views
6

Im compilazione del codice intrinseche NEON di prova seguente ARM (in Eclipse con Android NDK):costante fuori campo con intrinseche NEON

void foo(uint64_t* Res) 
{ 
    uint64_t x = 0xff12aa8902acf78dULL; 
    uint64x1_t a,b; 

    a = vld1_u64 (&x); 
    b = vext_u64 (a, a, 3); 
    vst1_u64 (Res,b); 
} 

ma continuo a ricevere il seguente errore del compilatore:

/home/developer/adt/ndk/ndk-build all 
Install  : libneon_test.so => libs/armeabi/libneon_test.so 
Compile thumb : neon_test <= neon.c 
jni/neon.c: In function 'foo': 
jni/neon.c:17:1: error: constant out of range 
make: *** [obj/local/armeabi-v7a/objs/neon_test/neon.o] Error 1` 

La riga 17 è l'ultima coppia } di foo().

Qualcuno ha un'idea di quale potrebbe essere la causa di questo strano errore?

+0

di che costante si parla? La riga 17 del codice che hai pubblicato è la parentesi graffa}. È il valore 3? – ThePosey

+0

Questo è il problema, non lo so neanche io. Il compilatore punta sempre questo errore all'ultimo parentesi che non ha senso. Penso che questo potrebbe essere un bug di GCC con NEON quindi sto cercando qualche soluzione alternativa forse. – NumberFour

+1

Penso che la risposta cancellata di ThePosey sia sulla strada giusta. Cosa ti aspetti di fare 'vext_u64 (a, a, 3)'? –

risposta

6

Il problema è in questa linea

b = vext_u64 (a, a, 3); 

Non si può avere 3 come shift per vext_u64, it isn't allowed.

uint64x1_t vext_u64(uint64x1_t a, uint64x1_t b, __constrange(0,0) int c); // VEXT.64 d0,d0,d0,#0 

Sembra gcc 's implementation (definition?) di intrinseci al neon non è buono come armcc' s in questo aspetto.

Un trucco per comprendere tale comportamento è passare -S a gcc per convertire il codice in assembly, quindi provare a compilare il file di assembly. In questo modo gcc ti dirà esattamente quale linea sta dando il problema.

$ ~/bin/android-ndk-r8d/toolchains/arm-linux-androideabi-4.7/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc --sysroot=/home/auselen/bin/android-ndk-r8d/platforms/android-14/arch-arm -std=c99 -S neon.c -mfloat-abi=softfp -mfpu=neon -O2 
neon.c: In function 'foo': 
neon.c:11:1: error: constant out of range 
$ ~/bin/android-ndk-r8d/toolchains/arm-linux-androideabi-4.7/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc --sysroot=/home/auselen/bin/android-ndk-r8d/platforms/android-14/arch-arm -std=c99 -c neon.s -mfloat-abi=softfp -mfpu=neon -O2 
neon.s: Assembler messages: 
neon.s:28: Error: shift out of range -- `vext.64 d16,d16,d16,#3' 
+0

Ho lo stesso problema quando uso 'vecTmp = vrshrn_n_u32 (vec128b, 15 + 8);', la costante non può essere maggiore di 16, ma in effetti il ​​vincolo dovrebbe essere 0-31. Penso che il bug della catena di strumenti di GCC di Android? – QZHua

Problemi correlati