dnl Copyright (C) 2008 Vincent Torri <vtorri at univ-evry dot fr>
dnl That code is public domain and can be freely used or copied.

dnl Macro that check if several ASM instruction sets are available or not.

dnl Usage: EFL_CHECK_CPU_MMX([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
dnl Add -mmmx to EFL_SIMD_FLAGS if the compiler supports it and call AC_SUBST(EFL_SIMD_FLAGS)
dnl Define EFL_HAVE_MMX

AC_DEFUN([EFL_CHECK_CPU_MMX],
[
dnl configure option

AC_ARG_ENABLE([cpu-mmx],
   [AC_HELP_STRING([--disable-cpu-mmx], [disable mmx code @<:@default=enabled@:>@])],
   [
    if test "x${enableval}" = "xyes" ; then
       _efl_enable_cpu_mmx="yes"
    else
       _efl_enable_cpu_mmx="no"
    fi
   ],
   [_efl_enable_cpu_mmx="yes"])

AC_MSG_CHECKING([whether to build mmx code])
AC_MSG_RESULT([${_efl_enable_cpu_mmx}])

dnl check if the CPU is supporting MMX instruction sets

_efl_build_cpu_mmx="no"
if test "x${_efl_enable_cpu_mmx}" = "xyes" ; then
   case $host_cpu in
      i*86 | x86_64 | amd64)
         _efl_build_cpu_mmx="yes"
         ;;
   esac
fi

AC_MSG_CHECKING([whether mmx instructions set is available])
AC_MSG_RESULT([${_efl_build_cpu_mmx}])

dnl check if the compiler supports -mmmx

if test "x${_efl_build_cpu_mmx}" = "xyes" ; then
   SAVE_CFLAGS=${CFLAGS}
   CFLAGS="-mmmx"
   AC_LANG_PUSH([C])

   AC_COMPILE_IFELSE(
      [AC_LANG_PROGRAM([[]],
                       [[]])],
      [
       have_linker_option="yes"
       EFL_SIMD_FLAGS="${EFL_SIMD_FLAGS} -mmmx"],
      [have_linker_option="no"])

   AC_LANG_POP([C])
   CFLAGS=${SAVE_CFLAGS}

   AC_MSG_CHECKING([whether mmx linker option is supported])
   AC_MSG_RESULT([${have_linker_option}])
fi

AC_SUBST(EFL_SIMD_FLAGS)

if test "x${_efl_build_cpu_mmx}" = "xyes" ; then
   AC_DEFINE([EFL_HAVE_MMX], [1], [Define to mention that MMX is supported])
fi

AS_IF([test "x$_efl_build_cpu_mmx" = "xyes"], [$1], [$2])
])

dnl Usage: EFL_CHECK_CPU_SSE([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
dnl Add -msse to EFL_SIMD_FLAGS if the compiler supports it and call AC_SUBST(EFL_SIMD_FLAGS)
dnl Define EFL_HAVE_SSE

AC_DEFUN([EFL_CHECK_CPU_SSE],
[
dnl configure option

AC_ARG_ENABLE([cpu-sse],
   [AC_HELP_STRING([--disable-cpu-sse], [disable sse code @<:@default=enabled@:>@])],
   [
    if test "x${enableval}" = "xyes" ; then
       _efl_enable_cpu_sse="yes"
    else
       _efl_enable_cpu_sse="no"
    fi
   ],
   [_efl_enable_cpu_sse="yes"])

AC_MSG_CHECKING([whether to build sse code])
AC_MSG_RESULT([${_efl_enable_cpu_sse}])

dnl check if the CPU is supporting SSE instruction sets

_efl_build_cpu_sse="no"
if test "x${_efl_enable_cpu_sse}" = "xyes" ; then
   case $host_cpu in
      i*86 | x86_64 | amd64)
         _efl_build_cpu_sse="yes"
         ;;
   esac
fi

AC_MSG_CHECKING([whether sse instructions set is available])
AC_MSG_RESULT([${_efl_build_cpu_sse}])

dnl check if the compiler supports -msse

if test "x${_efl_build_cpu_sse}" = "xyes" ; then
   SAVE_CFLAGS=${CFLAGS}
   CFLAGS="-msse"
   AC_LANG_PUSH([C])

   AC_COMPILE_IFELSE(
      [AC_LANG_PROGRAM([[]],
                       [[]])
      ],
      [
       have_linker_option="yes"
       EFL_SIMD_FLAGS="${EFL_SIMD_FLAGS} -msse"
      ],
      [have_linker_option="no"])

   AC_LANG_POP([C])
   CFLAGS=${SAVE_CFLAGS}

   AC_MSG_CHECKING([whether sse linker option is supported])
   AC_MSG_RESULT([${have_linker_option}])
fi

AC_SUBST(EFL_SIMD_FLAGS)

if test "x${_efl_build_cpu_sse}" = "xyes" ; then
   AC_DEFINE([EFL_HAVE_SSE], [1], [Define to mention that SSE is supported])
fi

AS_IF([test "x$_efl_build_cpu_sse" = "xyes"], [$1], [$2])
])

dnl Usage: EFL_CHECK_CPU_SSE2([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
dnl Add -msse2 to EFL_SIMD_FLAGS if the compiler supports it and call AC_SUBST(EFL_SIMD_FLAGS)
dnl Define EFL_HAVE_SSE2

AC_DEFUN([EFL_CHECK_CPU_SSE2],
[

dnl configure option

AC_ARG_ENABLE([cpu-sse2],
   [AC_HELP_STRING([--disable-cpu-sse2], [disable sse2 code @<:@default=enabled@:>@])],
   [
    if test "x${enableval}" = "xyes" ; then
       _efl_enable_cpu_sse2="yes"
    else
       _efl_enable_cpu_sse2="no"
    fi
   ],
   [_efl_enable_cpu_sse2="yes"])

AC_MSG_CHECKING([whether to build sse2 code])
AC_MSG_RESULT([${_efl_enable_cpu_sse2}])

dnl check if the CPU is supporting SSE2 instruction sets

_efl_build_cpu_sse2="no"
if test "x${_efl_enable_cpu_sse2}" = "xyes" ; then
   case $host_cpu in
      i*86 | x86_64 | amd64)
         _efl_build_cpu_sse2="yes"
         ;;
   esac
fi

AC_MSG_CHECKING([whether sse2 instructions set is available])
AC_MSG_RESULT([${_efl_build_cpu_sse2}])

dnl check if the compiler supports -msse2

if test "x${_efl_build_cpu_sse2}" = "xyes" ; then
   SAVE_CFLAGS=${CFLAGS}
   CFLAGS="-msse2"
   AC_LANG_PUSH([C])

   AC_COMPILE_IFELSE(
      [AC_LANG_PROGRAM([[]],
                       [[]])
      ],
      [
       have_linker_option="yes"
       EFL_SIMD_FLAGS="${EFL_SIMD_FLAGS} -msse2"
      ],
      [have_linker_option="no"])

   AC_LANG_POP([C])
   CFLAGS=${SAVE_CFLAGS}

   AC_MSG_CHECKING([whether sse2 linker option is supported])
   AC_MSG_RESULT([${have_linker_option}])
fi

AC_SUBST(EFL_SIMD_FLAGS)

if test "x${_efl_build_cpu_sse2}" = "xyes" ; then
   AC_DEFINE([EFL_HAVE_SSE2], [1], [Define to mention that SSE2 is supported])
fi

AS_IF([test "x$_efl_build_cpu_sse2" = "xyes"], [$1], [$2])
])

dnl Usage: EFL_CHECK_CPU_ALTIVEC([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
dnl Add -faltivec or -maltivec to EFL_SIMD_FLAGS if the compiler supports it and
dnl call AC_SUBST(EFL_SIMD_FLAGS)
dnl Define EFL_HAVE_ALTIVEC

AC_DEFUN([EFL_CHECK_CPU_ALTIVEC],
[

dnl configure option

AC_ARG_ENABLE([cpu-altivec],
   [AC_HELP_STRING([--disable-cpu-altivec], [disable altivec code @<:@default=enabled@:>@])],
   [
    if test "x${enableval}" = "xyes" ; then
       _efl_enable_cpu_altivec="yes"
    else
       _efl_enable_cpu_altivec="no"
    fi
   ],
   [_efl_enable_cpu_altivec="yes"]
)
AC_MSG_CHECKING([whether to build altivec code])
AC_MSG_RESULT([${_efl_enable_cpu_altivec}])

dnl check if the CPU is supporting ALTIVEC instruction sets

_efl_build_cpu_altivec="no"
if test "x${_efl_enable_cpu_altivec}" = "xyes" ; then
   case $host_cpu in
      *power* | *ppc*)
         _efl_build_cpu_altivec="yes"
         ;;
   esac
fi

AC_MSG_CHECKING([whether altivec instructions set is available])
AC_MSG_RESULT([${_efl_build_cpu_altivec}])

dnl check if the compiler supports -faltivec or -maltivec and
dnl if altivec.h is available.

_efl_have_faltivec="no"
if test "x${_efl_build_cpu_altivec}" = "xyes" ; then
   SAVE_CFLAGS=${CFLAGS}
   CFLAGS="-faltivec"
   AC_LANG_PUSH([C])

   AC_COMPILE_IFELSE(
      [AC_LANG_PROGRAM([[
#include <altivec.h>
                       ]],
                       [[]])],
      [_efl_have_faltivec="yes"
       _efl_altivec_flag="-faltivec"],
      [_efl_have_faltivec="no"])

   if test "x${_efl_have_faltivec}" = "xno" ; then
      CFLAGS="-maltivec"

      AC_COMPILE_IFELSE(
         [AC_LANG_PROGRAM([[
#include <altivec.h>
                          ]],
                          [[]])],
         [_efl_have_faltivec="yes"
          _efl_altivec_flag="-maltivec"],
         [_efl_have_faltivec="no"])
   fi

   AC_LANG_POP([C])
   CFLAGS=${SAVE_CFLAGS}

   AC_MSG_CHECKING([whether altivec linker option is supported])
   AC_MSG_RESULT([${_efl_have_faltivec}])
fi

EFL_SIMD_FLAGS="${EFL_SIMD_FLAGS} ${_efl_altivec_flag}"
AC_SUBST(EFL_SIMD_FLAGS)

if test "x${_efl_have_faltivec}" = "xyes" ; then
   AC_DEFINE([EFL_HAVE_ALTIVEC], [1], [Define to mention that ALTIVEC is supported])
fi

AS_IF([test "x$_efl_have_faltivec" = "xyes"], [$1], [$2])
])

dnl Usage: EFL_CHECK_CPU_NEON([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
dnl Add -mneon to EFL_SIMD_FLAGS if the compiler supports it and call AC_SUBST(EFL_SIMD_FLAGS)
dnl Define EFL_HAVE_NEON

AC_DEFUN([EFL_CHECK_CPU_NEON],
[
dnl configure option

AC_ARG_ENABLE([cpu-neon],
   [AC_HELP_STRING([--disable-cpu-neon], [disable neon code @<:@default=enabled@:>@])],
   [
    if test "x${enableval}" = "xyes" ; then
       _efl_enable_cpu_neon="yes"
    else
       _efl_enable_cpu_neon="no"
    fi
   ],
   [_efl_enable_cpu_neon="yes"])

AC_MSG_CHECKING([whether to build neon code])
AC_MSG_RESULT([${_efl_enable_cpu_neon}])

dnl check if the CPU is supporting NEON instruction sets

_efl_build_cpu_neon="no"
if test "x${_efl_enable_cpu_neon}" = "xyes" ; then
   case $host_cpu in
      armv7*)
         _efl_build_cpu_neon="yes"
         ;;
   esac
fi

AC_MSG_CHECKING([whether neon instructions set is available])
AC_MSG_RESULT([${_efl_build_cpu_neon}])

if test "x${_efl_build_cpu_neon}" = "xyes" ; then
   AC_DEFINE([EFL_HAVE_NEON], [1], [Define to mention that NEON is supported])
fi

AS_IF([test "x$_efl_build_cpu_neon" = "xyes"], [$1], [$2])
])

dnl End of efl_cpu.m4