2013-03-09 3 views
6

Im компилирования следующий ARM код NEON встроенные функции тест (в Eclipse, с Android NDK):Constant вне диапазона с неоновой встроенными функциями

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

, но я получаю следующее сообщение об ошибке компилятора:

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

Строка 17 - последняя } скобка foo().

Есть ли у кого-нибудь идеи, что может быть причиной этой странной ошибки?

+0

, о чем постоянно говорит речь? Строка 17 кода, который вы опубликовали, - это} скобка. Это значение 3? – ThePosey

+0

Это проблема, я тоже не знаю. Компилятор всегда указывает эту ошибку на последнюю скобку, которая не имеет смысла. Я думаю, что это может быть ошибка GCC с NEON, поэтому я, возможно, искал какой-нибудь обходной путь. – NumberFour

+1

Я думаю, что удаленный ответ ThePosey находится на правильном пути. Что вы ожидаете от 'vext_u64 (a, a, 3)' делать? –

ответ

6

Проблема в этой строке

b = vext_u64 (a, a, 3); 

Вы не можете иметь 3, как сдвиг для 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 

Похоже gcc 's implementation (definition?) неоновых не встроенные функции, как хорошо, как armcc-х в этом аспекте.

Уловкой для понимания такого поведения является передача -S в gcc для преобразования кода в сборку, а затем попытайтесь скомпилировать этот файл сборки. Таким образом, gcc сообщит вам, какая именно строка дает проблему.

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

У меня такая же проблема при использовании 'vecTmp = vrshrn_n_u32 (vec128b, 15 + 8);', константа не может быть больше 16, но на самом деле ограничение должно быть 0-31. Я думаю, что это ошибка gcc tool chain android? – QZHua

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

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