From patchwork Fri Jan 18 16:08:43 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steve Ellcey X-Patchwork-Id: 31108 Received: (qmail 37644 invoked by alias); 18 Jan 2019 16:08:56 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 37620 invoked by uid 89); 18 Jan 2019 16:08:55 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-27.6 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 spammy=UD:math.h, mathh, scanner, mathvectorh X-HELO: mx0b-0016f401.pphosted.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h=from : to : cc : subject : date : message-id : content-type : mime-version; s=pfpt0818; bh=8tJeiVc4SsnWDUL1Nt3YRxiQarUJ/7zTpG5PQ+zBvwo=; b=e31rAlRe4axUJTqgKUul+axx+dp5r1U6/jsMeNsalxXU+Jl/TLkF+Elws0/NJM0rtLPl JIdkeJsMqeHplrJxtEUKK9THT7qHle/upeB+Aqf9su10DRczF+ppZ3dws4NmfC2GLFZv d1bnhBYzCs7wwSr4S4GGSobVJQ8RqlUMrHEd/b8VhclxU9JQDy297EmyqNiwpxclJpgG e9KQIuM+CkVgyL8Dh2kKlOAni8Ilg3TCC9jAwOt+vA1bFjKQnewnyYNP9XRdlH9ZX9WG OyhAymNDMTrG2vcTncFhgI7R1ageUJJqSUBc9+7gO2u0sEfIeULJcfhX5tcNsca+QNRl LQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.onmicrosoft.com; s=selector1-marvell-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=8tJeiVc4SsnWDUL1Nt3YRxiQarUJ/7zTpG5PQ+zBvwo=; b=tz7aF1opmEsfayZDzoSfpNmnr/SBUAN/nBh4q/hYXG95fTv7nAmUX4jt7jdrx4xcQOwcZ9y065R1/9EQciSZbqMN67TtoV8WkcdpS8BT8skW1imvdji5aFDG/ciPmIo8gcUClIRPkHeAzL3i/gKfKQvqaY/ZG6EeN/gMHKYRyJQ= From: Steve Ellcey To: "libc-alpha@sourceware.org" CC: "mliska@suse.cz" Subject: Building math-vector-fortran.h in glibc Date: Fri, 18 Jan 2019 16:08:43 +0000 Message-ID: received-spf: None (protection.outlook.com: marvell.com does not designate permitted sender hosts) MIME-Version: 1.0 X-Proofpoint-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1011 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1810050000 definitions=main-1901180115 Martin, I have been working with libmvec on aarch64 and I took your glibc script to create math-vector-fortran.h and incorporated it into the glibc math Makefile to try it out. The patch is attached to this email. The main thing I noticed is that your script was specifically grepping for __DECL_SIMD_x86_64 and when I created a math-vector.h file for Aarch64 I used __DECL_SIMD_AARCH64 so I had to change the script. I don't think we want a different script for each target so we need to find some way to deal with this. Either use a common name on all platforms, which I think is OK since this should be an internal macro name that is not used by end users or find a way to generalize the match regardless of the name. The other thought I had was, instead of scanning math-vector.h, have the script preprocess math.h itself and then look for simd attributes after preprocessing. I think that would make the scanner more complex though. Steve Ellcey sellcey@marvell.com diff --git a/math/Makefile b/math/Makefile index 76e8eda..13d4496 100644 --- a/math/Makefile +++ b/math/Makefile @@ -30,6 +30,10 @@ 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 += math-vector-fortran.h +generated += math-vector-fortran.h +endif # FPU support code. aux := setfpucw fpu_control @@ -220,6 +224,10 @@ $(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)math-vector-fortran.h: + cat $(math_vector_header) | $(PYTHON) gen-fortran-math-vector.py > $(objpfx)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