#
# 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)
])
