diff --git a/math/Makefile b/math/Makefile index 76e8eda..480f85f 100644 --- a/math/Makefile +++ b/math/Makefile @@ -30,6 +30,11 @@ headers := math.h bits/mathcalls.h bits/mathinline.h \ bits/flt-eval-method.h bits/fp-fast.h bits/fp-logb.h \ bits/long-double.h bits/mathcalls-helper-functions.h \ bits/floatn.h bits/floatn-common.h bits/mathcalls-narrow.h +ifeq ($(build-mathvec),yes) +headers += finclude/math-vector-fortran.h +generated += finclude/math-vector-fortran.h +generated-dirs += finclude +endif # FPU support code. aux := setfpucw fpu_control @@ -220,6 +225,11 @@ $(inst_libdir)/libm.a: $(common-objpfx)format.lds \ echo 'GROUP ( $(libdir)/libm-$(version).a $(libdir)/libmvec.a )' \ ) > $@.new mv -f $@.new $@ + +math_vector_header = $(wildcard $(sysdirs:%=%/bits/math-vector.h)) +$(objpfx)finclude/math-vector-fortran.h: + $(make-target-directory) + cat $(math_vector_header) | $(PYTHON) gen-fortran-math-vector.py > $(objpfx)finclude/math-vector-fortran.h endif # Rules for the test suite. diff --git a/math/gen-fortran-math-vector.py b/math/gen-fortran-math-vector.py index e69de29..0fc6c4a 100644 --- a/math/gen-fortran-math-vector.py +++ b/math/gen-fortran-math-vector.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python3 + +import fileinput + +# sample declarations: +# define __DECL_SIMD_cos __DECL_SIMD_AARCH64 + +for line in fileinput.input(): + parts = [x for x in line.strip().split(' ') if x] + s = '__DECL_SIMD_' + if (len(parts) == 4 and parts[1] == 'define' + and parts[-1] == '__DECL_SIMD_AARCH64'): + fn = parts[2] + assert fn.startswith(s) + fn =fn[len(s):] + print('!GCC$ builtin (%s) attributes simd (notinbranch)' % fn) diff --git a/sysdeps/aarch64/fpu/bits/math-vector.h b/sysdeps/aarch64/fpu/bits/math-vector.h index e69de29..0b271ee 100644 --- a/sysdeps/aarch64/fpu/bits/math-vector.h +++ b/sysdeps/aarch64/fpu/bits/math-vector.h @@ -0,0 +1,75 @@ +/* Platform-specific SIMD declarations of math functions. + Copyright (C) 2018 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library 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. + + The GNU C Library 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 the GNU C Library; if not, see + . */ + +#ifndef _MATH_H +# error "Never include directly;\ + include instead." +#endif + +/* Get default empty definitions for simd declarations. */ +#include + +#if defined __FAST_MATH__ +# if defined _OPENMP && _OPENMP >= 201307 +/* OpenMP case. */ +# define __DECL_SIMD_AARCH64 _Pragma ("omp declare simd notinbranch") +# elif __GNUC_PREREQ (6,0) +/* W/o OpenMP use GCC 6.* __attribute__ ((__simd__)). */ +# define __DECL_SIMD_AARCH64 __attribute__ ((__simd__ ("notinbranch"))) +# endif + +# ifdef __DECL_SIMD_AARCH64 +# undef __DECL_SIMD_cos +# define __DECL_SIMD_cos __DECL_SIMD_AARCH64 +# undef __DECL_SIMD_cosf +# define __DECL_SIMD_cosf __DECL_SIMD_AARCH64 +# undef __DECL_SIMD_exp +# define __DECL_SIMD_exp __DECL_SIMD_AARCH64 +# undef __DECL_SIMD_expf +# define __DECL_SIMD_expf __DECL_SIMD_AARCH64 +# undef __DECL_SIMD_exp2 +# define __DECL_SIMD_exp2 __DECL_SIMD_AARCH64 +# undef __DECL_SIMD_exp2f +# define __DECL_SIMD_exp2f __DECL_SIMD_AARCH64 +# undef __DECL_SIMD_exp10 +# define __DECL_SIMD_exp10 __DECL_SIMD_AARCH64 +# undef __DECL_SIMD_exp10f +# define __DECL_SIMD_exp10f __DECL_SIMD_AARCH64 +# undef __DECL_SIMD_log +# define __DECL_SIMD_log __DECL_SIMD_AARCH64 +# undef __DECL_SIMD_logf +# define __DECL_SIMD_logf __DECL_SIMD_AARCH64 +# undef __DECL_SIMD_log2 +# define __DECL_SIMD_log2 __DECL_SIMD_AARCH64 +# undef __DECL_SIMD_log2f +# define __DECL_SIMD_log2f __DECL_SIMD_AARCH64 +# undef __DECL_SIMD_log10 +# define __DECL_SIMD_log10 __DECL_SIMD_AARCH64 +# undef __DECL_SIMD_log10f +# define __DECL_SIMD_log10f __DECL_SIMD_AARCH64 +# undef __DECL_SIMD_pow +# define __DECL_SIMD_pow __DECL_SIMD_AARCH64 +# undef __DECL_SIMD_powf +# define __DECL_SIMD_powf __DECL_SIMD_AARCH64 +# undef __DECL_SIMD_sin +# define __DECL_SIMD_sin __DECL_SIMD_AARCH64 +# undef __DECL_SIMD_sinf +# define __DECL_SIMD_sinf __DECL_SIMD_AARCH64 +# endif + +#endif