c - que - señal fuera de rango windows 7
Constante fuera de rango con intrínsecos de NEON (1)
El problema está en esta línea
b = vext_u64 (a, a, 3);
No puede tener 3
como turno para vext_u64
, no está permitido .
uint64x1_t vext_u64(uint64x1_t a, uint64x1_t b, __constrange(0,0) int c); // VEXT.64 d0,d0,d0,#0
Parece que la implementación de gcc
(¿definición?) De intrínsecos de neón no es tan buena como la de armcc
en este aspecto.
Un truco para entender dicho comportamiento es pasar -S
a gcc
para convertir el código al ensamblado y luego intentar compilar ese archivo de ensamblaje. De esa forma, gcc te dirá exactamente qué línea está dando el problema.
$ ~/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''
Estoy compilando el siguiente código de prueba intrínseca ARM NEON (en Eclipse con 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);
}
pero sigo recibiendo el siguiente error de compilación:
/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`
La línea 17 es la última }
llave de foo()
.
¿Alguien tiene una idea de cuál podría ser la causa de este extraño error?