From b7b17ed66e199afc7246e642bf3b35c3f8eca217 Mon Sep 17 00:00:00 2001 From: Janne Grunau Date: Tue, 10 Dec 2013 20:13:32 +0100 Subject: aarch64: add cpuflags support for NEON and VFP NEON and VFP are currently mandatory for all ARMv8 profiles. Both are handled as extensions as far as cpuflags are concerned. This is consistent with handling x86_64 which always has SSE2, but still handles it as an extension. --- libavutil/aarch64/Makefile | 1 + libavutil/aarch64/asm.S | 63 ++++++++++++++++++++++++++++++++++++++++++++++ libavutil/aarch64/cpu.c | 27 ++++++++++++++++++++ libavutil/aarch64/cpu.h | 29 +++++++++++++++++++++ 4 files changed, 120 insertions(+) create mode 100644 libavutil/aarch64/Makefile create mode 100644 libavutil/aarch64/asm.S create mode 100644 libavutil/aarch64/cpu.c create mode 100644 libavutil/aarch64/cpu.h (limited to 'libavutil/aarch64') diff --git a/libavutil/aarch64/Makefile b/libavutil/aarch64/Makefile new file mode 100644 index 0000000000..13d26a1520 --- /dev/null +++ b/libavutil/aarch64/Makefile @@ -0,0 +1 @@ +OBJS += aarch64/cpu.o diff --git a/libavutil/aarch64/asm.S b/libavutil/aarch64/asm.S new file mode 100644 index 0000000000..94e5a84583 --- /dev/null +++ b/libavutil/aarch64/asm.S @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2008 Mans Rullgard + * + * This file is part of Libav. + * + * Libav is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libav is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Libav; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "config.h" + +#ifdef __ELF__ +# define ELF +#else +# define ELF // +#endif + +.macro function name, export=0, align=2 + .macro endfunc +ELF .size \name, . - \name + .endfunc + .purgem endfunc + .endm + .text + .align \align + .if \export + .global EXTERN_ASM\name +EXTERN_ASM\name: + .endif +ELF .type \name, %function + .func \name +\name: +.endm + +.macro const name, align=2 + .macro endconst +ELF .size \name, . - \name + .purgem endconst + .endm + .section .rodata + .align \align +\name: +.endm + +.macro movrel rd, val +#if CONFIG_PIC + adrp \rd, #:pg_hi21:\val + add \rd, \rd, #:lo12:\val +#else + ldr \rd, =\val +#endif +.endm diff --git a/libavutil/aarch64/cpu.c b/libavutil/aarch64/cpu.c new file mode 100644 index 0000000000..2cc2ccd9ef --- /dev/null +++ b/libavutil/aarch64/cpu.c @@ -0,0 +1,27 @@ +/* + * This file is part of Libav. + * + * Libav is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libav is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Libav; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libavutil/cpu.h" +#include "libavutil/cpu_internal.h" +#include "config.h" + +int ff_get_cpu_flags_aarch64(void) +{ + return AV_CPU_FLAG_NEON * HAVE_NEON | + AV_CPU_FLAG_VFP * HAVE_VFP; +} diff --git a/libavutil/aarch64/cpu.h b/libavutil/aarch64/cpu.h new file mode 100644 index 0000000000..704df48b85 --- /dev/null +++ b/libavutil/aarch64/cpu.h @@ -0,0 +1,29 @@ +/* + * This file is part of Libav. + * + * Libav is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libav is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Libav; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_AARCH64_CPU_H +#define AVUTIL_AARCH64_CPU_H + +#include "config.h" +#include "libavutil/cpu.h" +#include "libavutil/cpu_internal.h" + +#define have_neon(flags) CPUEXT(flags, NEON) +#define have_vfp(flags) CPUEXT(flags, VFP) + +#endif /* AVUTIL_AARCH64_CPU_H */ -- cgit v1.2.3