| # |
| # Contains macros to detect CPU features. |
| # |
| |
| |
| # DRUNTIME_CPU_SOURCES |
| # ------------------- |
| # Detect target CPU and add DRUNTIME_CPU_XXX conditionals. |
| AC_DEFUN([DRUNTIME_CPU_SOURCES], |
| [ |
| druntime_target_cpu_parsed="" |
| case "$target_cpu" in |
| aarch64*) |
| druntime_target_cpu_parsed="aarch64" |
| ;; |
| arm*) druntime_target_cpu_parsed="arm" |
| ;; |
| mips*) druntime_target_cpu_parsed="mips" |
| ;; |
| powerpc*) |
| druntime_target_cpu_parsed="powerpc" |
| ;; |
| i[[34567]]86|x86_64) |
| druntime_target_cpu_parsed="x86" |
| ;; |
| s390x) |
| druntime_target_cpu_parsed="s390x" |
| ;; |
| s390) |
| druntime_target_cpu_parsed="s390" |
| ;; |
| esac |
| AM_CONDITIONAL([DRUNTIME_CPU_AARCH64], |
| [test "$druntime_target_cpu_parsed" = "aarch64"]) |
| AM_CONDITIONAL([DRUNTIME_CPU_ARM], |
| [test "$druntime_target_cpu_parsed" = "arm"]) |
| AM_CONDITIONAL([DRUNTIME_CPU_MIPS], |
| [test "$druntime_target_cpu_parsed" = "mips"]) |
| AM_CONDITIONAL([DRUNTIME_CPU_POWERPC], |
| [test "$druntime_target_cpu_parsed" = "powerpc"]) |
| AM_CONDITIONAL([DRUNTIME_CPU_X86], |
| [test "$druntime_target_cpu_parsed" = "x86"]) |
| AM_CONDITIONAL([DRUNTIME_CPU_SYSTEMZ], |
| [test "$druntime_target_cpu_parsed" = "s390x"]) |
| AM_CONDITIONAL([DRUNTIME_CPU_S390], |
| [test "$druntime_target_cpu_parsed" = "s390"]) |
| ]) |
| |
| |
| # DRUNTIME_ENABLE_ATOMIC_BUILTINS |
| # ------------------------- |
| # Check support for atomic builtins up to 64 bit. |
| AC_DEFUN([DRUNTIME_ENABLE_ATOMIC_BUILTINS], |
| [ |
| # This checks to see if the host supports the compiler-generated builtins |
| # for atomic operations for various integral sizes. Note, this is intended |
| # to be an all-or-nothing switch, so all the atomic operations that are |
| # used should be checked. |
| AC_MSG_CHECKING([for atomic builtins for byte]) |
| AC_CACHE_VAL(druntime_cv_atomic_byte, [ |
| AC_TRY_LINK( |
| [import gcc.builtins;], [ |
| shared(byte) c1; |
| byte c2, c3; |
| __atomic_compare_exchange_1(&c1, &c2, c3, false, 5, 5); |
| __atomic_load_1(&c1, 5); |
| __atomic_store_1(&c1, c2, 5); |
| return 0; |
| ], |
| [druntime_cv_atomic_byte=yes], |
| [druntime_cv_atomic_byte=no]) |
| ]) |
| AC_MSG_RESULT($druntime_cv_atomic_byte) |
| |
| AC_MSG_CHECKING([for atomic builtins for short]) |
| AC_CACHE_VAL(druntime_cv_atomic_short, [ |
| AC_TRY_LINK( |
| [import gcc.builtins;], [ |
| shared(short) c1; |
| short c2, c3; |
| __atomic_compare_exchange_2(&c1, &c2, c3, false, 5, 5); |
| __atomic_load_2(&c1, 5); |
| __atomic_store_2(&c1, c2, 5); |
| return 0; |
| ], |
| [druntime_cv_atomic_short=yes], |
| [druntime_cv_atomic_short=no]) |
| ]) |
| AC_MSG_RESULT($druntime_cv_atomic_short) |
| |
| AC_MSG_CHECKING([for atomic builtins for int]) |
| AC_CACHE_VAL(druntime_cv_atomic_int, [ |
| AC_TRY_LINK( |
| [import gcc.builtins;], [ |
| shared(int) c1; |
| int c2, c3; |
| __atomic_compare_exchange_4(&c1, &c2, c3, false, 5, 5); |
| __atomic_load_4(&c1, 5); |
| __atomic_store_4(&c1, c2, 5); |
| return 0; |
| ], |
| [druntime_cv_atomic_int=yes], |
| [druntime_cv_atomic_int=no]) |
| ]) |
| AC_MSG_RESULT($druntime_cv_atomic_int) |
| |
| AC_MSG_CHECKING([for atomic builtins for long]) |
| AC_CACHE_VAL(druntime_cv_atomic_long, [ |
| AC_TRY_LINK( |
| [import gcc.builtins;], [ |
| shared(long) c1; |
| long c2, c3; |
| __atomic_compare_exchange_8(&c1, &c2, c3, false, 5, 5); |
| __atomic_load_8(&c1, 5); |
| __atomic_store_8(&c1, c2, 5); |
| return 0; |
| ], |
| [druntime_cv_atomic_long=yes], |
| [druntime_cv_atomic_long=no]) |
| ]) |
| AC_MSG_RESULT($druntime_cv_atomic_long) |
| |
| # Have atomic builtin support if all but the long test above passes. |
| DCFG_HAVE_ATOMIC_BUILTINS=false |
| if test "$druntime_cv_atomic_byte" = yes \ |
| && test "$druntime_cv_atomic_short" = yes \ |
| && test "$druntime_cv_atomic_int" = yes; then \ |
| DCFG_HAVE_ATOMIC_BUILTINS=true |
| fi |
| |
| # Have 64-bit atomic support if the long test above passes. |
| DCFG_HAVE_64BIT_ATOMICS=false |
| if test "$druntime_cv_atomic_long" = yes; then |
| DCFG_HAVE_64BIT_ATOMICS=true |
| fi |
| |
| AC_SUBST(DCFG_HAVE_ATOMIC_BUILTINS) |
| AC_SUBST(DCFG_HAVE_64BIT_ATOMICS) |
| ]) |