1 page.title=NEON Support 2 @jd:body 3 4 <div id="qv-wrapper"> 5 <div id="qv"> 6 <h2>On this page</h2> 7 8 <ol> 9 <li><a href="#ul">Using {@code LOCAL_ARM_NEON}</a></li> 10 <li><a href="#uns">Using the {@code .neon} Suffix</a></li> 11 <li><a href="#build">Build Requirements</a></li> 12 <li><a href="#rd">Runtime Detection</a></li> 13 <li><a href="#sc">Sample Code</a></li> 14 </ol> 15 </div> 16 </div> 17 18 <p>The NDK supports the ARM Advanced SIMD, an optional instruction-set extension of the ARMv7 spec. 19 NEON provides a set of scalar/vector instructions and registers (shared with the FPU) comparable to 20 MMX/SSE/3DNow! in the x86 world. To function, it requires VFPv3-D32 (32 hardware FPU 64-bit 21 registers, instead of the minimum of 16).</p> 22 23 <p>The NDK supports the compilation of modules or even specific source files with support for NEON. 24 As a result, a specific compiler flag enables the use of GCC ARM NEON intrinsics and VFPv3-D32 25 at the same time.</p> 26 27 <p>Not all ARMv7-based Android devices support NEON, but devices that do may benefit significantly 28 from its support for scalar/vector instructions. For x86 devices, the NDK can also translate NEON 29 instructions into SSE, although with several restrictions. For more information, see 30 <a href="{@docRoot}ndk/guides/x86.html#an">x86 Support for ARM NEON Intrinsics.</a></p> 31 32 <h2 id="ul">Using LOCAL_ARM_NEON</h2> 33 <p>To have the NDK build all its source files with NEON support, include the following line in 34 your module definition:</p> 35 36 <pre class="no-pretty-print"> 37 LOCAL_ARM_NEON := true 38 </pre> 39 40 <p>It can be especially useful to build all source files with NEON support if you want to build a 41 static or shared library that specifically contains NEON code paths.</p> 42 43 <h2 id="uns">Using the .neon Suffix</h2> 44 <p>When listing source files for your {@code LOCAL_SRC_FILES} variable, you have the option of 45 using the {@code .neon} suffix to indicate that you want to build binaries with NEON support. 46 For example, the following example builds one file with {@code .neon} support, and another 47 without it:</p> 48 49 <pre class="no-pretty-print"> 50 LOCAL_SRC_FILES := foo.c.neon bar.c 51 </pre> 52 53 <p>You can combine the {@code .neon} suffix with the {@code .arm} suffix, which specifies the 32-bit 54 ARM instruction set for non-NEON instructions. In such a definition, {@code arm} must come before 55 {@code neon}. For example: {@code foo.c.arm.neon} works, but {@code foo.c.neon.arm} does not.</p> 56 57 <h2 id="build">Build Requirements</h2> 58 <p>NEON support only works with the {@code armeabi-v7a} and {@code x86} ABIs. If the NDK build 59 scripts encounter other ABIs while attempting to build with NEON support, the NDK build scripts 60 exit. x86 provides <a href="x86.html">partial NEON support</a> via translation header. It is 61 important to use checks like the following in your <a href="{@docRoot}ndk/guides/android_mk.html"> 62 {@code Android.mk}</a> file:</p> 63 64 <pre class="no-pretty-print"> 65 # define a static library containing our NEON code 66 ifeq ($(TARGET_ARCH_ABI),$(filter $(TARGET_ARCH_ABI), armeabi-v7a x86)) 67 include $(CLEAR_VARS) 68 LOCAL_MODULE := mylib-neon 69 LOCAL_SRC_FILES := mylib-neon.c 70 LOCAL_ARM_NEON := true 71 include $(BUILD_STATIC_LIBRARY) 72 endif # TARGET_ARCH_ABI == armeabi-v7a || x86 73 </pre> 74 75 <h2 id="rd">Runtime Detection</h2> 76 <p>Your app must perform runtime detection to confirm that NEON-capable machine code can be run on 77 the target device. This is because not all ARMv7-based Android devices support NEON. The app can 78 perform this check using the 79 <a href="{@docRoot}ndk/guides/cpu-features.html">{@code cpufeatures}</a> library that comes with 80 this NDK.</p> 81 82 <p>You should explicitly check that {@code android_getCpuFamily()} returns {@code 83 ANDROID_CPU_FAMILY_ARM}, and that {@code android_getCpuFeatures()} returns a value including the 84 {@code ANDROID_CPU_ARM_FEATURE_NEON flag} set. For example: </p> 85 86 <pre class="no-pretty-print"> 87 #include <cpu-features.h> 88 ... 89 ... 90 if (android_getCpuFamily() == ANDROID_CPU_FAMILY_ARM && 91 (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0) 92 { 93 // use NEON-optimized routines 94 ... 95 } 96 else 97 { 98 // use non-NEON fallback routines instead 99 ... 100 } 101 102 ... 103 </pre> 104 105 <h2 id="sc">Sample Code</h2> 106 <p>The source code for the NDK's hello-neon sample provides an example of how to use the 107 {@code cpufeatures} library and NEON intrinsics at the same time. This sample implements a tiny 108 benchmark for a FIR filter loop using a C version, and a NEON-optimized one for devices that 109 support it.</p>