【问题标题】:Constant out of range with NEON intrinsicsNEON 内在函数的常量超出范围
【发布时间】:2013-02-25 05:22:15
【问题描述】:

我正在编译以下 ARM NEON 内在测试代码(在带有 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() 的最后一个 } 大括号。

有谁知道这个奇怪错误的原因可能是什么?

【问题讨论】:

  • 它在说什么常数?您发布的代码的第 17 行是 } 大括号。是值 3 吗?
  • 这就是问题所在,我也不知道。编译器总是将此错误指向最后一个 } 大括号,这是没有意义的。我认为这可能是 NEON 的 GCC 错误,所以我可能正在寻找一些解决方法。
  • 我认为 ThePosey 删除的答案是正确的。你期待vext_u64(a, a, 3) 做什么?

标签: c compiler-errors android-ndk arm neon


【解决方案1】:

问题出在这一行

b = vext_u64 (a, a, 3);

您不能将3 作为vext_u64it isn't allowed 的班次。

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

看起来gccimplementation (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'

【讨论】:

  • 我在使用vecTmp = vrshrn_n_u32(vec128b, 15+8);时也有同样的问题,常数不能大于16,但实际上约束应该是0-31。我认为是android的gcc工具链的bug?
猜你喜欢
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-08
相关资源
最近更新 更多