2013-03-09 31 views
6

Im biên dịch mã intrinsics NEON thử nghiệm ARM sau (trong Eclipse với Android NDK):liên tục ra khỏi phạm vi với 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); 
} 

nhưng tôi tiếp tục nhận được lỗi biên dịch sau:

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

Dòng 17 là cú đúp } cuối cùng của foo().

Có ai có ý tưởng về nguyên nhân gây ra lỗi lạ này không?

+0

nó liên tục nói về điều gì? Dòng 17 của mã bạn đăng là cú đúp. Nó có phải là giá trị 3 không? – ThePosey

+0

Đó là vấn đề, tôi cũng không biết. Trình biên dịch luôn trỏ lỗi này đến cú đúp cuối cùng mà không có ý nghĩa. Tôi nghĩ rằng đây có thể là một lỗi GCC với NEON vì vậy Im tìm kiếm một số workaround có thể. – NumberFour

+1

Tôi nghĩ câu trả lời đã xóa của ThePosey đang đi đúng hướng. Bạn đang mong đợi gì 'vext_u64 (a, a, 3)' để làm gì? –

Trả lời

6

Vấn đề là ở dòng này

b = vext_u64 (a, a, 3); 

Bạn không thể có 3 như ca cho 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 

Dường như gcc 's implementation (definition?) của intrinsics neon là không tốt như armcc' s trong khía cạnh này.

Bí quyết để hiểu hành vi đó là chuyển -S sang gcc để chuyển đổi mã thành hội đồng sau đó cố gắng biên dịch tệp lắp ráp đó. Bằng cách đó gcc sẽ cho bạn biết chính xác dòng nào đang đưa ra vấn đề.

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

Tôi có cùng một vấn đề khi sử dụng 'vecTmp = vrshrn_n_u32 (vec128b, 15 + 8);', hằng số không được lớn hơn 16, nhưng thực tế ràng buộc phải là 0-31. Tôi nghĩ là lỗi của chuỗi công cụ gcc của android? – QZHua