How to solve bad instruction `vadd.i16 q0,q0,q0' when attempting to check gcc for neon instruction
Asked Answered
E

2

0
Checking  gcc supports failed for neon instruction vadd.i16 q0,q0,q0
    test.c

    int main ()
    {
     __asm__("vadd.i16 q0, q0, q0"); return 0;
    }

    arm-linux-androideabi-gcc test.c
    /tmp/ccfc8m0G.s: Assembler messages:
    /tmp/ccfc8m0G.s:24: Error: bad instruction `vadd.i16 q0,q0,q0'

Tried with flags -mcpu=cortex-a8 -mfpu=neon but stil no success

Above code was used to test gcc support for neon instruction.

Actually i am trying to build x264 with NEON support for ARM platformAfter running configure script x264 config log file contains

Command line options: "--cross-prefix=arm-linux-androideabi-" "--enable-pic" "--extra- cflags=-mcpu=cortex-a8" "--host=arm-linux"

checking whether arm-linux-androideabi-gcc works... yes
checking whether arm-linux-androideabi-gcc supports for( int i = 0; i < 9; i++ ); with -std=gnu99... yes
checking whether arm-linux-androideabi-gcc supports __asm__("rev ip, ip");... yes
checking whether arm-linux-androideabi-gcc supports __asm__("movt r0, #0");... yes
checking whether arm-linux-androideabi-gcc supports __asm__("vadd.i16 q0, q0, q0");... no

arm-linux-androideabi-gcc conftest.c  -Wall -I. -I$(SRCPATH) -mcpu=cortex-a8 -std=gnu99    -lm -o conftest
E:\cygwin\tmp\ccVtVI1i.s: Assembler messages:
E:\cygwin\tmp\ccVtVI1i.s:24: Error: bad instruction `vadd.i16 q0,q0,q0'
--------------------------------------------------
Failed program was:
--------------------------------------------------
int main () { __asm__("vadd.i16 q0, q0, q0"); return 0; }
--------------------------------------------------


config.h contains

#define HAVE_MALLOC_H 1
#define HAVE_ARMV6 1
#define HAVE_ARMV6T2 1
#define ARCH_ARM 1
#define SYS_LINUX 1
#define HAVE_VECTOREXT 1
#define fseek fseeko
#define ftell ftello
#define HAVE_GPL 1
#define HAVE_INTERLACED 1
#define HAVE_ALTIVEC 0
#define HAVE_ALTIVEC_H 0
#define HAVE_MMX 0
#define HAVE_NEON 0
#define HAVE_BEOSTHREAD 0
#define HAVE_POSIXTHREAD 0
#define HAVE_WIN32THREAD 0
#define HAVE_THREAD 0
#define HAVE_LOG2F 0
#define HAVE_VISUALIZE 0
#define HAVE_SWSCALE 0
#define HAVE_LAVF 0
#define HAVE_FFMS 0
#define HAVE_GPAC 0
#define HAVE_GF_MALLOC 0
#define HAVE_AVS 0
#define HAVE_CPU_COUNT 0


Running make command build x264 static lib  based on above config.h which contains HAVE_NEON 0


**Compiler Version**



arm-linux-androideabi-gcc -v
Using built-in specs.
Target: arm-linux-androideabi
Configured with: /tmp/ndk-digit/src/build/../gcc/gcc-4.4.3/configure --prefix=/usr/local/google/digit/repo/opensource/ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows --target=arm-linux-androideabi --host=i586-mingw32msvc --build=x86_64-linux-gnu --with-gnu-as --with-gnu-ld --enable-languages=c,c++ --with-gmp=/tmp/ndk-digit/build/toolchain/temp-install --with-mpfr=/tmp/ndk-digit/build/toolchain/temp-install --disable-libssp --enable-threads --disable-nls --disable-libmudflap --disable
-libgomp --disable-libstdc__-v3 --disable-sjlj-exceptions --disable-shared --disable-tls --with-float=soft --with-fpu=vfp --with-arch=armv5te --enable-target-optspace --enable-initfini-array --disable-nls --prefix=/usr/local/google/digit/repo/opensource/ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows --with-sysroot=/usr/local/google/digit/repo/opensource/ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/sysroot --with-binutils-version=2.20.1 --with-mpfr-version=2.4.1 --with
-gmp-version=4.2.4 --with-gcc-version=4.4.3 --with-gdb-version=6.6 --with-arch=armv5te --program-transform-name='s,^,arm-linux-androideabi-,'
Thread model: posix
gcc version 4.4.3 (GCC)    

Goal is to utilize neon enabled ARM processor to boost x264 encoder performance...

Excellent answered 15/2, 2012 at 5:32 Comment(0)
I
0

I'm not really sure what it is you want to accomplish. Do you just want to see if gcc can compile neon instructions, or see if the CPU in question supports neon?

In any case:
I cannot get your code to work either. After googling around, it seems that gcc cannot really handle inline neon code very well. Apparantly the -mfpu=neon flag is somehow ignored (if you compile to .s with the -E flag, you will see that .fpu is set to softvfp even if -mfpu=neon was used)

Consider writing a .S or .s file instead. Something like this:

test.s

    .cpu cortex-a8
    .fpu neon
    .text
    .align  2
    .global f
    .type   f, %function
f:
    vadd.i16        q0, q0, q0
    .size   f, .-f
Ignominy answered 15/2, 2012 at 9:24 Comment(1)
gcc (of new enough vintage) handles inline NEON just fine.Cognac
C
0

For what it's worth this instruction works fine for me with gcc 4.5.1 (CodeSourcery).

Try with these switches:

-mfpu=neon
-mfloat-abi=softfp
-mcpu=cortex-a8
-march=armv7-a
-mthumb
Cognac answered 6/7, 2012 at 1:27 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.