1# ===========================================================================
2#      https://www.gnu.org/software/autoconf-archive/ax_gcc_builtin.html
3# ===========================================================================
4#
5# SYNOPSIS
6#
7#   AX_GCC_BUILTIN(BUILTIN)
8#
9# DESCRIPTION
10#
11#   This macro checks if the compiler supports one of GCC's built-in
12#   functions; many other compilers also provide those same built-ins.
13#
14#   The BUILTIN parameter is the name of the built-in function.
15#
16#   If BUILTIN is supported define HAVE_<BUILTIN>. Keep in mind that since
17#   builtins usually start with two underscores they will be copied over
18#   into the HAVE_<BUILTIN> definition (e.g. HAVE___BUILTIN_EXPECT for
19#   __builtin_expect()).
20#
21#   The macro caches its result in the ax_cv_have_<BUILTIN> variable (e.g.
22#   ax_cv_have___builtin_expect).
23#
24#   The macro currently supports the following built-in functions:
25#
26#    __builtin_assume_aligned
27#    __builtin_bswap16
28#    __builtin_bswap32
29#    __builtin_bswap64
30#    __builtin_choose_expr
31#    __builtin___clear_cache
32#    __builtin_clrsb
33#    __builtin_clrsbl
34#    __builtin_clrsbll
35#    __builtin_clz
36#    __builtin_clzl
37#    __builtin_clzll
38#    __builtin_complex
39#    __builtin_constant_p
40#    __builtin_cpu_init
41#    __builtin_cpu_is
42#    __builtin_cpu_supports
43#    __builtin_ctz
44#    __builtin_ctzl
45#    __builtin_ctzll
46#    __builtin_expect
47#    __builtin_ffs
48#    __builtin_ffsl
49#    __builtin_ffsll
50#    __builtin_fpclassify
51#    __builtin_huge_val
52#    __builtin_huge_valf
53#    __builtin_huge_vall
54#    __builtin_inf
55#    __builtin_infd128
56#    __builtin_infd32
57#    __builtin_infd64
58#    __builtin_inff
59#    __builtin_infl
60#    __builtin_isinf_sign
61#    __builtin_nan
62#    __builtin_nand128
63#    __builtin_nand32
64#    __builtin_nand64
65#    __builtin_nanf
66#    __builtin_nanl
67#    __builtin_nans
68#    __builtin_nansf
69#    __builtin_nansl
70#    __builtin_object_size
71#    __builtin_parity
72#    __builtin_parityl
73#    __builtin_parityll
74#    __builtin_popcount
75#    __builtin_popcountl
76#    __builtin_popcountll
77#    __builtin_powi
78#    __builtin_powif
79#    __builtin_powil
80#    __builtin_prefetch
81#    __builtin_trap
82#    __builtin_types_compatible_p
83#    __builtin_unreachable
84#
85#   Unsupported built-ins will be tested with an empty parameter set and the
86#   result of the check might be wrong or meaningless so use with care.
87#
88# LICENSE
89#
90#   Copyright (c) 2013 Gabriele Svelto <gabriele.svelto@gmail.com>
91#
92#   Copying and distribution of this file, with or without modification, are
93#   permitted in any medium without royalty provided the copyright notice
94#   and this notice are preserved.  This file is offered as-is, without any
95#   warranty.
96
97#serial 7
98
99AC_DEFUN([AX_GCC_BUILTIN], [
100    AS_VAR_PUSHDEF([ac_var], [ax_cv_have_$1])
101
102    AC_CACHE_CHECK([for $1], [ac_var], [
103        AC_LINK_IFELSE([AC_LANG_PROGRAM([], [
104            m4_case([$1],
105                [__builtin_assume_aligned], [$1("", 0)],
106                [__builtin_bswap16], [$1(0)],
107                [__builtin_bswap32], [$1(0)],
108                [__builtin_bswap64], [$1(0)],
109                [__builtin_choose_expr], [$1(0, 0, 0)],
110                [__builtin___clear_cache], [$1("", "")],
111                [__builtin_clrsb], [$1(0)],
112                [__builtin_clrsbl], [$1(0)],
113                [__builtin_clrsbll], [$1(0)],
114                [__builtin_clz], [$1(0)],
115                [__builtin_clzl], [$1(0)],
116                [__builtin_clzll], [$1(0)],
117                [__builtin_complex], [$1(0.0, 0.0)],
118                [__builtin_constant_p], [$1(0)],
119                [__builtin_cpu_init], [$1()],
120                [__builtin_cpu_is], [$1("intel")],
121                [__builtin_cpu_supports], [$1("sse")],
122                [__builtin_ctz], [$1(0)],
123                [__builtin_ctzl], [$1(0)],
124                [__builtin_ctzll], [$1(0)],
125                [__builtin_expect], [$1(0, 0)],
126                [__builtin_ffs], [$1(0)],
127                [__builtin_ffsl], [$1(0)],
128                [__builtin_ffsll], [$1(0)],
129                [__builtin_fpclassify], [$1(0, 1, 2, 3, 4, 0.0)],
130                [__builtin_huge_val], [$1()],
131                [__builtin_huge_valf], [$1()],
132                [__builtin_huge_vall], [$1()],
133                [__builtin_inf], [$1()],
134                [__builtin_infd128], [$1()],
135                [__builtin_infd32], [$1()],
136                [__builtin_infd64], [$1()],
137                [__builtin_inff], [$1()],
138                [__builtin_infl], [$1()],
139                [__builtin_isinf_sign], [$1(0.0)],
140                [__builtin_nan], [$1("")],
141                [__builtin_nand128], [$1("")],
142                [__builtin_nand32], [$1("")],
143                [__builtin_nand64], [$1("")],
144                [__builtin_nanf], [$1("")],
145                [__builtin_nanl], [$1("")],
146                [__builtin_nans], [$1("")],
147                [__builtin_nansf], [$1("")],
148                [__builtin_nansl], [$1("")],
149                [__builtin_object_size], [$1("", 0)],
150                [__builtin_parity], [$1(0)],
151                [__builtin_parityl], [$1(0)],
152                [__builtin_parityll], [$1(0)],
153                [__builtin_popcount], [$1(0)],
154                [__builtin_popcountl], [$1(0)],
155                [__builtin_popcountll], [$1(0)],
156                [__builtin_powi], [$1(0, 0)],
157                [__builtin_powif], [$1(0, 0)],
158                [__builtin_powil], [$1(0, 0)],
159                [__builtin_prefetch], [$1("")],
160                [__builtin_trap], [$1()],
161                [__builtin_types_compatible_p], [$1(int, int)],
162                [__builtin_unreachable], [$1()],
163                [m4_warn([syntax], [Unsupported built-in $1, the test may fail])
164                 $1()]
165            )
166            ])],
167            [AS_VAR_SET([ac_var], [yes])],
168            [AS_VAR_SET([ac_var], [no])])
169    ])
170
171    AS_IF([test yes = AS_VAR_GET([ac_var])],
172        [AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_$1), 1,
173            [Define to 1 if the system has the `$1' built-in function])], [])
174
175    AS_VAR_POPDEF([ac_var])
176])
177