2013-03-09 22 views
6

Im (Android NDK ile Eclipse) şu ARM NEONU intrinsics test kodu derleme ile aralık dışında Sabit:NEONU intrinsics

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

ama şu derleyici hata almaya devam:

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

Satır 17, foo()'un son } desteğidir.

Bu garip hatanın sebebi ne olabileceği hakkında bir fikri olan var mı?

+0

Hangi sabit hakkında konuşuyor? Gönderdiğiniz kodun 17. satırı,} brace'dir. 3 değeri mi? – ThePosey

+0

Sorun, ben de bilmiyorum. Derleyici, bu hatayı her zaman son duyar. Bence bu, NEON ile bir GCC hatası olabilir, bu yüzden belki de bazı geçici çözümler arıyorum. – NumberFour

+1

Bence ThePosey'in silindi cevabı doğru yolda. Ne bekliyorsunuz vext_u64 (a, a, 3) yapmak? –

cevap

6

Sorun Sen vext_u64 için vardiya, it isn't allowed olarak 3 olamaz bu hat

b = vext_u64 (a, a, 3); 

içindedir.

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

O gcc benziyor bu açıdan s 'nin implementation (definition?) neon intrinsics armcc kadar iyi değildir'.

Böyle bir davranışı anlamak için bir kod, kodu derleme dönüştürmek için -S - gcc geçirmektir ve sonra bu derleme dosyasını derlemeye çalışın. Bu şekilde gcc, tam olarak hangi hattın problemi verdiğini size söyleyecektir.

$ ~/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);' kullanırken aynı sorunu yaşıyorum, sabit 16'dan büyük olamaz, ancak aslında kısıtlama 0-31 olmalıdır. Bence android'in gcc takım zinciri hatası mı? – QZHua