1#
2# Contains macros to detect CPU features.
3#
4
5
6# DRUNTIME_CPU_SOURCES
7# -------------------
8# Detect target CPU and add DRUNTIME_CPU_XXX conditionals.
9AC_DEFUN([DRUNTIME_CPU_SOURCES],
10[
11  druntime_target_cpu_parsed=""
12  case "$target_cpu" in
13      aarch64*)
14               druntime_target_cpu_parsed="aarch64"
15               ;;
16      arm*)    druntime_target_cpu_parsed="arm"
17               ;;
18      mips*)   druntime_target_cpu_parsed="mips"
19               ;;
20      powerpc*)
21               druntime_target_cpu_parsed="powerpc"
22               ;;
23      i[[34567]]86|x86_64)
24               druntime_target_cpu_parsed="x86"
25               ;;
26      s390x)
27               druntime_target_cpu_parsed="s390x"
28               ;;
29      s390)
30               druntime_target_cpu_parsed="s390"
31               ;;
32  esac
33  AM_CONDITIONAL([DRUNTIME_CPU_AARCH64],
34                 [test "$druntime_target_cpu_parsed" = "aarch64"])
35  AM_CONDITIONAL([DRUNTIME_CPU_ARM],
36                 [test "$druntime_target_cpu_parsed" = "arm"])
37  AM_CONDITIONAL([DRUNTIME_CPU_MIPS],
38                 [test "$druntime_target_cpu_parsed" = "mips"])
39  AM_CONDITIONAL([DRUNTIME_CPU_POWERPC],
40                 [test "$druntime_target_cpu_parsed" = "powerpc"])
41  AM_CONDITIONAL([DRUNTIME_CPU_X86],
42                 [test "$druntime_target_cpu_parsed" = "x86"])
43  AM_CONDITIONAL([DRUNTIME_CPU_SYSTEMZ],
44                 [test "$druntime_target_cpu_parsed" = "s390x"])
45  AM_CONDITIONAL([DRUNTIME_CPU_S390],
46                 [test "$druntime_target_cpu_parsed" = "s390"])
47])
48
49
50# DRUNTIME_ENABLE_ATOMIC_BUILTINS
51# -------------------------
52# Check support for atomic builtins up to 64 bit.
53AC_DEFUN([DRUNTIME_ENABLE_ATOMIC_BUILTINS],
54[
55  # This checks to see if the host supports the compiler-generated builtins
56  # for atomic operations for various integral sizes. Note, this is intended
57  # to be an all-or-nothing switch, so all the atomic operations that are
58  # used should be checked.
59  AC_MSG_CHECKING([for atomic builtins for byte])
60  AC_CACHE_VAL(druntime_cv_atomic_byte, [
61    AC_TRY_LINK(
62      [import gcc.builtins;], [
63      shared(byte) c1;
64       byte c2, c3;
65       __atomic_compare_exchange_1(&c1, &c2, c3, false, 5, 5);
66       __atomic_load_1(&c1, 5);
67       __atomic_store_1(&c1, c2, 5);
68       return 0;
69      ],
70      [druntime_cv_atomic_byte=yes],
71      [druntime_cv_atomic_byte=no])
72  ])
73  AC_MSG_RESULT($druntime_cv_atomic_byte)
74
75  AC_MSG_CHECKING([for atomic builtins for short])
76  AC_CACHE_VAL(druntime_cv_atomic_short, [
77    AC_TRY_LINK(
78      [import gcc.builtins;], [
79      shared(short) c1;
80       short c2, c3;
81       __atomic_compare_exchange_2(&c1, &c2, c3, false, 5, 5);
82       __atomic_load_2(&c1, 5);
83       __atomic_store_2(&c1, c2, 5);
84       return 0;
85      ],
86      [druntime_cv_atomic_short=yes],
87      [druntime_cv_atomic_short=no])
88  ])
89  AC_MSG_RESULT($druntime_cv_atomic_short)
90
91  AC_MSG_CHECKING([for atomic builtins for int])
92  AC_CACHE_VAL(druntime_cv_atomic_int, [
93    AC_TRY_LINK(
94      [import gcc.builtins;], [
95      shared(int) c1;
96       int c2, c3;
97       __atomic_compare_exchange_4(&c1, &c2, c3, false, 5, 5);
98       __atomic_load_4(&c1, 5);
99       __atomic_store_4(&c1, c2, 5);
100       return 0;
101      ],
102      [druntime_cv_atomic_int=yes],
103      [druntime_cv_atomic_int=no])
104  ])
105  AC_MSG_RESULT($druntime_cv_atomic_int)
106
107  AC_MSG_CHECKING([for atomic builtins for long])
108  AC_CACHE_VAL(druntime_cv_atomic_long, [
109    AC_TRY_LINK(
110      [import gcc.builtins;], [
111       shared(long) c1;
112       long c2, c3;
113       __atomic_compare_exchange_8(&c1, &c2, c3, false, 5, 5);
114       __atomic_load_8(&c1, 5);
115       __atomic_store_8(&c1, c2, 5);
116       return 0;
117      ],
118      [druntime_cv_atomic_long=yes],
119      [druntime_cv_atomic_long=no])
120  ])
121  AC_MSG_RESULT($druntime_cv_atomic_long)
122
123  # Have atomic builtin support if all but the long test above passes.
124  DCFG_HAVE_ATOMIC_BUILTINS=false
125  if test "$druntime_cv_atomic_byte" = yes \
126     && test "$druntime_cv_atomic_short" = yes \
127     && test "$druntime_cv_atomic_int" = yes; then \
128    DCFG_HAVE_ATOMIC_BUILTINS=true
129  fi
130
131  # Have 64-bit atomic support if the long test above passes.
132  DCFG_HAVE_64BIT_ATOMICS=false
133  if test "$druntime_cv_atomic_long" = yes; then
134    DCFG_HAVE_64BIT_ATOMICS=true
135  fi
136
137  AC_SUBST(DCFG_HAVE_ATOMIC_BUILTINS)
138  AC_SUBST(DCFG_HAVE_64BIT_ATOMICS)
139])
140