gpt4 book ai didi

NEON 内在函数常量超出范围

转载 作者:太空狗 更新时间:2023-10-29 17:23:00 25 4
gpt4 key购买 nike

我正在编译以下 ARM NEON 内在测试代码(在 Eclipse 和 Android NDK 中):

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() 的最后一个 大括号。

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

最佳答案

问题出在这一行

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

它看起来像gccimplementation (definition?)在这方面,neon 内在函数不如 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'

关于NEON 内在函数常量超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15314770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com