2013-03-09 13 views
6

Im kompilacji dodaje ARM kodu testowego intrinsics NEON (w Eclipse z Android NDK):Stała poza zasięgiem z intrinsics 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); 
} 

ale wciąż otrzymuję następujący błąd kompilatora:

/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` 

Linia 17 jest ostatnim } klamrą z foo().

Czy ktoś ma pomysł, co może być przyczyną tego dziwnego błędu?

+0

o jakiej stałej rzeczy chodzi? Wiersz 17 kodu, który wysłałeś, to} nawias klamrowy. Czy to jest wartość 3? – ThePosey

+0

To problem, ja też nie wiem. Kompilator zawsze wskazuje ten błąd na ostatni} nawias klamrowy, który nie ma sensu. Myślę, że to może być bug GCC z NEONem, więc szukam jakiegoś obejścia. – NumberFour

+1

Myślę, że usunięta odpowiedź ThePosey jest na dobrej drodze. Czego oczekujesz "vext_u64 (a, a, 3)"? –

Odpowiedz

6

Problem jest w tym wierszu

b = vext_u64 (a, a, 3); 

Nie można mieć 3 jak przesuwem 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 

Wygląda gcc 's implementation (definition?) neonowych intrinsics nie jest tak dobry jak armcc JEST W tym aspekcie.

Sztuczka do zrozumienia takiego zachowania to przekazanie -S do gcc w celu konwersji kodu na zespół, a następnie spróbuj skompilować ten plik zespołu. W ten sposób gcc powie dokładnie, która linia daje problem.

$ ~/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

Mam ten sam problem podczas używania 'vecTmp = vrshrn_n_u32 (vec128b, 15 + 8);' stała nie może być większa niż 16, ale w rzeczywistości ograniczenie powinno wynosić 0-31. Myślę, że to błąd łańcucha narzędzi gcc Androida? – QZHua

Powiązane problemy