Re: [PATCH] AArch64: Detect crc32 extension support from assembler

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Sep 26, 2016 at 2:17 PM, Alexander Graf <agraf@xxxxxxx> wrote:
> The used compiler may or may not be recent enough to recognize the
> crc32 extended cpu type. However, it does not really have to know about
> them either, since all we do is pass inline assembly instructions to
> the assembler.
>
> This patch moves the crc cpu extension detection from compiler based
> to assembler based, so that we can build optimized code even when the
> compiler does not know about the cpu type yet.
>
> Signed-off-by: Alexander Graf <agraf@xxxxxxx>
> ---
>  m4/ax_arm.m4                | 15 +++++++++++----
>  src/common/Makefile.am      |  2 +-
>  src/common/crc32c_aarch64.c |  3 +++
>  3 files changed, 15 insertions(+), 5 deletions(-)
>
> diff --git a/m4/ax_arm.m4 b/m4/ax_arm.m4
> index 37ea0aa..26b5258 100644
> --- a/m4/ax_arm.m4
> +++ b/m4/ax_arm.m4
> @@ -26,12 +26,19 @@ AC_DEFUN([AX_ARM_FEATURES],
>          AC_DEFINE(HAVE_NEON,,[Support NEON instructions])
>          AC_SUBST(ARM_NEON_FLAGS)
>        fi
> -      AX_CHECK_COMPILE_FLAG(-march=armv8-a+crc, ax_cv_support_crc_ext=yes, [])
> +
> +      AC_LANG_SAVE
> +      AC_LANG_CPLUSPLUS
> +      AC_CACHE_CHECK(whether the assembler supports crc extensions,
> +                     ax_cv_support_crc_ext, AC_TRY_COMPILE([
> +          #define CRC32CX(crc, value) __asm__("crc32cx %w[c], %w[c], %x[v]":[c]"+r"(crc):[v]"r"(value))
> +          asm(".arch_extension crc");
> +          unsigned int foo(unsigned int ret) {
> +              CRC32CX(ret, 0);
> +              return ret;
> +          }],[ foo(0); ], ax_cv_support_crc_ext=yes, []))
>        if test x"$ax_cv_support_crc_ext" = x"yes"; then
> -        ARM_ARCH_FLAGS="$ARM_ARCH_FLAGS+crc"
> -        ARM_CRC_FLAGS="-march=armv8-a+crc -DARCH_AARCH64"
>          AC_DEFINE(HAVE_ARMV8_CRC,,[Support ARMv8 CRC instructions])
> -        AC_SUBST(ARM_CRC_FLAGS)
>        fi
>          ARM_FLAGS="$ARM_ARCH_FLAGS $ARM_DEFINE_FLAGS"
>      ;;
> diff --git a/src/common/Makefile.am b/src/common/Makefile.am
> index 8b30eea..e92e51c 100644
> --- a/src/common/Makefile.am
> +++ b/src/common/Makefile.am
> @@ -144,7 +144,7 @@ noinst_LTLIBRARIES += libcommon_crc.la
>
>  if HAVE_ARMV8_CRC
>  libcommon_crc_aarch64_la_SOURCES = common/crc32c_aarch64.c
> -libcommon_crc_aarch64_la_CFLAGS = $(AM_CFLAGS) $(ARM_CRC_FLAGS)
> +libcommon_crc_aarch64_la_CFLAGS = $(AM_CFLAGS) $(ARM_ARCH_FLAGS)
>  LIBCOMMON_DEPS += libcommon_crc_aarch64.la
>  noinst_LTLIBRARIES += libcommon_crc_aarch64.la
>  endif
> diff --git a/src/common/crc32c_aarch64.c b/src/common/crc32c_aarch64.c
> index d33827d..d2be6dd 100644
> --- a/src/common/crc32c_aarch64.c
> +++ b/src/common/crc32c_aarch64.c
> @@ -2,6 +2,9 @@
>  #include "include/int_types.h"
>  #include "common/crc32c_aarch64.h"
>
> +/* Request crc extension capabilities from the assembler */
> +asm(".arch_extension crc");
> +
>  #define CRC32CX(crc, value) __asm__("crc32cx %w[c], %w[c], %x[v]":[c]"+r"(crc):[v]"r"(value))
>  #define CRC32CW(crc, value) __asm__("crc32cw %w[c], %w[c], %w[v]":[c]"+r"(crc):[v]"r"(value))
>  #define CRC32CH(crc, value) __asm__("crc32ch %w[c], %w[c], %w[v]":[c]"+r"(crc):[v]"r"(value))

Hi Alexander,

We've been working on switching to cmake and actually ripped autotools
out of master a couple of weeks ago, so this won't apply.  Also, github
pull requests are preferred for everything but the kernel client - less
work for the reviewers.

Thanks,

                Ilya
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [CEPH Users]     [Ceph Large]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux