6

次のARMNEON組み込み関数テストコードをコンパイルしています(Android NDKを使用したEclipseで)。

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()

この奇妙なエラーの原因が何であるかを誰かが知っていますか?

4

1 に答える 1

6

問題はこの行にあります

b = vext_u64 (a, a, 3);

あなたは3シフトとして持つことはできませんvext_u64それは許可されていません

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

ネオン組み込み関数gcc実装(定義?)armccは、この点では'ほど良くないようです。

このような動作を理解するための秘訣は、に渡し-Sgccコードをアセンブリに変換してから、そのアセンブリファイルをコンパイルすることです。そうすれば、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'
于 2013-03-10T00:29:41.717 に答える