xref: /linux/arch/arm/include/asm/neon.h (revision 0da85d1e38b4c186d2248f0239b72d465f5b406c)
1 /*
2  * linux/arch/arm/include/asm/neon.h
3  *
4  * Copyright (C) 2013 Linaro Ltd <ard.biesheuvel@linaro.org>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  */
10 
11 #include <asm/hwcap.h>
12 
13 #define cpu_has_neon()		(!!(elf_hwcap & HWCAP_NEON))
14 
15 #ifdef __ARM_NEON__
16 
17 /*
18  * If you are affected by the BUILD_BUG below, it probably means that you are
19  * using NEON code /and/ calling the kernel_neon_begin() function from the same
20  * compilation unit. To prevent issues that may arise from GCC reordering or
21  * generating(1) NEON instructions outside of these begin/end functions, the
22  * only supported way of using NEON code in the kernel is by isolating it in a
23  * separate compilation unit, and calling it from another unit from inside a
24  * kernel_neon_begin/kernel_neon_end pair.
25  *
26  * (1) Current GCC (4.7) might generate NEON instructions at O3 level if
27  *     -mpfu=neon is set.
28  */
29 
30 #define kernel_neon_begin() \
31 	BUILD_BUG_ON_MSG(1, "kernel_neon_begin() called from NEON code")
32 
33 #else
34 void kernel_neon_begin(void);
35 #endif
36 void kernel_neon_end(void);
37